解释如何在Unity中处理JSON [jsonutility]

如果您是程序员,您可能知道称为JSON或大量听力的数据。但是,如果语言或环境不同,它往往能够使用库,因为它在大量场景中使用。此外,一些图书馆还具有诸如功能之类的陷阱。所以这一次,Unity将处理jsonutility的处理和注意事项和措施。

与json.

建造

JSON:JavaScript对象符号缩写字面意思是JavaScript的数据结构。
JSON持有一个集合的键和值,但它可以在结构上具有数据,因为它们可以在该值中排列或青少年。
让我们看看JSON的每个元素。

联想阵列

{}介绍关联阵列中的键的形式的数据。如果有多个数据,请与逗号连接(,)。

{
    HP:10,
    ATK:29,
    name: "enemy1"
},
{
    HP:13,
    ATK:43,
    name: "enemy2"
}

大批

[]按顺序在数组中具有相同类型的数据。如果您有多个数据,请连接(,)。

[1,2,3]

组合

JSON没有上述结构。因此几乎没有记忆,
通过组合上述,也可以分层地描述复杂的信息。
让我们以JSON表达多个敌人作为一个例子。

{
    enemies:[
        {
            name: "enemy1"
            HP:10,
            ATK:29,
        },
        {
            name: "enemy2"
            HP:13,
            ATK:43,
        }
    ]
}

以上是JSON中的代表敌人信息。

JSON Merit.

好吧,我了解JSON的概述,但如果这是CSV(如果你不知道,请考虑exclesll)或其他东西。
当然是。但是,JSON的第一个优点可以通过不均匀结构中的数据容易地表示。
例如,如果它是CSV,只需通过简单地排列数据,没有描述关系,因此
即使特定元素丢失或有趣,它也无法检测到。
例如,它看起来像这样

name,flag
enemy1,on
enemy2,off
enemy3

以上,我们描述了CSV中的敌人及其旗帜。
如果标志正站,如果它不站立,它就会关闭。好吧,没有什么是敌人的3旗帜。
如果留下了这一点,我不知道敌人的3标志是什么,但这不是CSV描述性的问题。
但是,当您将此传递为游戏数据时,它是另一个故事。此数据缺陷是执行的,并且在数据加载阶段之前不知道。结果,如果停止错误,则很好,但在原因唤醒时会发现原因很多。因此,在CSV中,\”flag\”由于没有通知的信息,因此它可能以非预期的方式移动。

JSON的好处可以代表数据的结构。
通过将键和值与集合保持键和值可以来描述关系。
因此,如果没有值,则安全是安全的,因为结构中存在失败。

如何在untiy中使用jsonutility

如果您知道JSON概述,让我们来看看如何在Untiy中使用JSON。
处理JSON提供Unity官员的对象詹蒙特使用。
这具有不足的位置,作为各种约束和特征而不是执行速度。让我们用实际用法看看这些。

从课堂上课到json

首先,让我们来看看如何将类转换为JSON格式。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class jsonClass : MonoBehaviour {

    // Use this for initialization
    public int HP = 1;
    public int ATK = 3;
    public string name = "hello";

	void Start () {
        Debug.Log(JsonUtility.ToJson(this));
		
	}
	
	// Update is called once per frame
	void Update () {
		
	}
}

这是整个代码。

    public int HP = 1;
    public int ATK = 3;
    public string name = \"hello\";

此部分定义类字段。杰逊说他有钥匙和价值观。
对于jsonutility,变量名:变量中的值
通过该方法进行转换。

    Debug.Log(JsonUtility.ToJson(this));

上面的jsonutility.tojson将类转换为JSON并将类实例占据参数。
在这种情况下,它通过此传递,因为实际移动的jsonClass本身在类内转换。

它是在Debug.log中的控制台屏幕输出以确认。

将此脚本粘贴到一个适当的对象中进行试用并尝试运行。

詹森上课

从JSON转换为课程时有两种方法。这有点令人讨厌的问题。
让我们在实际放出一个例子时解释。

生成类并返回实例

jsonutility类

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using JsonData;



public class JsonClass : MonoBehaviour {

