三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Unity-基于JsonUtility的Json文件读写

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 完全够用,不需要第三方插件。

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

← 返回列表