【Unity数据交互】游戏中常用到的Json序列化
ˊˊ

👨💻个人主页:@元宇宙-秩沅
👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!
👨💻 本文由 秩沅 原创
👨💻 收录于专栏:Unity基础实战
⭐🅰️⭐
文章目录
- ⭐🅰️⭐
- ⭐前言⭐
- 🎶(==1==)持久数据文件夹
- 🎶(==2==)JsonUtlity进行序列化
- 🪶<font color=red>0. jsonUtilty的注意点(缺点)
- 🪶1.将对象序列化成字符串(Json格式)
- 🪶2.将Json反序列化成对象
- 🪶3.练习(将序列化和反序列化变成方法调用)
- 🎶(==3==)LitJson进行序列化
- 🪶1.如何使用
- 🪶<font color=red>2. LitJson的注意点
- 🪶3.序列化
- 🪶4.反序列化
- 🪶5.练习
- 🎶(==4==)JsonUtility和LitJson的区别ˊ---
- 🎶(==5==)Json管理器---
- ⭐缺点 ⭐
⭐前言⭐
🎶(1)持久数据文件夹

- 先获取文件夹的位置
print(Application.persistentDataPath);
- 1.存储字符串到指定路径文件中
File.WriteAllText(Application.persistentDataPath + “/text.json”,“这是我创建的新json脚本” );
- 2.在指定路径文件中读取字符串
string str = File.ReadAllText(Application.persistentDataPath + “/Test.json”);
🎶(2)JsonUtlity进行序列化
JsonUtility是Unity引擎中的一个工具类,用于将JSON字符串转换为Unity对象或将Unity对象转换为JSON字符串。它可以方便地在Unity游戏中进行JSON数据的序列化和反序列化,使开发者可以更轻松地处理JSON数据。JsonUtility是一个非常强大和实用的工具,可以被广泛应用于Unity游戏中的数据管理、网络通信、游戏存档等方面。
- 现实作用:
1.将对象序列化成Json格式
2.将Json格式反序列化为对象

- 引用 using System.IO
IO通常是指Input/Output(输入/输出)的缩写。在计算机中,IO是指数据在计算机内部和外部设备之间的传输和交换。例如,键盘和鼠标输入数据到计算机中,打印机、屏幕和音箱从计算机中输出数据。这种数据的输入和输出过程就是IO。
🪶0. jsonUtilty的注意点(缺点)
😶🌫️注意:
1.float序列化时看起来会有一些误差2.被包裹的自定义类需要加上序列化特性[System.Serializable]3.想要序列化私有变量 需要加上特性[SerializeField]4.JsonUtility不支持字典5.JsonUtlity存储null对象不会是null 而是默认值的数据,比如空int 会变成06.JsonUtility无法直接反序列化读取数据集合"[]",需要用一个对象包裹它7.文本编码格式需要时UTF-8 不然无法加载


