Как загрузить Gameobject из Json?Возможно ли это?

#c# #ios #unity3d

#c# #iOS #unity3d

Вопрос:

Я пытаюсь сохранить положение, поворот и масштабирование объекта.Наряду с этим, могу ли я сохранить сам Gameobject внутри json.Я сохранил файл JSON в Application.persistentDataPath.Ниже приведен мой класс datahandler

   using System;
  using UnityEngine;

[Serializable]
public class DataHandlers

{
public Vector3 localposinmap;
public Quaternion localrotinmap;
public Vector3 sizeofobj;
public GameObject gameobj;

public DataHandlers(Vector3 localpos, Quaternion localrot, Vector3 objsize,GameObject gobj)

{
    this.localposinmap = localpos;
    this.localrotinmap = localrot;
    this.sizeofobj = objsize;
    this.gameobj = gobj;

}


}
  

После сохранения файла моя строка JSON выглядит следующим образом

 {

"SaveValues": [
{
  "localposinmap": {
    "x": 0.0237075537443161,
    "y": -0.27374106645584106,
    "z": -0.6681503057479858
  },
  "localrotinmap": {
    "x": 0,
    "y": -0.08031735569238663,
    "z": 0,
    "w": -0.996769368648529
  },
  "sizeofobj": {
    "x": 1,
    "y": 1,
    "z": 1
  },
  "gameobj": {
    "m_FileID": -112,
    "m_PathID": 0
  }
},
{
  "localposinmap": {
    "x": 0.09054452180862427,
    "y": -0.273919016122818,
    "z": -0.5062751770019531
  },
  "localrotinmap": {
    "x": 0.0001220703125,
    "y": 0.06480370461940765,
    "z": 0,
    "w": -0.9978980422019958
  },
  "sizeofobj": {
    "x": 1,
    "y": 1,
    "z": 1
  },
  "gameobj": {
    "m_FileID": -456,
    "m_PathID": 0
  }
}
 ]
}
  

После прочтения gameobj: «m_FileID»:-456 и «m_PathID»:0
Могу ли я прочитать это значение обратно и создать экземпляр того же Gameobject, используя приведенные выше сведения?

Комментарии:

1. Вы имеете в виду создание сетки? Если да, вы не можете этого сделать с этой информацией

Ответ №1:

Вы можете использовать JsonUtility.ToJson для преобразования вашего объекта в строку json и JsonUtility.FromJson для получения его обратно. Проверьте документы Unity для получения дополнительной информации. Имейте в виду:

Поддерживаются только простые классы и структуры; классы, производные от UnityEngine.Объект (такой как MonoBehaviour или ScriptableObject) не является.

Комментарии:

1. И если вы хотите получить лучшие результаты, чем те, что предоставляет JsonUtility, используйте Json Dot Net, который позволит вам настраивать собственные конвертеры.

2. Я согласен с @Draco18s, но для этого требуется добавление внешней библиотеки.

3. Ну, да. Но я не понимаю, почему это проблема. JsonUtility очень прост и не может обрабатывать определенные типы сценариев, такие как сериализация чего-то вроде одноэлементной ссылки (подумайте о том, как Minecraft сохраняет информацию о блоке и элементе: в виде строкового ключа в реестре). JsonUtility бездумно сериализует этот синглтон тысячи раз (и вообще не десериализует, потому что синглтон уже существует).

4. @Dave Вы имеете в виду, что классы движка Unity не поддерживаются?… но здесь я пытаюсь сохранить vector3 и quaternion, которые сохраняются. Также Gameobject IDs.So если я знаю путь (он добавлен в массив Gameobject), где находится gameobject, могу ли я загрузить его обратно, используя приведенную выше информацию, то есть … gameobj»: { «m_FileID»: -456, «m_PathID»: 0 }

5. Да, некоторые объекты unity, такие как Vector3 или Quaternion, не сериализуемы в Unity. В случае этих объектов вы можете создать свои собственные простые классы, такие как SerializableVector3 и SerializableQuaternion. Проверьте это обсуждение на форуме . Как вы создаете эту строку JSON? Вашим собственным методом? Если это так, вам действительно следует перейти на JsonUtility или даже лучше, как упоминал @Draco18s Json.NET.