gpt4 book ai didi

c# - 在 Unity 中保存/加载数据

转载 作者:太空狗 更新时间:2023-10-29 20:51:13 26 4
gpt4 key购买 nike

我一直在 Unity 中保存和加载,我在其中将序列化类保存到文件中。我有一个可序列化的类:

[Serializable]
class Save
{
public List<int> ID = new List<int>();
public List<int> Amounts = new List<int>();
}

并将其保存到文件 A-OK。我可以毫无错误地加载它,但如果我想稍后添加:

[Serializable]
class Save
{
public List<int> ID = new List<int>();
public List<int> Amounts = new List<int>();
public int extra = 0;
}

然后我运行我的脚本,它给了我一个反序列化错误,我完全理解当我将反序列化文件转换到我的新类“已保存”时,我添加的新变量不存在,它给了我错误。

我在修复商店中的 Assets 时发现了这个错误,我知道一个修复方法可以只更改文件名以便创建一个新文件,但我不只是想删除之前保存的内容。

所以我的问题是,如果我想向我的序列化类添加更多变量,如果人们要更新 Assets ,我将如何捕捉并调整它的旧版本?

谢谢!

最佳答案

此问题在使用 C# 序列化程序时已知。使用 JsonUtility 将数据转换为 Json,然后使用 PlayerPrefs 保存它。加载时,使用 PlayerPrefs 加载,然后使用 JsonUtility 将 json 转换回类。

要保存的示例类:

[Serializable]
public class Save
{
public List<int> ID = new List<int>();
public List<int> Amounts = new List<int>();
public int extra = 0;
public float highScore = 0;
}

保存数据:

void Save()
{
Save saveData = new Save();
saveData.extra = 99;
saveData.highScore = 40;

//Convert to Json
string jsonData = JsonUtility.ToJson(saveData);
//Save Json string
PlayerPrefs.SetString("MySettings", jsonData);
PlayerPrefs.Save();
}

加载数据:

void Load()
{
//Load saved Json
string jsonData = PlayerPrefs.GetString("MySettings");
//Convert to Class
Save loadedData = JsonUtility.FromJson<Save>(jsonData);

//Display saved data
Debug.Log("Extra: " + loadedData.extra);
Debug.Log("High Score: " + loadedData.highScore);

for (int i = 0; i < loadedData.ID.Count; i++)
{
Debug.Log("ID: " + loadedData.ID[i]);
}
for (int i = 0; i < loadedData.Amounts.Count; i++)
{
Debug.Log("Amounts: " + loadedData.Amounts[i]);
}
}

JsonUtility.FromJsonJsonUtility.FromJsonOverwrite 的区别:

A.JsonUtility.FromJson 从 Json 创建新对象并返回它。它分配内存。

string jsonData = PlayerPrefs.GetString("MySettings");
//Convert to Class. FromJson creates new Save instance
Save loadedData = JsonUtility.FromJson<Save>(jsonData);

BJsonUtility.FromJsonOverwrite 创建新对象。它与向您的类添加更多数据类型无关。它只是覆盖传递给它的数据。这有利于节省内存和减少 GC。如果您有 arraystringList 等字段,它只会分配内存。

应该使用 JsonUtility.FromJsonOverwrite 的示例是在使用 Json 执行常量数据传输时。它将提高性能。

//Create Save instance **once** in the Start or Awake function
Save loadedData = null;
void Start()
{
//loadedData instance is created once
loadedData = new Save();
}

void Load()
{
string jsonData = PlayerPrefs.GetString("MySettings");
//Convert to Class but don't create new Save Object. Re-use loadedData and overwrite old data in it
JsonUtility.FromJsonOverwrite(jsonData, loadedData);
Debug.Log("High Score: " + loadedData.highScore);
}

关于c# - 在 Unity 中保存/加载数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40078490/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com