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

相关推荐
liangmou212130 分钟前
解释小部分分WPI函数(由贪吃蛇游戏拓展)
android·游戏·c#
lili-felicity1 小时前
指针与数组:深入C语言的内存操作艺术
c语言·开发语言·数据结构·算法·青少年编程·c#
两水先木示2 小时前
【Unity3D】ECS入门学习(六)状态组件 ISystemStateComponentData
学习·unity·ecs
Thomas_YXQ2 小时前
Unity3D Huatuo:划时代的原生C#热更新技术详解
开发语言·游戏·unity·c#·unity3d
❦丿多像灬笑话、℡2 小时前
leetcode 热题100(208. 实现 Trie (前缀树))数组模拟c++
算法·leetcode·c#
黄金小码农10 小时前
C# 2024/12/26 周四
c#
大G哥11 小时前
pytest自动化测试数据驱动yaml/excel/csv/json
json·excel·pytest
Unity_RAIN11 小时前
Unity 战斗系统中角色UI血条设计
ui·unity·游戏引擎
坐井观老天12 小时前
使用 C# 测量程序运行消耗的的时间
开发语言·c#
小哈龙13 小时前
c++ 类似与c# 线程 AutoResetEvent 和 ManualResetEvent的实现
c++·c#·多线程