【发布时间】:2020-07-21 14:03:27
【问题描述】:
这是我要序列化的类:
System.Serializable]
public class Save
{
public int turn, player;
public int build, attack, action;
public double resource, resourceProd;
public List<ObjectData> objectsData = new List<ObjectData>();
public Save(GameObject[] saveBuilding, GameObject[] saveUnit, int turn, int player, int build, int attack, int action, double resource, double resourceProd)
{
foreach(GameObject building in saveBuilding)
{
ObjectData data = new ObjectData();
data.position = building.transform.position;
data.building = building.GetComponent<Building>();
data.path = data.building.type[0] + data.building.level + data.building.branch;
objectsData.Add(data);
}
foreach(GameObject unit in saveUnit)
{
ObjectData data = new ObjectData();
data.position = unit.transform.position;
data.unit = unit.GetComponent<Unit>();
data.path = data.unit.type[0] + data.unit.level + data.unit.branch;
objectsData.Add(data);
}
this.turn = turn;
this.player = player;
this.build = build;
this.attack = attack;
this.action = action;
this.resource = resource;
this.resourceProd = resourceProd;
Debug.Log(objectsData.Count);
}
}
public class ObjectData
{
public Vector3 position;
public Building building;
public Unit unit;
public string path;
}
当我用下面的方法创建它的一个实例时,objectsData 中有两个元素根据Debug.Log(objectsData.Count);。
public static void SaveTurn()
{
turnSave = new Save(GameObject.FindGameObjectsWithTag("building"), GameObject.FindGameObjectsWithTag("unit"), turnCourt, Players.player, BuildDisplay.maxBuildAction, Attacking.maxAttackAction, Building.actions, Currency.resource, Building.totalprod);
solution.Add(JsonUtility.ToJson(turnSave));
Debug.Log(JsonUtility.ToJson(turnSave));
}
当我尝试加载时,保存 Debug.Log(save.objectsData); 返回 null。
为什么会这样?
public static void LoadSave(string saves)
{
Save save = JsonUtility.FromJson<Save>(saves);
Currency.resource = save.resource;
Building.totalprod = save.resourceProd;
BuildDisplay.maxBuildAction = save.build;
Attacking.maxAttackAction = save.attack;
Building.actions = save.action;
Debug.Log(save.objectsData);
LoadObjects(save.objectsData);
RemoveObjects(GameObject.FindGameObjectsWithTag("building"));
RemoveObjects(GameObject.FindGameObjectsWithTag("unit"));
Turn.refresh();
}
public static void LoadObjects(List<ObjectData> gameObjects)
{
Debug.Log(gameObjects.Count);
foreach(ObjectData gameObject in gameObjects)
{
GameObject Prefab = Resources.Load(gameObject.path) as GameObject;
if(gameObject.building != null)
{
Building building = Prefab.GetComponent<Building>();
building = gameObject.building;
}
if(gameObject.unit != null)
{
Unit unit = Prefab.GetComponent<Unit>();
unit = gameObject.unit;
}
Instantiate(Prefab);
}
}
在使所有涉及的类可序列化后,Debug.Log(save.objectsData); 不再返回 null,Debug.Log(gameObjects.Count); 返回 2,但在 Building building = Prefab.GetComponent<Building>(); 处出现 null 异常,即使 Prefab 上有 Building 脚本。
【问题讨论】:
-
您的
ObjectData不是[Serializable]...然后请注意,序列化引用是不可能的/没有意义。Unit和Building是Components,它们的数据可以/不会被序列化 -
Unit 和 Building 不是各自类的实例,为什么我不能使它们 [Serializable]?
-
因为这两个是
MonoBehaviour,它继承自Object,它始终仅作为参考处理和序列化。相同,例如如果你有一个GameObject字段。但是,您唯一可以做的就是再次使用 JSON 来完全序列化该组件的所有字段,并在反序列化时覆盖 JSON 中的字段值