Unity3D 存档读档

Unity3D json 存档读档功能。

序列化

游戏存档通常是把存在于内存中的对象,通过序列化,把对象中的数据存储到文件中,实现数据的持久化。

游戏读档则是把文件中的数据,通过反序列化,重新生成内存中的对象。

存档的格式,一般使用 json 存储,也可以使用二进制、XML等。

存档

首先,需要安装一个 json 库,在 Package Manager 窗口中,搜索 Newtonsoft Json 进行安装。

也可以使用其他 json 库,Newtonsoft Json 的优点是可以很好地序列化字典。

接着,创建一个 GameData 类,标记为可序列化。

using System;

[Serializable]
public class GameData
{
    public int playerID;

    public GameData()
    {
        playerID = 100001;
    }
}

然后创建一个 DataManager 类,用来管理存档。

这里的 SavePath 添加了平台宏定义,如果是在 unity editor 中运行,就直接存储到 Assets 文件夹中,其他平台则是存储到可读写的数据目录中。

通过调用 JsonConvert.SerializeObject 方法,把 gameData 序列化成 json 字符串,再使用 StreamWriter 写入本地文件。

using System.IO;
using UnityEngine;
using Newtonsoft.Json;

public class DataManager : MonoBehaviour
{
    public GameData gameData;

    string SavePath
    {
        get
        {
#if UNITY_EDITOR
            return Application.dataPath + "/SaveData.json";
#else
            return Application.persistentDataPath + "/SaveData.json";
#endif            
        }
    }

    void Start()
    {
        Save();
    }

    public void Save()
    {
        string json = JsonConvert.SerializeObject(gameData);
        StreamWriter sw = new StreamWriter(SavePath);
        sw.Write(json);
        sw.Close();
    }
}

运行游戏之后,停止运行,刷新工程资源目录,可以看到 Assets 文件夹下多出了一个 SaveData.json 文件。

json 的内容如下:

{"playerID":100001}

读档

读档的时候,要先判断本地是否有存档文件,再进行文件的读取和反序列化,还原 gameData 数据对象。

public class DataManager : MonoBehaviour
{
    // ...
    
    public void Load()
    {
        if (File.Exists(SavePath))
        {
            StreamReader sr = new StreamReader(SavePath);
            string json = sr.ReadToEnd();
            sr.Close();
            gameData = JsonConvert.DeserializeObject<GameData>(json);
        }
    }
}

在游戏开始时,先读档,再修改数据对象,再次存档。

public class DataManager : MonoBehaviour
{
    // ...
    
    void Start()
    {
        Load();
        gameData.playerID = 100002;
        Save();
    }
    
    // ...
}

可以看到,json 的内容改变了。

{"playerID":100002}

数据对象扩展

目前 GameData 中只有一个 playerID,实际上可以再定义更多的数据类,统一放到 GameData 中作为成员字段。

例如,定义一个 DataPlayer 类,保存玩家的数据。

public class DataPlayer
{
    public int playerID;
    public string playerName;
    public int health;

    public DataPlayer()
    {
        playerID = 100001;
        playerName = "Player";
        health = 100;
    }
}

然后把 DataPlayer 放到 GameData 中,在构造函数中要记得实例化对象。

using System;

[Serializable]
public class GameData
{
    public DataPlayer dataPlayer;

    public GameData()
    {
        dataPlayer = new DataPlayer();
    }
}

游戏开始时,修改一下玩家名字,再存档。

public class DataManager : MonoBehaviour
{
    // ...
    
    void Start()
    {
        Load();
        gameData.dataPlayer.playerName = "起个名字很难";
        Save();
    }
    
    // ...
}

此时,json 的内容如下:

{
    "dataPlayer": {
        "playerID": 100001,
        "playerName": "起个名字很难",
        "health": 100
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值