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

8,322次阅读
没有评论

共计 2733 个字符,预计需要花费 7 分钟才能阅读完成。

在 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,但后者有额外的限制和复杂性)等。
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;


[Serializable]
public class UserData
{
    public string UserName;
    public int Level;
    
}

public class JsonDemo : MonoBehaviour
{
    void Start()
    {
        
        UserData userData = new UserData { UserName = "Player2", Level = 13 };

        
        string jsonString = JsonUtility.ToJson(userData);

        
        string filePath = Path.Combine(Application.persistentDataPath, "userPlayerData.json");

        
        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);

        
        UserData userData = JsonUtility.FromJsonUserData>(jsonString);

        
        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)这样的第三方库。

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

    正文完
     0
    Yojack
    版权声明:本篇文章由 Yojack 于2024-10-07发表,共计2733字。
    转载说明:
    1 本网站名称:优杰开发笔记
    2 本站永久网址:https://yojack.cn
    3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
    4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
    5 本站所有内容均可转载及分享, 但请注明出处
    6 我们始终尊重原创作者的版权,所有文章在发布时,均尽可能注明出处与作者。
    7 站长邮箱:laylwenl@gmail.com
    评论(没有评论)