Unity 本地游戏数据存储和读取
Minsi丨夏虫
2024年05月18日 06:50
收录于文集
共2篇
独立游戏开发

前言

这里只讲使用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了。

结尾

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