    // Use this for initialization
    public int HP = 1;
    public int ATK = 3;
    public string name = "hello";

	void Start () {
        JsonDataClass jsonDataClass;

        string jsonString = "{\"HP\":12,\"ATK\":6,\"name\":\"asdf\"}";
        jsonDataClass = JsonUtility.FromJson<JsonDataClass>(jsonString);
        
        Debug.Log(jsonDataClass.ATK);
        Debug.Log(jsonDataClass.name);
        Debug.Log(jsonDataClass.HP);
	}
	
	// Update is called once per frame
	void Update () {
		
	}
}

数据存储类

namespace JsonData
{
    public class JsonDataClass
    {
        public int HP;
        public int ATK;
        public string name;
    }
}

这接收了JSON格式字符串,并生成其类的实例。
首先,作为此时的前提,该类是从JSON生成的,因此让我们定义JSON数据存储仅类。
这就是这个jsondataclass。

让我们实际看看代码。 jsonutility看看使用类。

        string jsonString = "{\"HP\":12,\"ATK\":6,\"name\":\"asdf\"}";

首先创建一个json字符串。它存储价值,

        jsonDataClass = JsonUtility.FromJson<JsonDataClass>(jsonString);

C#无法首先定义类型,
您必须给出要生成的类的类型信息。
因此,给出泛型生成的类的类型信息。然后,将JSON字符串传递为参数以将值置于生成的类。
请使用debug.log检查。您可以看到存储该值。

但是,此功能具有重要的缺陷。
总之,如果生成类的实例的目标继承Monobehavior,无法生成类。
它将被省略,因为它将详细解释,但是当使用Unity的函数时,必须继承Monobehavior,并且根据此遗传将发生各种约束。
例如,尝试生成实例或读取数据时存在各种各样的事情,但由于它,它失败。

这可能有点令人困惑,但问题是“将实例化新课程”。因此,由于它已经生成或不符合条件,即使您在一个或其他示例的示例中针对Monobehaiver,它也可以在没有问题的情况下工作。

覆盖现有变量

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class JsonClass : MonoBehaviour {

    // Use this for initialization
    public int HP = 1;
    public int ATK = 3;
    public string name = "hello";

	void Start () {
        //JsonClass jsonClass = Instantiate(JsonClass);
        string jsonString = "{\"HP\":12,\"ATK\":6,\"name\":\"asdf\"}";
        JsonUtility.FromJsonOverwrite(jsonString, this);
        Debug.Log(this.ATK);
        Debug.Log(this.name);
        Debug.Log(this.HP);
	}
	
	// Update is called once per frame
	void Update () {
		
	}
}

这存储了从JSON中提取的数据作为覆盖名称的第二个参数。
换句话说,它将以覆盖现有变量的值的形式实现。

        string jsonString = "{\"HP\":12,\"ATK\":6,\"name\":\"asdf\"}";
        JsonUtility.FromJsonOverwrite(jsonString, this);

我以前创建了一个JSON字符串,但这一次我将覆盖现有的没有新生成的。所以,没有用泛型指定类型
相反,我们有覆盖JSON字符串的类的实例。
执行此函数时,不会返回返回值,而是通过引用重写第二个参数的实例。
请检查debug.log的内容以尝试。它已经改变了。

如果没有转换为JSON

虽然我们解释了关于如何使用它到目前为止,但还将提到它指出它不能转换为JSON。最大的说明,它是类字段无法转换为JSON的,
jsonutility忽略了错误而不耗尽的错误。因此,它非常讨厌,因为它不确定它是否不想无意地造成错误。
所以我们将解释它没有转换。

从结论中,它无法转换为无法序列化的变量。
它将被省略,因为当您解释序列化时,它将更长,但只认为类数据(二进制)可以转换为可以保存数据的表单(文本)。
详细规格
//docs.unity3d.com/ja/current/Manual/script-Serialization.html
//docs.unity3d.com/ja/current/Manual/JSONSerialization.html

请阅读上述两个。但是,因为它是很多朋友,我们将列出最小的朋友。
当满足以下条件时,大致未转换。

  • 私人(具有例外)
  • const
  • 静止的
  • 非统筹领域
  • 只读
  • 字典
  • 抽象类
  • 等等

