Unity从2018.1版本开始,可以采用内置JSON进行存档和读档

devtools/2024/9/24 18:54:17/

在Unity中,将数据转换为JSON格式并存储在Application.persistentDataPath路径下,是一个常见的需求,用于保存游戏设置、玩家进度等数据。以下是一个简单的步骤和示例代码,展示如何实现这一过程:

那么UnityEngine类下面的JsonUtility类是干啥的呢?
答:UnityEngine 类下的 JsonUtility 类是 Unity 提供的一个用于处理 JSON 数据序列化和反序列化的工具。它简化了将数据对象转换为 JSON 字符串以及将 JSON 字符串转换回数据对象的过程。
JsonUtility 的主要特点包括:

1、简单性:它提供了一个简单直观的方式来处理 JSON 数据,无需深入了解 JSON 格式或编写复杂的解析代码。
2、内置支持:作为 Unity 引擎的一部分,JsonUtility 是内置的,无需额外安装或配置第三方库。
3、限制:然而,JsonUtility 也有其局限性。例如,它要求被序列化的类必须是可序列化的(即标记为 [Serializable]),并且所有字段都必须是 public 的或者通过 [SerializeField] 属性标记为可序列化的。此外,它不支持某些高级特性,如继承、接口、字典、集合(除了 List 和 Dictionary<string, T>,但后者有额外的限制和复杂性)等。
4、性能:由于它是 Unity 引擎的一部分,JsonUtility 被设计为与 Unity 的性能要求相匹配,尽管在处理大型或复杂的 JSON 数据时,其性能可能不如一些专门的 JSON 库。

步骤 1: 引入JSON库

1、Unity从2018.1版本开始,内置了对JSON的支持,通过JsonUtility类可以轻松地将对象序列化为JSON字符串,以及从JSON字符串反序列化为对象。但是,请注意JsonUtility有一些限制,比如它要求你的类有默认的构造函数,并且所有字段都必须是public的或者标记为[SerializeField]。
如果你的需求超出了JsonUtility的能力范围,你可以考虑使用更强大的库,如Newtonsoft.Json(也称为Json.NET)。这需要在Unity项目中通过NuGet或Unity的Package Manager安装。
2、使用 JsonUtility 时,你可以通过调用 JsonUtility.ToJson() 方法将数据对象序列化为 JSON 字符串,通过调用 JsonUtility.FromJson() 方法将 JSON 字符串反序列化为数据对象。以下步骤2跟步骤3就是一个简单的例子:

步骤 2:数据对象转换为JSON格式的完整示例

