8-5. 序列化保存数据文件

安装 newtonsoftjson

newtonsoftjson 是一个比 JsonUtility 更好的 JSON 工具,但是 Unity Registry 没办法直接下载,需要点击 Package Manager 左上角的 + 号,点击 Add package from git URL,输入 com.unity.nuget.newtonsoft-json,进行安装

使用 newtonsoftjson 序列化和反序列化

使用 JsonConvert.SerializeObject 将对象序列化成 JSON 字符串,再通过 JsonConvert.DeserializeObject 将字符串反序列化为对象

存储文件

我们将数据保存到{Application.persistentDataPath}/SAVEDATA/目录下面,具体路径在哪里看官方文档

读取文件、写入文件、判断文件是否存在、创建目录,见下图

文件中有关公司名、产品名,可以在 Project Settings / Player 里面进行修改

调整执行顺序

我们需要调整 DataManager 的执行顺序,让它比其它更先执行,其它的执行顺序见 Project Settings 里面的 Script Execution Order

序列化 Vector3

Unity 自身的 Vector3 是不能进行序列化的,如果要进行序列化,就要使用SerializeVector3,代码如下

public class SerializeVector3
{
    public float x, y, z;

    public SerializeVector3()
    { }

    public SerializeVector3(float x, float y, float z)
    {
        this.x = x;
        this.y = y;
        this.z = z;
    }

    public SerializeVector3(Vector3 pos)
    {
        this.x = pos.x;
        this.y = pos.y;
        this.z = pos.z;
    }

    public Vector3 ToVector3()
    {
        return new Vector3(x, y, z);
    }
}

保存的数据结构

public class Data
{
    public string sceneToSave;

    public Dictionary<string, SerializeVector3> characterPosDict = new Dictionary<string, SerializeVector3>();
    public Dictionary<string, float> floatSavedData = new Dictionary<string, float>();

    public void SaveGameScene(GameSceneSO savedScene)
    {
        sceneToSave = JsonUtility.ToJson(savedScene);
        Debug.Log(sceneToSave);
    }

    public GameSceneSO GetSavedScene()
    {
        var newScene = ScriptableObject.CreateInstance<GameSceneSO>();
        JsonUtility.FromJsonOverwrite(sceneToSave, newScene);
        return newScene;
    }
}

项目相关代码

代码仓库:https://gitee.com/nbda1121440/2DAdventure.git

标签:20240229_1330

posted @ 2024-02-29 13:54  hellozjf  阅读(69)  评论(0编辑  收藏  举报