当前位置: 首页 > news >正文

Unity-基于JsonUtility的Json文件读写

前言

在 Unity 开发中,配置存档、参数、UI 状态、参数保存,几乎都离不开 JSON 读写。

Unity 自带JsonUtility,原生、轻量、跨平台、打包无报错、零依赖。

本篇给大家一套全网最简、可直接商用的 JSON 读写模板,包含:

  • ✅ 单数据读写

  • ✅ List 列表读写

  • ✅ 通用工具类(全局一行调用)

  • ✅ 所有坑点完整避坑

  • ✅ 适配编辑器 + 打包 Windows/安卓


一、核心原理(必看)

1. 核心 API

  • JsonUtility.ToJson()对象转 JSON 字符串(保存)

  • JsonUtility.FromJson()JSON 字符串转对象(读取)

2. 三条铁律(99%报错的原因)

  • 数据类必须加[Serializable]

  • 字段必须是public

  • 原生不支持直接 数组/List 顶层 JSON,需要包装类


二、最简完整代码(可直接复制使用)

1. 数据模型类(示例:PLC配置)

using System; /// <summary> /// 可序列化的JSON数据模型 /// </summary> [Serializable] public class PlcConfigData { public string Ip; public int Rack; public int Slot; public float Speed; public bool IsConnected; }

2. 通用 JSON 工具类(全局通用)

静态工具类,项目放任意位置,整项目通用

using UnityEngine; using System.IO; /// <summary> /// Unity 原生JSON读写工具类 /// </summary> public static class JsonTool { /// <summary> /// 保存数据到JSON文件 /// </summary> public static void SaveJson<T>(T data, string path) { string json = JsonUtility.ToJson(data, prettyPrint: true); File.WriteAllText(path, json); Debug.Log($"JSON保存成功:{path}"); } /// <summary> /// 读取JSON文件 /// </summary> public static T LoadJson<T>(string path) { if (!File.Exists(path)) { Debug.LogWarning("JSON文件不存在"); return default; } string json = File.ReadAllText(path); return JsonUtility.FromJson<T>(json); } }

3. 调用示例(一行保存、一行读取)

