Unity使用JsonFX插件进行序列化

孙广东 2015.6.25

Unity and JSON – Quick Guide:

相比较XML的沉重和密集,Json更加高效。

Introduction:

什么是 Json ?如果你从未使用过它,它的内部是字典结构。但你进行序列化和反序列化一些数据之后,你就会想知道他是怎么工作的。

Unity没有为 JSON 提供内置的解决方案。

获得Dark Table的 JsonFX:

Dark Table 已经创建了Unity中的解决方案, JsonFx.你能得到 DLL 在这, if you want to follow along.

下载它,并且拖拽到Unity项目中,放到Plugins文件中。

Our Data Classes:来自 JsonFx zip 文件中的readme 自述文件,里面有支持的数据类型的列表。我们会把它当作简单一些基元和数组 — — 只是为了演示功能。我已经创建了几个用于此示例中的类。我们有一个叫做的 DataPC的类,这是我们要为我们的Player Controller存储的信息。还有提到的类名是 DataName 序列化的类。

我把这些作为数据类,因为他们的目的是要我的 JSON 文件,不是实际的类。换句话说,我也许会有一个类调用 PC 来处理游戏中的功能,但是我简单的 DataPC 类可以帮助存储和检索 json 格式的数据。这不需要通过任何手段。

我创建的第二类是 DataItem 类,存储特定item的数据。

public class DataPC{public string name;public int maxLevel;public string description;public string portrait;public DataItem[] inventory;}public class DataItem{public string name;public int cost;}

在这里我们变得有点花哨: 我创建了一个 DataItem 数组来存储多个items。

Serializing the Data:接下来,我已经成立了一个类,处理序列化和反序列化。:

using UnityEngine;using System.Collections;using JsonFx.Json;public class DataHandlerTest : MonoBehaviour {public DataPC myPC;void Start(){myPC = new DataPC();myPC.name = "Jimbob";myPC.maxLevel = 99;myPC.description = "Jimbob likes beer and trucks.";myPC.portrait = "jimbob.png";myPC.inventory = new DataItem[2];myPC.inventory[0] = new DataItem();myPC.inventory[1] = new DataItem();myPC.inventory[0].name = "Silver Bullet";myPC.inventory[0].cost = 5;myPC.inventory[1].name = "Shotgun";myPC.inventory[1].cost = 200;}public void OnGUI(){if (GUILayout.Button("SERIALIZE")){string myJson = JsonWriter.Serialize(myPC);Debug.Log(myJson);}}}

首先要注意的是我们需要包括 JsonFx 库: using JsonFx.Json接下来,我们创建的 DataPC 的一个新实例并初始化其值。我们给它两个Items存入数组,初始化每个。

在 OnGUI() 方法中。

string myJson = JsonWriter.Serialize(myPC);Debug.Log(myJson);

我们这里在做什么? 将类序列化为 Json 并成一个字符串保存该 Json。一旦我们有字符串,我们打印出来到debug log。

此方法的一个小问题是它生成 JSON 是一行的,没有排版结构的换行等。无格式。这意味着有大量的数据时它是有点难读的,,但你可以把这个Copy到您选择的文本编辑器,你也可以使用一个基于 web 的工具来做这种。这将格式设置为、并验证 Json。

{"name":"Jimbob","maxLevel":99,"description":"Jimbob likes beer and trucks.","portrait":"jimbob.png","inventory":[{"name":"Silver Bullet","cost":5},{"name":"Shotgun","cost":200}] }

JSON De/Serialization Using Unity and JsonFx:

目的: 序列化数据的目的是使它可以存储或在不同的系统或甚至应用程序之间共享。它创建一个共同的数据模板,可以来回转换 (序列化和反序列化) 甚至当源数据是不被认为是由接收的系统或应用程序本身。有可以使用的各种常见格式 (即 XML,CSV,二进制文件中,或在我们的例子,JSON)、 序列化到数据。

在我们的示例中,我们要创建一个类,在我们的应用程序中; 当我们创建它的实例时,它将存在于内存中直到我们摧毁它或停止应用程序。一旦我们在 unity 编辑器 (或关闭我们build生成中的窗口)关闭播放play模式,该数据就丢失了。通过序列化,在这种情况下内容到一个文本文件,使用 JSON,我们可以将其存储到文件系统中,不仅我们可以脱机编辑和查看更改反映在我们的应用程序,当我们再次加载它。

Download the JsonFx DLL: here

步骤 1: 创建容器容器是一个类用来在内存中存储您正在使用的数据。这不是唯一的方式做到这一点,但因为你读了我的向导,我的容器直接使用 C# 类。我们有:

Sandwich.cs

using System.Collections;using System.Collections.Generic;[System.Serializable]public class Sandwich{public string name;public string bread;public float price;public List<string> ingredients = new List<string>();}

只是注意字段都是public的,这一点很重要! 此外,[System.Serializable] 能为我们做两件事: 它允许 JsonFx 要序列化的字段,并且它还暴露在UNity的inspector面板上,将这些字段。很简单,对吧?好吧,让我们继续前进。

第 2 步: 序列化 (Saving/Writing) 数据将从代码中入手,然后我将解释。JsonTutorial.cs

using UnityEngine;using System.Collections;using System.Collections.Generic;using Pathfinding.Serialization.JsonFx;using System.IO;public class JsonTutorial : MonoBehaviour {public string fileName;public Sandwich sandwich;private string PATH;private void Start() {PATH = Application.dataPath + "/../testData/";}private void OnGUI() {if (GUILayout.Button("SAVE")){SerializeAndSave();}}private void SerializeAndSave() {string data = JsonWriter.Serialize(sandwich);if(!Directory.Exists(PATH)){Directory.CreateDirectory(PATH);}var streamWriter = new StreamWriter(PATH + fileName + ".txt");streamWriter.Write(data);streamWriter.Close();}}

第一件事情就是包括 JsonFx dll 就像这样:

using Pathfinding.Serialization.JsonFx;

生命太过短暂,今天放弃了明天不一定能得到

Unity使用JsonFX插件进行序列化

相关文章:

你感兴趣的文章:

标签云: