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

相关推荐
时光追逐者29 分钟前
分享6个.NET开源的AI和LLM相关项目框架
人工智能·microsoft·ai·c#·.net·.netcore
friklogff1 小时前
【C#生态园】提升C#开发效率:深入了解自然语言处理库与工具
开发语言·c#·区块链
仙魁XAN1 小时前
Unity 设计模式 之 创造型模式-【工厂方法模式】【抽象工厂模式】
unity·设计模式·工厂方法模式·抽象工厂模式
__water10 小时前
『功能项目』回调函数处理死亡【54】
c#·回调函数·unity引擎
__water10 小时前
『功能项目』眩晕图标显示【52】
c#·unity引擎·动画事件
__water10 小时前
『功能项目』第二职业法师的平A【57】
c#·unity引擎·魔法球伤害传递
躺下睡觉~11 小时前
Unity-Transform类-父子关系
java·unity·游戏引擎
躺下睡觉~12 小时前
Unity-Transform类-缩放和看向
unity·游戏引擎
__water13 小时前
『功能项目』战士的伤害型技能【45】
c#·unity引擎·战士职业伤害型技能
君莫愁。14 小时前
【Unity】检测鼠标点击位置是否有2D对象
unity·c#·游戏引擎