这里只讲使用Newtonsoft.Json库将数据转换为Json格式存储到.sav文件中。
窗口 ==> 包管理器 ==> 左上角加号 ==> 按名称添加包 ==> 输入“com.unity.nuget.newtonsoft-json”

这样我们就可以在代码中使用了。
新建一个SaveLoadManager.cs脚本,这个脚本不需要挂载到场景中,我们可以写成静态类,由于需要操作文件我们需要调用System.IO,因此代码如下:

首先我们需要设计几个方法,保存数据的方法,读取数据的方法和判断该数据的文件是否存在的方法。我这里将每种数据分开文件存放。


jsonFolder变量定义了存储JSON文件的文件夹路径,使用了Application.persistentDataPath,确保数据在不同平台上都有一个合适的存储位置。

IsExistsData方法通过文件名检查指定文件是否存在,并返回布尔值。

Save方法保存数据到指定文件中。
检查并创建存储文件夹。
使用JsonConvert.SerializeObject将数据对象序列化为JSON格式并保存到文件。

Load方法从指定文件中加载数据。
检查文件是否存在,不存在则返回默认值。
读取文件内容并反序列化为指定类型的数据对象。
这里我们用了泛型,因为我们会存储不同类型的数据,当然也可以统一起来进行保存和读取,写法也需重新设计。
为了方便我们在编辑器中打开和删除保存的数据文件夹,我们可以写这样的代码:

需要注意的是,我们需要添加 using UnityEditor; 以使用编辑器的功能,并且我们要将SaveLoadManager中的jsonFolder变量的private关键字改为public,这样我们就能在SaveLoad类中使用读取到了。
这里加上开头的 #if UNITY_EDITOR 和结尾的 #endif 是因为存在编辑器功能代码时会打包失败,加入这个判断这块代码就只能在编辑器中运行。
有了这段代码,我们在编辑器的菜单栏可以看到编写的选项,包含了打开数据文件夹和删除该文件夹的功能。
新建一个Test.cs脚本,这个脚本我们可以挂载到场景对象上,假设我们有一个名为 items 的物品列表数据要存储:


[System.Serializable] 序列化该结构体,使其能够在编辑器中查看


这里添加了两个物品到列表中

调用了刚刚写的SaveLoadManager类中的方法
我们在 Start() 中判断这个数据文件是否存在,不存在就添加两个物品进去并保存,存在就直接读取。当我们运行后,就能使用菜单栏的选项打开保存的文件夹,并找到我们的数据。

我们可以改写其中的内容,比方说把金币的count改为100。这时候我们到编辑器中运行,可以看到检测器中,我们读取到的内容已经变成100了。

在实际开发中,我们常常不能让玩家找到这些数据,最起码不能知道每个数据的意思。因此需要用一些手段使玩家无法读取到这些数据。