unity2022版本 实现json读取保存 list自定义对象的读取与保存

1.序列化对象

通过unity自带的JsonUtility中的ToJson方法来序列化对象

public static string ToJson(object obj, bool prettyPrint)

ToJson返回一个序列化后的json字符串,

参数一 要序列化的对象

参数二 设置是否返回结果是否带有可读性 默认是false就是不带可读性(可读性理解是否压缩了json字符串中的换行和空格)

2.反序列化对象

通过unity自带的JsonUtility中的FromJson方法来序列化对象

public static T FromJson<T>(string json)

FromJson返回一个反序列化的对象

参数一 要反序列化的json字符串

T为反序列化对象的数据格式

3.应用

序列化的对象一般用于储存在电脑硬盘中方便在二次进行游戏的时候读取储存的游戏数据 来恢复游戏进度。

4.读取List对象,和保存List对象

问题:unity带的json工具库 在将List对象序列化的时候无法序列化List自定义对象,反序列化的时候也无法反序列化自定义的List对象。

这里有一种解决思路:就是在序列化List对象的时候将List中的对象再序列化一次这样就可以将自定义的List对象转化为string类型的List这样就可以储存与读取了

大概思路可以看下面代码:

序列化List对象:

cs 复制代码
        public string GetSaveJson()
        {
            SaveGoodListJson saveGoodListJson = new SaveGoodListJson(); 

            
            for(var i = 0; i < list.Count; i++)
            {
                saveGoodListJson.list.Add(JsonUtility.ToJson(list[i]));
            }
          
          
            return JsonUtility.ToJson(saveGoodListJson);
        }

我们将自定义的List对象通过ToJson调用为字符串并保存到一个动态数组中这样就可以储存了

反序列化List对象:

cs 复制代码
              string save = PlayerPrefs.GetString("saveGoodList");
                if (save != null && save != "")
                {
                    SaveGoodListJson saveGoodListJson = JsonUtility.FromJson<SaveGoodListJson>(save);
                    if (saveGoodListJson != null && saveGoodListJson.list != null)
                    {
                        List<string> list = saveGoodListJson.list;
                        for (var i = 0; i < list.Count; i++)
                        {
                            GoodsItemJson gd = JsonUtility.FromJson<GoodsItemJson>(list[i]);
                            AddGoodItem(gd);
                        }
                        startUiRoot.GetComponent<StartUi>().goodListEx.GetComponent<Goodlists>().UpdateItemPos();
                    }

                }

先通过PlayerPrefs获取本地储存的json字符串

然后通过反序列化方法(FromJson)来获取第一层的SaveGoodListJson 对象

然后再循环储存的List数组来读取自定义的序列化对象

5.PlayerPrefs简介

PlayerPrefs是一个存储游戏会话之间玩家偏好的类。它可以将字符串、浮点和整数值存储到用户的平台注册表中。
Unity 将PlayerPrefs 存储在本地注册表中,未加密。请勿使用 PlayerPrefs数据存储敏感数据。Unity根据应用程序运行的操作系统以不同方式

主要方法介绍

|----------------------------------------------------------------------------------------------|-----------------------------------------------------------------|
| DeleteAll | 删除所有储存的key |
| DeleteKey | 删除指定名称的key |
| GetFloat | 根据key返回浮点类型的储存值 |
| GetInt | 根据key返回整数类型的储存值 |
| GetString | 根据key返回字符串类型的储存值 |
| HasKey | 判断是否储存了这个key,如果给定的内容key存在于 PlayerPrefs 中,则返回 true,否则返回 false。 |
| Save | 保存所有修改的首选项。 |
| SetFloat | 设置由给定键标识的首选项的浮点值。您可以使用PlayerPrefs.GetFloat来检索此值。 |
| SetInt | 设置由给定键标识的首选项的整数值。您可以使用PlayerPrefs.GetInt来检索此值。 |
| SetString | 设置由给定键标识的首选项的字符串。您可以使用PlayerPrefs.GetString来检索此值。 |

不同平台PlayerPrefs储存的位置可以点击查看

6.PlayerPrefsJsonUtility的结合使用

大致就是PlayerPrefs负责储存序列化数据到用户本地。根据不同平台储存位置不同。然后通过JsonUtility来序列化对象这样就可以实现一个简单的游戏储存进度与恢复进度。

复杂的游戏储存还可以结合网络,数据库,本地fs文件系统等来完成。这里就先介绍这个简单的储存思路。

大概思路如下:

最后希望大家能加入游戏开发交流群一起进步:859055710

相关推荐
逐·風44 分钟前
unity关于自定义渲染、内存管理、性能调优、复杂物理模拟、并行计算以及插件开发
前端·unity·c#
_oP_i2 小时前
Unity Addressables 系统处理 WebGL 打包本地资源的一种高效方式
unity·游戏引擎·webgl
PandaQue3 小时前
《怪物猎人:荒野》游戏可以键鼠直连吗
游戏
m0_656974744 小时前
C#中的集合类及其使用
开发语言·c#
九鼎科技-Leo4 小时前
了解 .NET 运行时与 .NET 框架:基础概念与相互关系
windows·c#·.net
九鼎科技-Leo7 小时前
什么是 ASP.NET Core?与 ASP.NET MVC 有什么区别?
windows·后端·c#·asp.net·mvc·.net
.net开发7 小时前
WPF怎么通过RestSharp向后端发请求
前端·c#·.net·wpf
小乖兽技术7 小时前
C#与C++交互开发系列(二十):跨进程通信之共享内存(Shared Memory)
c++·c#·交互·ipc
幼儿园园霸柒柒7 小时前
第七章: 7.3求一个3*3的整型矩阵对角线元素之和
c语言·c++·算法·矩阵·c#·1024程序员节
白狐欧莱雅7 小时前
使用python中的pygame简单实现飞机大战游戏
经验分享·python·游戏·pygame