using System;
using System.IO;
using UnityEngine;// 如果使用JsonUtility,需要这个标记
[Serializable]
public class UserData
{public string UserName;public int Level;// 可以添加更多字段  
}public class JsonDemo : MonoBehaviour
{void Start(){// 假设这是你从某处获取或创建的UserData实例  UserData userData = new UserData { UserName = "Player2", Level = 13 };// 序列化UserData实例为JSON字符串  string jsonString = JsonUtility.ToJson(userData);// 构建文件路径  string filePath = Path.Combine(Application.persistentDataPath, "userPlayerData.json");// 使用StreamWriter写入文件,如果文件不存在,则会自动创建  using (StreamWriter writer = new StreamWriter(filePath)) {writer.Write(jsonString);}// 输出确认信息  Debug.Log("数据已保存到: " + filePath);}
}

步骤 3:JSON格式转换为数据对象的完整示例

在Unity中,当你把一个数据转换成JSON格式并存储在Application.persistentDataPath路径下的文件后,你可能需要在之后的某个时刻将这个JSON文件转换回对应的对象。这通常涉及到从文件中读取JSON字符串,然后使用某种方式将其反序列化为原始对象类型。

Unity自带的JsonUtility类可以用于这个目的,但它有一些限制,比如要求你的类是可序列化的(即标记为[Serializable]),并且所有字段都必须是public的或者标记为[SerializeField]的。如果你需要更复杂的JSON处理功能,比如处理嵌套对象、列表、字典等,你可能需要使用像Newtonsoft.Json(也称为Json.NET)这样的第三方库。

下面是一个使用JsonUtility将存储在Application.persistentDataPath路径下的JSON文件转换回对应对象的示例:

using System;
using System.IO;
using UnityEngine;[Serializable]
public class UserData
{public string UserName;public int Level;// 可以添加更多字段  
}public class JsonDemo : MonoBehaviour
{void Start(){// 构建文件路径  string filePath = Path.Combine(Application.persistentDataPath, "userPlayerData.json");// 读取文件内容  string jsonString = File.ReadAllText(filePath);// 反序列化JSON字符串为UserData对象  UserData userData = JsonUtility.FromJson<UserData>(jsonString);// 现在你可以使用userData对象了  Debug.Log("用户名: " + userData.UserName + ", 等级: " + userData.Level);}
}

注意事项

1、确保你的项目有写入Application.persistentDataPath的权限。在大多数平台上,这是默认的存储位置,用于存储用户数据。
2、如果你的项目需要在不同平台之间同步数据,请考虑数据格式和存储位置的兼容性。
3、使用Newtonsoft.Json可能需要一些额外的配置,比如通过NuGet或Unity Package Manager安装。但是,它提供了更多的灵活性和功能,特别是在处理复杂数据结构时。
4、请注意,由于 JsonUtility 的限制,你可能需要根据你的具体需求考虑是否使用它。如果你的项目需要处理复杂的 JSON 数据或需要利用一些 JsonUtility 不支持的特性,你可能需要考虑使用像 Newtonsoft.Json(Json.NET)这样的第三方库。


http://www.ppmy.cn/devtools/116620.html

相关文章

CSS基本概念以及CSS的多种引入方式

CSS基本概念 CSS是层叠样式表&#xff0c;又叫级联样式表&#xff0c;简称样式表。CSS的文件后缀为.css&#xff0c;CSS用于HTML文档中元素样式的定义。 CSS的基本语法 CSS的规则由2个主要的部分构成&#xff1a;选择器以及一条或者多条声明。 选测器通常是你血药改变样式的…

二叉树计算

题目描述 给出一个二叉树&#xff0c;请由该二叉树生成一个新的二叉树&#xff0c;它满足其树中的每个节点将包含原始树中的左子树和右子树的和。左子树表示该节点左侧叶子节点为根节点的一颗新树;右子树表示该节点右侧叶子节点为根节点的一颗新树。 输入描述 2行整数&#…

滚雪球学SpringCloud[9.3讲]:微服务监控与运维详解

全文目录&#xff1a; 前言1. 项目需求分析与架构设计1.1 项目背景与需求分析1.2 架构设计1.3 关键技术选型 2. 各核心组件的集成与配置2.1 服务注册与发现2.1.1 搭建Eureka服务2.1.2 服务的注册与调用 2.2 服务通信与消息队列2.2.1 RabbitMQ的集成2.2.2 服务间的消息传递 2.3 …

Unity3D URP 内置CSM分帧详解

技术详解 Unity3D的Universal Render Pipeline (URP) 提供了强大的渲染功能&#xff0c;其中内置的Cascaded Shadow Maps (CSM) 是一种用于大场景阴影渲染的高效技术。CSM通过将视锥体从近到远划分为多个层级&#xff0c;并为每个层级生成一张相同分辨率的深度图&#xff08;S…

Leetcode 最小覆盖子串

解题思路&#xff1a; 哈希表存储字符频率&#xff1a;首先统计字符串 t 中每个字符出现的次数。滑动窗口&#xff1a;用两个指针 left 和 right 来标记当前窗口的左右边界&#xff0c;不断右移 right&#xff0c;直到包含了所有 t 中的字符。然后尝试右移 left&#xff0c;缩…

记软件开发者画图(UML),使用WPS应用制图

目录 前言 一、什么是UML 二、使用什么画图工具 三、示例 ​四、IntelliJ IDEA 2021快速生成UML图 前言 做软件开发的从写第一个示例程序到最后写项目程序避不开的需要设计画图&#xff0c;所以今天我们就来梳理一下‌UML&#xff08;统一建模语言&#xff09;图形需要画…

Idea集成docker实现镜像打包一键部署

1.Docker开启远程访问 #修改该Docker服务文件 vi /lib/systemd/system/docker.service#修改ExecStart这行 ExecStart/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock将文件内的 ExecStart注释。 新增如上行。 ExecStart/usr/bin/dockerd -H fd:/…

通信工程学习:什么是PON无源光网络

PON&#xff1a;无源光网络 PON&#xff08;Passive Optical Network&#xff0c;无源光纤网络&#xff09;是一种采用光分路器等无源光器件进行信号传输和分配的光纤接入技术。它利用光纤作为传输媒介&#xff0c;通过无源设备将光信号从中心局&#xff08;如光线路终端OLT&am…