但是,添加私人的[SerializeField]使得可以序列化该字段。
检查的点是下面的。

    1.访问级别
    2.是否可以序列化类型?
    3.在使用TOJSON功能时是否在Monobehavior中

是一个点。如果它没有转换为JSON,让我们在上面了解。

其他图书馆

有多快,这很麻烦有一些限制。特别是,有严重的东西不能使用字典等数据类型,所以
我还介绍了另一个JSON库。

JSON.NET.
C#库处理着名的JSON。
这是字典也可以使用因此,如果您遇到麻烦,可以选择。
处理速度本身比jsonutility慢,但我认为它可能正常使用,除非它是性能所需的环境。

实际的例子

让我们考虑最后一个简单的游戏的实施。在这种情况下,考虑新颖的游戏。
这次,我会考虑这个元素。

  • 常设图片
  • 衬里
  • 背景

考虑每个信息的JSON(每次都有背景,常设图片和Serif)。
首先是你有什么信息?
例如,
背景在本地,所以让我们指向本地文件名?
让我们制作相同的常设图片。
selif将加载包裹的线
在诸如什么信息之类的形式中,您是否考虑过它以及如何处理它?

所以,这个班级和json的结构

数据存储类

    // ローカルの背景ファイル名
    public string background;
    // ローカルの立ち絵ファイル名
    public string standChara;
    // セリフの文字列
    public string[] serif;

让我们说。

让我们考虑实际利用数据的课程。
该类不会继承monobehavior,因为该类实际上反映了数据。
最重要的是,可以访问UI和图像等对象,

类使用

    // セリフ表示用のゲームオブジェクト例
    public GameObject UIText
    // 背景表示用のゲームオブジェクト例
    public GameObject UIImage
    // 立ち絵キャラのゲームオブジェクト例
    public GameObject UIChara

    void Start () {
        string jsonString = "{\"background\":\"normal\",\"standChara\":[\"chara_plate\"],\"serif\":[\"hello\",\"test\"]}";
        NovelData novelData = JsonUtility.FromJson<NovelData>(jsonString);
        // 画像を変更したり・・・・ 
	}

感觉像。

我必须在这里思考,

string jsonString = "{\"background\":\"normal\",\"standChara\":[\"chara_plate\"],\"serif\":[\"hello\",\"test\"]}";

它是一部分此类必须逐个将JSON写入程序,因此您必须考虑加载JSON或生成JSON。相反,它只能是一个小说游戏引擎。

JSON数据负载的方法

然后我将解释如何加载json。
有多个东西,但这一次我们将在将数据放在服务器上并在本地放置时介绍一个代表性示例。

API.

说到json,它是reastapi。 RESTAPI击败了URL,结果将作为JSON返回。诺贝尔的案例是Novell游戏引擎的一个例子,将数据放在另一台服务器上,它以JSON格式与API捕获的形式。
这是您可以根据您的视线与服务器通信的前提。
而且,因为这种结构是一个主要的,所以有许多样品。
如果您正在考虑与服务器通信,则可能需要进行练习。

本地文件

第二种方式是将JSON作为文件放置为文件并读取它。但是,JSON在结构上由数据处理,但它是编辑JSON并手动编辑它的劳动力。因此,有一种方法可以以易于处理的数据格式编辑数据并将其转换为ef。这是最着名的例子,它应该转换为JSON格式,准备在CSV中excel中编辑的文件。这是本地完成的好处,因此它是一个不容易测试和编辑的点。如果您想暂时制作设计和功能,让我们在本地实时进行实验。

概括

怎么样。 JSON是一种非常易于处理数据的工具。但是,这是JSON结构的设计和应该在场景中使用的部分非常重要。顺便说一下,实施中的Novell游戏的例子是我在大学所做的。如果有多次加载次数和试验结果的结果,请通过根据您的游戏重复练习来佩戴最佳实践。

给这篇文章的人

assa

我正在京都做工程师。记得阿萨或八个。 主要业务是网络中的爱好。好的