我写了一个SaveLoad
类,其中包含一个Savegame
类,它有一串ints,double,bools,还有一些更复杂的东西,比如自写的类对象数组。Unity/C#Savegame迁移
保存游戏对象正在创建,序列化和AES保存加密,反之亦然加载 - 迄今为止,这么好。
我现在面临的问题是,如果有新的变量(在较新版本的游戏中)必须存储和加载,游戏在加载时崩溃,因为新变量无法加载正确(因为它们不包含在旧的保存文件中)。例如。 ints和double包含默认的0,而数组未初始化,因此为null。
我目前的“解决方案”:对于每个正在加载的变量,检查它是否不包含特定的值(我在Savegame
类中设置)。 例如:在Savegame
我设置
public int myInt = int.MinValue;
,当加载,我检查:
if(savegame.myInt != int.MinValue){
//load successful
}else{
//load failed
};
到目前为止是这种用于int和double,但一旦我打的第一布尔,我意识到,对于每个变量,我必须找到一个“没有意义”(通常不可达)的值,因此是一个失败的负载。 =>对于布尔的低劣方法。
现在我可以继续前进,将所有的bool为int,但这变丑...
必须有一个更清洁和/或更聪明地解决了这个。也许某种存储游戏迁移器?如果有一个很好的免费插件,这对我来说也可以,但我更喜欢代码解决方案,这对于其他类似问题的人可能也更有帮助。
在此先感谢! :)
保存和加载数据已在此回答了很多次网站上的新问题应标记为重复。使用[JsonUtility]将数据转换为Json(http://stackoverflow.com/questions/36239705/deserialization-of-json-using-minijson-in-unity-c-sharp/36244111#36244111),使用AES对其进行加密然后用[PlayerPrefs](https://docs.unity3d.com/ScriptReference/PlayerPrefs.html)保存。加载数据时,请执行后面提到的步骤。而已。 – Programmer
我已阅读了多篇文章。他们没有详细讨论如何处理旧的保存文件。这里的问题不是保存和加载本身,而是特别处理旧的保存文件以避免造成任何问题。 – Tavados
首先问问自己:游戏的新版本应该能够读取过时的保存文件吗?如果是,则决定处理该问题的逻辑,然后在代码中实现该逻辑。一个例子可能是“如果某个值不存在,则将其初始化为默认状态(0,emptylist,dollars.None等)。 –