using UnityEngine; using System.IO; public class JsonTest : MonoBehaviour { // 持久化路径(编辑器 + 打包通用!) private string SavePath => Path.Combine(Application.persistentDataPath, "plcConfig.json"); void Start() { // 1. 构造测试数据 PlcConfigData data = new PlcConfigData() { Ip = "192.168.0.1", Rack = 0, Slot = 1, Speed = 35.5f, IsConnected = false }; // 2. 保存JSON JsonTool.SaveJson(data, SavePath); // 3. 读取JSON PlcConfigData load = JsonTool.LoadJson<PlcConfigData>(SavePath); if (load != null) { Debug.Log("读取IP:" + load.Ip); Debug.Log("读取速度:" + load.Speed); } } }

保存示例

读取示例:

注意:在Unity中,脚本要能拖拽到游戏对象上,需满足继承自MonoBehaviour这一硬性条件,而要在Inspector中拖拽赋值字段,则需要该字段为public或标记[SerializeField]。


三、List/数组 列表数据读写(高频需求)

重点坑:Unity Json 不支持直接序列化 List 顶层对象

解决方案:外层套一个包装类

1. 列表包装类

using System; using System.Collections.Generic; [Serializable] public class DataListWrapper { public List<PlcConfigData> DataList; }

2. 列表保存读取示例

using System.Collections.Generic; using System.IO; using UnityEngine; public class JsonTest : MonoBehaviour { // 持久化路径(编辑器 + 打包通用!) private string SavePath => Path.Combine(Application.persistentDataPath, "plcConfigList.json"); void Start() { // 保存列表 DataListWrapper wrap = new DataListWrapper(); wrap.DataList = new List<PlcConfigData>(); wrap.DataList.Add(new PlcConfigData() { Ip = "192.168.0.2", Rack = 0, Slot = 2 }); JsonTool.SaveJson(wrap, SavePath); // 读取列表 DataListWrapper loadWrap = JsonTool.LoadJson<DataListWrapper>(SavePath); if (loadWrap != null) { foreach (var item in loadWrap.DataList) { Debug.Log(item.Ip); } } } }

保存示例

读取示例:


四、JSON 文件位置在哪里?

编辑器路径:

C:\Users\你的用户名\AppData\LocalLow\公司名\项目名\

AppData 是隐藏文件夹,直接粘贴地址回车即可打开。


五、全网最齐全的踩坑总结

1. 类没有加 [Serializable]

现象:生成空 JSON{},读取全部为空、不报错

解决:必须加序列化特性

2. 字段写成 private

私有字段无法序列化,JSON 不显示

3. 保存立刻读取偶尔读不到

磁盘写入延迟,解决方案:协程延迟读取

4. 不能直接存 Dictionary

原生不支持字典,需要用 List 替代或 Newtonsoft.Json

5. 不要用 dataPath 存档

dataPath打包后只读,必须用persistentDataPath


六、优缺点总结

✅ 优点
  • 零插件、原生自带

  • 跨平台 Windows / Android / IOS

  • 速度快、轻量、无冲突

  • 工业仿真、PLC项目、工具项目完全够用

❌ 缺点
  • 不支持顶层数组

  • 不支持 Dictionary


结语

90% 的 Unity 存档、配置需求,原生 JsonUtility 完全够用,不需要第三方插件。

本文这套工具类是最简、最稳通用模板。

http://www.jsqmd.com/news/1328214/

相关文章:

  • SpringBoot构建网络安全攻防靶场实战指南
  • Label Studio Docker部署终极指南:5步搞定多类型数据标注平台
  • 2026年PDF转TXT工具实测:怎么选、怎么用,一文说清 - 软件小管家
  • Flutter库鸿蒙化实战:code_assets迁移与优化
  • Unity ECS Instanced Sprite Renderer:构建高性能2D渲染管线的核心原理与实践
  • 零基础入门数字人视频创作:小白如何用好数字人工具制作短视频
  • 韵泰木业:无锡实木全屋定制系统实力解析 - 资讯在线
  • 2026 抖店商品搬家软件哪个好用 抖大侠跨平台搬家功能实测推荐 - 抖大侠
  • 艾尔登法环存档迁移终极指南:3分钟学会安全转移游戏角色
  • Unity 2D游戏开发:基于Vector2的移动控制与追踪算法实战
  • 2026 Qwen3.8-Max 发布解读与中转站接入指南
  • C语言实现滑动窗口算法查找字母异位词
  • 如何免费获得36种Cherry MX键帽?这份完整3D打印指南让你轻松定制机械键盘
  • 电子商务毕业能干什么?运营、数据、产品怎么选,学长说点大实话
  • 从东方甄选分流出三支力量:单人IP、大型平台、团队创业,谁能走到最后?
  • CAD转PDF的几种稳当方法,附详细操作步骤与避坑提醒 - 软件小管家
  • 嵌入式学习路径重构:从信息过载到工程思维,掌握MCU与Linux开发核心
  • Flask实现短信验证码功能全流程指南
  • 推荐香港INS风925纯银戒指店:2026年升级 - 品牌推广大师
  • Adobe Illustrator批量替换神器:3分钟掌握ReplaceItems.jsx高效设计技巧
  • C++贪吃蛇实战:从零构建控制台游戏,掌握核心编程与Windows API
  • UE5视频播放黑屏终极解决方案:Electra Play插件配置与MP4兼容性实战
  • 西安高端爱马仕回收实体店分布在哪?7 家连锁线下门店提供一对一专业包袋鉴价服务 - 日常财经早知道
  • 2026抖店密文发货软件推荐 抖大侠免解密拍单功能实测 - 抖大侠
  • 用 Python 自动整理文件、重命名、分类电脑文件夹
  • 2026 西安香奈儿回收避坑全指南|正规连锁品牌便民分级攻略,适配不同预算闲置包出手 - 日常财经早知道
  • 江西大诺营造建材展会特装展位实测!全案落地与自然软装搭配攻略
  • 内娱明星上脚合集|F2国风潮鞋封神清单
  • KMS智能激活终极指南:3分钟完成Windows和Office永久免费激活
  • 为什么大量公司上了 RAG,却很少真正做成?