目次
はじめに
情熱開発部プログラマーの小川です。
今回はUnityでJsonを扱える「JsonUtility」についてまとめたいと思います。
JSONって?
jsonとは、決められたフォーマットで書かれるテキストのことを指します。
下記のようなフォーマットで書かれます。
{
"name":"LB",
"param":{
"hp":100,
"atk":20,
"def":15
}
}
ところで、jsonってなんで「json」っていうんですかね。。
金曜日のあれですかね?
初めてjsonファイルを聞いたときは物騒な名前のファイルだなと思ってました。
調べてみたところ「JavaScript Object Notation」の略で、JavaScriptのオブジェクトを作成する際の書き方を元にしたそうです。
なるほど、確かにJavaScriptでオブジェクトを定義するときに「{}」とか「:」を使ってますね。
<script>
var param = {
hp : 100,
atk : 20,
def : 15
}
</script>
XML
また、同じテキストベースのデータフォーマットとして「XML」があります。
こちらは HTMLのようにタグを使い、下記のようにデータを定義しています。
<?xml version="1.0" encoding="utf-8"?>
<data>
<name>LB</name>
<param>
<hp>100</hp>
<atk>20</atk>
<def>15</def>
</param>
</data>
jsonと見比べてみると、見づらいですね。。
自分だったらjsonを使います。
ということで改めて。。
このjsonをUnityで扱う方法をまとめていきます!
JsonUtilityを触ってみた
JsonUtilityのドキュメントで機能を見てみると。。
1.JsonUtility.FromJson()
2.JsonUtility.FromJsonOverwrite()
3.JsonUtility.ToJson()
関数が3つしかなくて非常に機能がシンプルですね。
ざっくり説明すると。。
1.Json → Object
2.Json → Object (上書き)
3.Json ← Object
って感じです。
ひとつづつ説明していきます。
JsonUtility.FromJson(string)
jsonからUnityオブジェクトへ変換する関数です。
引き数はstring型のjsonフォーマットのテキストになります。
先ずはUnity側で受け皿を用意します。
jsonの構造を元にとってくるので変数名はjsonのkeyと同じにしなければいけません。
また、JsonUtilityはUnity のシリアライザーを使用 するので必ず[System.Serializable]が必要になります。
詳しくはUnityドキュメントをご参照ください。
[System.Serializable]
public class PlayerClass
{
public string name;
public ParamClass param;
}
[System.Serializable]
public class ParamClass
{
public int hp;
public int atk;
public int def;
}
Unity側でのオブジェクトが出来たら、読み込みます。
//Assets/Resources/Filename
string json = Resources.Load<TextAsset>(Filename).ToString();
PlayerClass player= JsonUtility.FromJson<PlayerClass>(json);
今回はResourcesで読み込みました。
引数 はAssets/Resources以下からのパスです。
ログ出力をしてみると
できてますね。
このようにjsonをFromJsonで先ほど用意したオブジェクトPlayerClassに変換します。
非常にシンプルです。
JsonUtility.FromJsonOverwrite(string, object )
FromJsonOverwriteはFromJsonと少し似ています。
jsonから既存のUnityオブジェクトに上書きする関数です。
FromJsonで一度クラスに値を入れてから上書きしてみましょう。
string json = "{\"name\":\"LB\",\"param\":{ \"hp\":100, \"atk\":20,\"def\":15 }}";
PlayerClass player = JsonUtility.FromJson<PlayerClass>(json);
string newjson = "{\"name\":\"Logicalbeat\",\"param\":{ \"hp\":9999, \"atk\":20,\"def\":15}}";
JsonUtility.FromJsonOverwrite(newjson, player);
FromJsonとFromJsonOverwrite関数の下にログ出力を入れてみました。
ちゃんと上書きできましたね。
ちなみに上書きするオブジェクトの変数すべてに値が無いとエラーになるので注意です。
JsonUtility.ToJson(object)
Unityクラスからjsonを生成する関数です。
FromJsonの逆ですね。
値を入れてからjsonに変更してみます。
PlayerClass player = new PlayerClass();
player.param = new ParamClass();
player.name = "Json";
player.param.hp = 1000;
player.param.atk = 80;
player.param.def = 120;
string json = JsonUtility.ToJson(player);
ログ出力で確認してみます。
出来てますね。
引き数はjsonに変換したいインスタンスですが、第二引き数もありbool値で綺麗に整形するかどうか指定できるそうです。
string json = JsonUtility.ToJson(player,true);
なるほど、改行等が入って見やすくなりました。
このような感じでUnityでjsonを扱うことが出来るみたいです。
さらに上記の関数+αで、jsonを読み込んでScriptableObjectにしてもいいですし、エディタ拡張に組み込んでもいいですね!
エディタのみの場合は EditorJsonUtilityという派生型があります。
そして、JsonUtilityはパフォーマンスの面でも優れているようなので積極的に使っていきたいですね!
JsonUtility は(機能は .NET JSON より少ないですが)、よく使用されている .NET JSON よりも著しく早いことが、ベンチマークテストで示されています。
JSON 形式にシリアライズ
GCメモリの使用が、以下のように最小に抑えられています。
JsonUtility API はバックグラウンドスレッドからの呼び出しが許可されています
以上です。
この記事が参考になれば幸いです。
【免責事項】
本サイトでの情報を利用することによる損害等に対し、
株式会社ロジカルビートは一切の責任を負いません。