微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Unity中保存/加载数据

如何解决在Unity中保存/加载数据

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

要保存的示例类:

[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.FromJson和之间的区别JsonUtility.FromJsonOverwrite

JsonUtility.FromJson从Json创建新的Object并返回它。它分配内存。

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

JsonUtility.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);
}

解决方法

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

[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;
}

并且我运行脚本会给我一个反序列化错误,我将其完全理解为当我将反序列化文件转换为新类“ Saved”时,我添加的新变量不存在,这给了我错误。

我在商店中修复资产时发现了此错误,我知道一个解决方法就是更改文件名,以便创建一个新文件,但我不只是想要擦除以前保存的内容。

所以我的问题是,如果我想向序列化的类添加更多变量,如果人们要更新资产,我将如何捕获并适应它的旧版本?

谢谢!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。