🪶1.将对象序列化成字符串(Json格式)
-
string jsonStr = JsonUtility.ToJson( dataGame );
// DataGame 是类对象 -
File.WriteAllText(Application.persistentDataPath + “/text1.json”, jsonStr);
//将序列化后的字符串数据存在文件夹中
🪶2.将Json反序列化成对象
-
jsonStr = File.ReadAllText(Application.persistentDataPath + “/text1.json”);
//读取文件中的字符串 -
DataGame dataGame = JsonUtility.FromJson< DataGame >(jsonStr);
//使用Json字符串内容 转换成类对象 -
代码
jsonStr = File.ReadAllText(Application.persistentDataPath + "/text1.json");DataGame dataGame = JsonUtility.FromJson<DataGame >(jsonStr);
🪶3.练习(将序列化和反序列化变成方法调用)
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.UI;[System.Serializable]
public class Item
{public int id;public int num;public Item( int ID,int NUM){id = ID;num = NUM;}
}public class BossInfo
{public string name;public int attack;public int defence;public float moveSpeed;public double roundSpeed;public Item weapon;public List<int> listInt;public List<Item> itemList;public Dictionary<int, Item> itemDic1;public Dictionary<string, Item> itemDic2;[SerializeField ]private int self = 2 ;[SerializeField]protected int pro = 3; //序列化public void serilized(BossInfo obj){if(obj!=null ){string onjInfo = JsonUtility.ToJson(obj);File.WriteAllText(Application.persistentDataPath + ("/BossInfo.json"), onjInfo);}}//反序列化public BossInfo RevSerilized(string path){if (path != null){string objInfo = File.ReadAllText(Application.persistentDataPath +"/"+ path);return JsonUtility.FromJson<BossInfo>(objInfo);}else return null;}
}public class text : MonoBehaviour
{private void Start(){BossInfo boss = new BossInfo();boss.name = "鸭嘴兽";boss.attack = 100;boss.defence = 20;boss.moveSpeed = 50;boss.roundSpeed = 30;boss.weapon = new Item(001, 10);boss.listInt = new List<int>() { 1, 2, 3, 4 };boss.itemList = new List<Item>() { new Item(002, 10), new Item(003, 10) };boss.itemDic1 = new Dictionary<int, Item>() { { 1, new Item(002, 10) }, { 2, new Item(003, 10) } };boss.itemDic2 = new Dictionary<string, Item>() { { "鸭子1", new Item(003, 10) }, { "鸭子2", new Item(004, 10) } };boss.serilized(boss); //JsonUyility 不支持字典print(Application.persistentDataPath);boss.RevSerilized("BossInfo.json");}
}
🎶(3)LitJson进行序列化
LitJson是一个用于C#和Unity的Json解析器和生成器。它可以将Json格式的数据解析为C#对象,也可以将C#对象序列化为Json格式的数据。它具有高效,易用和可扩展性的特点,在游戏开发、网站开发、物联网等领域广泛应用。
它是一个第三方库是第三方编写的(而UtilityJson是自己编写的),用于处理Json的序列化和反序列化,LitJson是C#编写的,体积小、速度快、易于使用
🪶1.如何使用
- 在官网中跳转GitHub获取最新版本

- 将下好的版本中的C#脚本拖到Unity中

🪶2. LitJson的注意点
- 1.序列化不需要加特性
- 2.不能序列化私有变量
- 3.需要引用命名空间
- 4.可以保存null值
- 5.可以序列化字典,但是键必须是字符串类型否则会报错
- 6.序列化类的时候一定要确保它有无参构造函数否则会报错
- 7.可以直接读取数据集合[]
- 8.文本编码格式需要时UTF-8 不然无法加载
🪶3.序列化
-
和方式JsonUtility一样
-
string jsonStr = JsonMapper.ToJson(obj);
// obj是类对象 -
File.WriteAllText(Application.persistentDataPath + “/text.json”, jsonStr);
//将序列化后的字符串数据存在文件夹中
🪶4.反序列化
-
jsonStr = File.ReadAllText(Application.persistentDataPath + “/text.json”);
-
①objInfo 2 = JsonMapper.ToObject< objInfo> (jsonStr);
//通过泛型转换更方便 -
②JsonData data = JsonMapper.ToObject(jsonStr);
//JsonData是LitJson提供的类对象访问其中的内容要用键值对的形式去print(data["age"]);
🪶5.练习
using LitJson;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.UI;public class Item
{public int id;public int num;public Item() { } //因为有参把他替换了所以需要重新声明public Item( int ID,int NUM){id = ID;num = NUM;}
}public class BossInfo
{public string name;public int attack;public int defence;public float moveSpeed;public double roundSpeed;public Item weapon;public List<int> listInt;public List<Item> itemList;public Dictionary<int, Item> itemDic1;public Dictionary<string, Item> itemDic2;private int self = 2 ;protected int pro = 3; //LitJson序列化public void LSerilized(BossInfo obj){if (obj != null){string objInfo = JsonMapper.ToJson(obj);File.WriteAllText(Application.persistentDataPath + ("/BossInfo2"), objInfo);}}//LitJson反序列化public BossInfo RevLSerilized(string path){if(path != null ){string objInfo = File.ReadAllText(Application.persistentDataPath +"/"+path );return JsonMapper.ToObject<BossInfo>(objInfo);}else return null;}
}public class text : MonoBehaviour
{private void Start(){BossInfo boss = new BossInfo();boss.name = "鸭嘴兽";boss.attack = 100;boss.defence = 20;boss.moveSpeed = 50;boss.roundSpeed = 30;boss.weapon = new Item(001, 10);boss.listInt = new List<int>() { 1, 2, 3, 4 };boss.itemList = new List<Item>() { new Item(002, 10), new Item(003, 10) };boss.itemDic1 = new Dictionary<int, Item>() { { 1, new Item(002, 10) }, { 2, new Item(003, 10) } };boss.itemDic2 = new Dictionary<string, Item>() { { "鸭子1", new Item(003, 10) }, { "鸭子2", new Item(004, 10) } };boss.LSerilized(boss); //JsonUyility 不支持字典print(Application.persistentDataPath);boss.RevLSerilized("BossInfo.json");}
}
🎶(4)JsonUtility和LitJson的区别ˊ—
- 1.JsonUt1ity是Unity自带,LitJson是第三方需要引用命名空间
- 2.JsonUt1ity使用时自定义类需要加特性,LitJson不需要
- 3.JsonUt1ity支持私有变量(加特性),LitJson不支持
- 4.JsonUt1ity不支持字典,LitJson支持(但是键只能是字符串)
- 5.JsonUt1ity不能直接将数据反序列化为数据集合(数组字典),LitJson可以
- 6.JsonUt1ity对自定义类不要求有无参构造,LitJson需要
- 7.JsonUt1ity存储空对象时会存储默认值而不是nu11,LitJson会存null
🎶(5)Json管理器—
using LitJson;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;/// <summary>
/// 序列化和反序列化Json时 使用的是哪种方案
/// </summary>
public enum JsonType
{JsonUtlity,LitJson,
}/// <summary>
/// Json数据管理类 主要用于进行 Json的序列化存储到硬盘 和 反序列化从硬盘中读取到内存中
/// </summary>
public class JsonMgr
{private static JsonMgr instance = new JsonMgr();public static JsonMgr Instance => instance;private JsonMgr() { }public void SaveData(object data, string fileName, JsonType type = JsonType.LitJson){string path = Application.persistentDataPath + "/" + fileName + ".json";string jsonStr = "";switch (type){case JsonType.JsonUtlity:jsonStr = JsonUtility.ToJson(data);break;case JsonType.LitJson:jsonStr = JsonMapper.ToJson(data);break;}File.WriteAllText(path, jsonStr);}/// <summary>/// Json反序列化/// </summary>/// <typeparam name="T"></typeparam>/// <param name="fileName"></param>/// <param name="type"></param>/// <returns></returns>public T LoadData<T>(string fileName, JsonType type = JsonType.LitJson) where T : new(){//先判断 是否存在streamingAssets中string path = Application.streamingAssetsPath + "/" + fileName + ".json";//如果不存在默认文件 就从 persistentDataPath文件夹中去寻找if (!File.Exists(path))path = Application.persistentDataPath + "/" + fileName + ".json";//如果读写文件夹中都还没有 那就返回一个默认对象if (!File.Exists(path))return new T();//进行反序列化string jsonStr = File.ReadAllText(path);//数据对象T data = default(T);switch (type){case JsonType.JsonUtlity:data = JsonUtility.FromJson<T>(jsonStr);break;case JsonType.LitJson:data = JsonMapper.ToObject<T>(jsonStr);break;}//把对象返回出去return data;}
}
⭐缺点 ⭐
- 重复工作繁多,自定义数据类,需要自己取实现存储读取的功能而且代码的相似度极高
- 数据容易被修改,只要找到文件位置,就可以轻易的进行数据修改
⭐【Unityc#专题篇】之c#进阶篇】
⭐【Unityc#专题篇】之c#核心篇】
⭐【Unityc#专题篇】之c#基础篇】
⭐【Unity-c#专题篇】之c#入门篇】
⭐【Unityc#专题篇】—进阶章题单实践练习
⭐【Unityc#专题篇】—基础章题单实践练习
⭐【Unityc#专题篇】—核心章题单实践练习
你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!、

相关文章:
【Unity数据交互】游戏中常用到的Json序列化
ˊˊ 👨💻个人主页:元宇宙-秩沅 👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨💻 本文由 秩沅 原创 👨💻 收录于专栏࿱…...
TCP的滑动窗口和拥塞控制
目录 滑动窗口 1.发送窗口和接收窗口 2.滑动窗口的分类 停止等待协议:发送窗口大小 1, 接收窗口大小 1 后退N帧协议(GBN):发送窗口大小 > 1,接收窗口大小 1 选择重传协议(SR…...
零信任网络:一种全新的网络安全架构
随着网络技术的不断发展,网络安全问题日益凸显。传统的网络安全策略往往基于信任和验证,但这种信任策略存在一定的局限性。为了解决这一问题,零信任网络作为一种全新的网络安全架构,逐渐受到人们的关注。本文将对零信任网络的概念…...
基于单片机的智能拐杖软件设计
欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 技术交流认准下方 CSDN 官方提供的联系方式 文章目录 概要 一、整体设计方案2.1本设计设计原理2.1.1单片机基本介绍 二、本设计方案选择三、软件设计AD原理图:原理图…...
小程序如何设置自动预约快递
小程序通过设置自动预约功能,可以实现自动将订单信息发送给快递公司,快递公司可以自动上门取件。下面具体介绍如何设置。 在小程序管理员后台->配送设置处,选择首选配送公司。为了能够支持自动预约快递,请选择正常的快递公司&…...
STM32-HAL库08-TIM的输出比较模式(输出PWM的另一种方式)
STM32-HAL库08-TIM的输出比较模式(输出PWM的另一种方式) 一、所用材料: STM32F103C6T6最小系统板 STM32CUBEMX(HAL库软件) MDK5 示波器或者逻辑分析仪 二、所学内容: 通过定时器TIM的输出比较模式得到预…...
【数据结构】深入浅出讲解计数排序【图文详解,搞懂计数排序这一篇就够了】
计数排序 前言一、计数排序算法核心思路映射 概念补充绝对映射相对映射 二、计数排序算法核心实现步骤三、码源详解四、效率分析(1)时间复杂度 — O(Max(N,range))(2)空间…...
Canvas制作喷泉效果示例
Canvas能制作出很多动画效果,下面是一个制作喷泉效果的示例 效果图 源代码 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <meta name"viewport" content"widthdevice-width, initial-scale1 ,user-…...
什么是NPM(Node Package Manager)?它的作用是什么?
聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…...
oracle如果不适用toad或者plsql工具如何获取索引建表语句
select dbms_lob.substr(dbms_metadata.get_ddl(INDEX,INDEX_NAME,DIXON))||; from dba_indexes where ownerDIXON这个语句可以获取dixon用户的所有索引创建语句,sql脚本形式呈现 点开一个语句查看 如果不使用dbms_lob.substr这个函数最后得到是一个clob selec…...
某大厂伺服驱动器量产方案
本文介一款大厂量产伺服驱动器方案!带2500线省线式编码器,17位增量编码器,20位绝对值编码器!标配CANopen、高精度运动控制,高速总线通讯,主芯片28335FPGA,已验证过,带can和485通讯&a…...
【计算机网络】网络层:数据平面
一.网络层概述 每台路由器的数据平面的主要功能时从其输入链路向其输出链路转发数据报,控制平面的主要功能是协调这些本地的每路由转发动作,使得数据报沿着源和目的地主机之间的路由器路径最终进行端到端传送。 网络层不运行运输层和应用层协议。 转发是…...
Path with “WEB-INF“ or “META-INF“: [webapp/WEB-INF/NewFile.html]
2023-11-04 01:03:14.523 WARN 10896 --- [nio-8072-exec-6] o.s.w.s.r.ResourceHttpRequestHandler : Path with "WEB-INF" or "META-INF": [webapp/WEB-INFNewFile.html] spring.mvc.view.prefix:/webapp/WEB-INF/...
百度OCR 接口调用 提示 216101:param image not exist 问题解决
百度提供的文档并没有描述如何解决,例子也是,用工具请求可以通 axios 请求 需要用FormData 传参 let token await getAccessToken() //官网案例那个 请求token// console.log(token, "token");var formData new FormData();// imageBase64 :Base64 图片数据formD…...
1-10 HTML中input属性
HTML中input属性 text:用于接受单行文本输入password:用于密码输入,输入字符会被掩盖radio:用于单选按钮,用户可以在一组选项中选择一个checkbox:用于复选框,用户可以选择多个选项number&#…...
共焦显微镜使用
x.1 细胞培养 x.2 样品制备 以细菌为例,我们使用荧光染色细菌,静置15分钟。 15分钟后我们使用实验室的专用培养皿,选择吸收100uL的溶液滴在在培养皿中心。 x.3 显微镜使用 我们按照1, 2, 3, 4的顺序打开显微镜, 打开电脑&…...
windows + Mingw32-make 编译 PoDoFo库,openssl, libjpeg, Msys2工具的使用
参考: https://blog.csdn.net/sspdfn/article/details/104244306 https://blog.csdn.net/yaoyuanyylyy/article/details/17436303 https://blog.csdn.net/wxlfreewind/article/details/106492253 前期进行了各种摸索,由于Podofo依赖库比较多,…...
C++中图的存储
文章目录 0. 实例图1. 邻接矩阵2. 邻接矩阵2.1 链表数组2.2 链式前向星 3. 参考 0. 实例图 考虑下面这样一个图 1. 邻接矩阵 vis[i][j] 表示从i 到j有一条边。直接用二维数组就可以了。 using namespace std; int vertex_num 5; vector<vector<int>> graph(v…...
西瓜书读书笔记整理(七)—— 第七章 贝叶斯分类器
第七章 贝叶斯分类器 7.1 贝叶斯决策论(Bayesian Decision Theory)7.1.1 先验概率(Prior Probability)7.1.2 后验概率(Posterior Probability)7.1.3 似然度(Likelihood)7.1.4 决策规…...
C#WPF嵌套布局实例
本文演示C#WPF嵌套布局实例。演示了不同布局的简单用法,便于快速应用和掌握。 <Windowx:Class="LayoutDemo.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/x…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
热烈祝贺埃文科技正式加入可信数据空间发展联盟
2025年4月29日,在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上,可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞,强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...
向量几何的二元性:叉乘模长与内积投影的深层联系
在数学与物理的空间世界中,向量运算构成了理解几何结构的基石。叉乘(外积)与点积(内积)作为向量代数的两大支柱,表面上呈现出截然不同的几何意义与代数形式,却在深层次上揭示了向量间相互作用的…...
