Featured image of post Unity数据持久化存储

Unity数据持久化存储

在unity实现数据持久化存储。

Json方案

简介

JSON: JavaScript Object Notation(JavaScript 对象表示法)
JSON是存储和交换文本信息的语法,类似 XML。JSON比 XML 更小、更快,更易解析。 JSON易于人阅读和编写。C、Python、C++、Java、PHP、Go 等编程语言都支持 JSON。

方法

文件读写

在unity进行json文件读写操作需要引入命名空间System.IO中的File类。使用其中相关静态函数。

1
2
3
4
5
using System.IO;
//写入
File.WriteAllText(string path, string text, json);
//读取
string json = File.ReadAllText(string path);

存储位置

Application.persistentDataPath
适用于保存需要长期保留的用户数据(如设置、进度、关卡数据等)。
在各平台上的实际路径不同,但都在应用可写的目录。

转为json字符串

将数据转换为Json字符串使用unity提供的类JsonUtility中的静态函数。

1
2
3
4
//转换为json。
string json = JsonUtility.ToJson(object obj, bool prettyPrint = false);
//转换为对象。
Data data = JsonUtility.FromJson<Data>(string json);

示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System.IO;
public static class JsonHelper
{
    public static void SaveJson(string path, object obj)
    {
        string finalPath = Application.persistentDataPath + "/" + path;
        //或者string finalPath = Path.Combine(Application.persistentDataPath, path);
        string jsonData = JsonUtility.ToJson(obj, true);
        //可以在write这里进行适当的错误处理
        File.WriteAllText(finalPath, jsonData, json);
    }

    public static T LoadJson<T>(string path)
    {
        string finalPath = Application.persistentDataPath + "/" + path;
        if(File.Exists(finalPath))
        {
            string jsonData = File.ReadAllText(path);
            //担心转换的对象有问题可以在这里进行适当的错误处理。
            return JsonUtility.FromJson<T>(jsonData);
        }
    }
}

注意

限制

JsonUtility.ToJson支持任何普通类和结构体,和派生自MonoBehaviourscriptableOnject的类。且只支持其中unity受序列化器支持的字段。虽然可以将C#原始类型传入,但是只会在Json中生成空对象字段。
虽然ToJson方法支持派生自MonoBehaviourscriptableOnject的类,但是JsonUtility.FromJson只支持创建普通类和结构;不支持派生自UnityEngine.Object的类(如MonoBehaviourScriptableObject)。
如果想从Json读取并创建或者覆写怕派生自UnityEngine.Object的类,可以额外创建一个只包含数据的普通类,再提供这个数据类进行对象的创建或者覆写。
或者想对更多数据类型的支持,如字典,列表等,可以使用其他的api如Newtonsoft.Json(Json.NET)— 适合更复杂的结构。
优点:支持字典、列表、嵌套对象等,序列化选项灵活。

使用 Hugo 构建
主题 StackJimmy 设计