Unityではデータを文字列で保存する場合Jsonデータという形式を使います。というかUnityにかぎらずJsonデータの形式はよく利用されます。Jsonデータの基本とUnityでの利用方法を覚えましょう
Jsonデータの基本を知る
Jsonデータの基本やどういった形式のものなのかを覚えましょう。知らなくても使うことは出来ますが、実際のデータを知っている方が、何かあったときに解析の役にたちますよ
Jsonデータとは
Jsonデータとは、言ってみればただの文字列です。文字列内の形式が一定のルールで記載することで様々なデータを保存することができます。ちなJavaScript Object Notation の略。
機能 | フォーマット | 補足 |
---|---|---|
データの開始終了 | {} | {に始まり}に終わります |
データの基本 | “key” : 123 | データはキーの文字列コロン「 : 」パラメータという感じで保存されます 左の例ではkeyという文字列で123という数字を保存 |
データの区切り | “key1” : 123 , “key2” : “moji” | データ間はカンマ「 , 」で保存区切られます。 区切りになる部分では改行してもOK |
実際のデータは以下のような感じで表されます
{
"key1":123,
"key2":"mojiretsu"
}
- 文字コードは UTF-8 固定。
- バイトオーダーマーク (BOM) を先頭につけてはならない。
データの型について
Jsonデータで保存できるデータは以下
- 文字列
- 数値
- null
- bool
- オブジェクト
- 配列
データの型 | 説明とサンプル |
---|---|
文字列 | 日本語や数字なども保存出来ます。一部の記号はエスケープする必要あり { “name”:”たろー” } |
数値 | 数値はダブルコーテーションで囲まなくてもOK。 囲んでしまうと文字列になります { “suuji”:123 } |
null | null型を使う場合。全部小文字 { “id”:null } |
bool | 真偽値。ダブルクォーテーションなし。小文字で記載。 { “真”:true, “偽”:false } |
オブジェクト | Jsonデータの中にJsonデータを入れるイメージ。 { “object”:{ “key1”:123, “key2″:”mojiretsu” } } |
配列 | [ ]を使って表現します。配列を含む全てのデータ形式を配列にすることが出来ます { “string_list” : [ “赤” , “緑” , “青” ] , “num_list” : [ “123” , “456” , “789” ] } |
JsonUtility:UnityでJsonデータを使う
JsonデータをUnityで使う場合、自分でJson形式のデータを作ったり、自前の解析プログラムを作る必要はありません。JsonUtilityを使うことで簡単にやり取りが出来ます。
Jsonデータを作る
UnityでJsonデータを作る場合、JsonUtilityのメソッドを使うことで簡単に出来ます。例えばTestObjectというstruct(構造体)を作り、それをJsonデータに変換してみたいと思います。作られたJsonデータを文字列に出力してコンソールビューに表示させてみたいと思います。
using UnityEngine;
[System.Serializable]
struct TestObject
{
public string jobName;
public int level;
}
public class Testing : MonoBehaviour
{
void Start()
{
TestObject testObject = new();
testObject.jobName = "勇者";
testObject.level = 12;
Debug.Log(JsonUtility.ToJson(testObject, true));
}
}
出力結果
{
“jobName”: “勇者”,
“level”: 12
}
System.Serializable
Jsonデータに変換したい構造体(struct)にはSystem.Serializable属性を付与する必要があります。この属性を追加された構造体でなければJsonデータに変換することが出来ません。
また、対象の構造体のメンバー変数はpublicでなければアクセスできません。
JsonUtility.ToJson
Jsonデータ化するメソッド。Serializableされているオブジェクトを引数に入れることで文字列として表示されます。
第2引数は不要ですが、trueを入れることで見やすくなります。通信データなどで使う場合は送受信するデータを減らしたほうが良いのでfalseもしくは第2引数無しで行うと良いでしょう。
Jsonデータからデータを取り出す
上記プログラムを使い、Jsonデータ(文字列)から構造体にデータを戻して見たいと思います。また、戻したデータをデバッグログに表示して確認してみます。今回は生データをFromJsonに突っ込みましたが、ToJsonでJsonデータに変換した文字列を突っ込んでも同じ結果が得られます。
void Start()
{
TestObject data = JsonUtility.FromJson<TestObject>(
"{\"jobName\": \"戦士\",\"level\": 11}");
Debug.Log($"jobName:{data.jobName}");
Debug.Log($"level:{data.level}");
}
jobName:戦士
level:11
ゲームで使う場合はPlayerPrefなどを活用
実際にゲームで使う場合はPlayerPrefなどを利用したり、サーバーとの通信データとして利用します。
ローカルで利用する場合はPlayerPref
文字列をキーとしてJsonデータを保存することで、セーブデータを簡単に作成することが出来ます。
PlayerPref単体だとデータの数が多くなりますが、Jsonデータで扱う分にはデータも増やしやすいですし、扱いも楽です。
サーバーとデータをやり取りする場合の注意
基本的にはJsonデータは文字列のため、サーバーとの連携にもってこいです。
が、少し注意が必要な点があります。それは型の不一致です。サーバー側では数値としてfloatとintを区別なく扱われている場合、int型にfloat型のデータを入れようとするとうまくいかなくなってしまいます。
このあたりはサーバーの人とうまくやりとりをすり合わせながら進めてください。