はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】Jsonを最初から簡単にまとめてみた

はじめに

今回はJsonとはなにかから、UnityでJsonを読み込むまでについての記事になります!

Jsonと聞いてなんとなく知っているけれど、使ったことがないという人も多いのではないでしょうか。

かくいう私が少し前までそうだったのですが、データの管理方法の一つとしてJsonは非常に適しています。

例えば、WebサーバーにJsonのデータを置くことで、ゲーム内にセリフなどの情報を書かなくとも読み込むことなども可能になります。

Jsonを勉強する準備

Jsonを自分で書くにあたってネット上の便利なサービスがあります。

jsoneditoronline.org

このJsoneditor online非常に分かりやすく、自分で書いたコードをダウンロードしたりすることもできます

またオンライン上で使えるので、勉強には最適といえるでしょう。

Jsonの概要

Jsonの構造はとてもシンプルなので、すぐに覚えられると思います。Jsonの基本構造はこの2つです。

・key(名前)/value(値)のペアの集まり(連想配列のイメージ)

・値の順序付きリスト(配列のイメージ)

ひとつずつみていきましょう。

key(名前)/value(値)のペアの集まり

さきほどのJsoneditor onlineに以下のコードを打ち込んでみましょう。

{ "id" : 1, "name" : "hanachiru", "isHuman" : true}

f:id:hanaaaaaachiru:20190424184316p:plain

これは、
idというkey1という数値
nameというkeyhanachiruという文字列
isHumanというkeytrueという真偽値
を関連付けている、という意味になります。

値の順序付きリスト

{
 "UserInfo" : [
    { "id" : 1, "name" : "hanachiru", "isHuman" : true },
    { "id" : 2, "name" : "slime", "isHuman" : false },
    { "id" : 3, "name" : "momonja", "isHuman" : false }
   ] 
}

f:id:hanaaaaaachiru:20190424190317p:plain

このように[]で囲うことで配列を作ることができます。

以上のたった2つのルールだけでJsonを操れるというわけです。

組み合わせて使ってみる

{
 "userInfos" : [
    { "id" : 1, "name" : "hanachiru", "tel" : { "homePhone" : "XXX-XXX-XXX", "mobilePhone" : "YYY-YYY-YYY"} },
    { "id" : 2, "name" : "Mr.X", "tel" : { "homePhone" : "XXX-XXX-XXX", "mobilePhone" : "YYY-YYY-YYY"} },
    { "id" : 3, "name" : "Ms.Y", "tel" : { "homePhone" : "XXX-XXX-XXX", "mobilePhone" : "YYY-YYY-YYY"} }
   ] 
}

このjsonを実際にUnityで使ってみたいと思うので、こちらのjsonを作成、ダウンロードしちゃいましょう。

jsonをダウンロード

さきほど書いたjsonをダウンロードしてUnityで使ってみましょう。

右上にあるSaveSave to diskをクリックすれば、ダウンロードすることができます。

f:id:hanaaaaaachiru:20190424191119p:plain

ダウンロードしたJsonをUnityへインポートすると、以下のようなアイコンがでるはずです。

f:id:hanaaaaaachiru:20190424191713p:plain

これを今回はローカルから動的に参照するために、Resourcesフォルダを作成し、そこにjsonを入れます。

f:id:hanaaaaaachiru:20190424201325p:plain

データ取得用のクラスを作る

まずはJson形式で保存したい変数をもったクラスを作成する必要があります。
さきほどのサンプルに対応したクラスを作成してみました。

JsonReader.cs
using UnityEngine;

[System.Serializable]
public class JsonData
{
    public UserInfo[] userInfos;
}
[System.Serializable]
public class UserInfo
{
    public int id;
    public string name;
    public TelephoneNumber tel;
}

[System.Serializable]
public class TelephoneNumber
{
    public string homePhone;
    public string mobilePhone;
}

ファイルの読み取り

JsonUtilityを使うことで簡単にJsonを読み取ることができます。

JsonReader.cs
using UnityEngine;

[System.Serializable]
public class JsonData
{
    public UserInfo[] userInfos;
}
[System.Serializable]
public class UserInfo
{
    public int id;
    public string name;
    public TelephoneNumber tel;
}

[System.Serializable]
public class TelephoneNumber
{
    public string homePhone;
    public string mobilePhone;
}

public class JsonReader : MonoBehaviour
{
    private void Start()
    {
        //Resourcesからdocument.jsonを読み込み、string型にキャスト
        string json = Resources.Load<TextAsset>("document").ToString();

        //JsonData型のインスタンスを作成
        JsonData jsonData = new JsonData();

        //jsonのデータをjsonDataに格納
        JsonUtility.FromJsonOverwrite(json, jsonData);

        //出力
        foreach(var item in jsonData.userInfos){
            Debug.Log("id: " + item.id);
            Debug.Log("name: " + item.name);
            Debug.Log("homePhone: " + item.tel.homePhone);
            Debug.Log("mobilePhone: " + item.tel.mobilePhone);
        }
    }
}

このようにしてJsonを読み込むことができます。

ただ一番気を付けなければならないことは、Jsonでのkey名とそれに対応した変数名を一致させなければならないことです。

私はこれでかなりの時間悩んでしましました。

f:id:hanaaaaaachiru:20190424212155p:plain

さいごに

これでJsonの作成方法から、実際にUnityでJsonを使うところまではできました。
次はネット上にJsonを置き、ゲームでそれを読み込む方法について書いてみたいと思います!

www.hanachiru-blog.com