【輪講】UnityでJSONを読み込む(SimpleJSON)

Unityでゲームを作るうえで、エネミーのウェーブをソース内に書くとグチャグチャになる…ので外部からその辺のパラメータを取得したい。
という願望を叶えるためにJSONの書き方をお勉強しました。→「JSONの書き方」

今回の輪講で行う事

JSONからプレハブ・座標を指定して生成する

準備

①「SimpleJSON」のインポート
②JSONファイルの用意
③プレハブの用意

①「SimpleJSON」のインポート
今回はJSONパーサーとして「SimpleJSON」をインポートします。
パーサーとは「文法に従って分析」(パース)するもの。今回はC#で読み込んだテキストをJSONの文法に従って分析してくれるのでJSONパーサー。

「SimpleJSON.zipのダウンロードはこちらから」

解凍したものをUnityのプロジェクトにインポートしてください。

②JSONファイルの用意
サンプルを用意しました(.jsonに拡張子変更してください)→ObjectData.txt

{
    "ObjectsNum":2,
        "Objects":
        [
            {"Shape":"Cube","Pos":{"X":0,"Y":0,"Z":0}},
            {"Shape":"Sphere","Pos":{"X":0,"Y":2,"Z":0}}
        ]
}

JSONファイルはAssetsフォルダに保存してください。自分はAssetsにJsonフォルダを用意して保存しました。

内容の説明
「ObjectsNum」:生成するオブジェクトの数
「Objects」:どのプレハブをどの座標に出現させるかの値の配列

③プレハブの用意
先ほど用意したUnityのプロジェクトにJSONから指定するプレハブを用意します。
今回はCubeとSphereで良いです。

実践

JSONを読み込んでオブジェクトを生成するスクリプトを書いてみましょう。

JSONの読み込み
まずはJSONを読み込む関数「ReadFile()」を作ります。いろいろクラスを使うのでusingを忘れずに。

インスペクタから変更してほしい箇所
・m_jsonPass:Assetsフォルダ内にさらにフォルダを作ってJSONを保存した場合はAssets以下のパスを指定してください。私の場合は「”/Json/”」。
・m_jsonFileName:JSONファイルの名前を指定してください。今回は「”ObjectData.json”」。
・m_prefabsNum:今回はCubeとSphereの2個なので「2」。
・m_prefabs:インスペクタからまず配列のサイズを「2」に指定。あとは中に用意したプレハブを入れてください。
・m_prefabNames:m_prefabsに入れた順番のプレハブと対応するJSONに記述したShapeの値を入れてください。

using UnityEngine;
using System.Collections;
using System.IO;    //FileInfo・StreamReaderに必要
using System.Text;  //Encodingに必要
using SimpleJSON;

public class ObjectCreater : MonoBehaviour {

    private JSONNode m_jsonData;    //JSONファイルの中身
    public string m_jsonFilePass = "";  //JSONファイルの保存場所
    public string m_jsonFileName;   //JSONファイルの名前


    [SerializeField]
    private int m_prefabsNum;   //用意したプレハブの数
    [SerializeField]
    private GameObject[] m_prefabs = new GameObject[0]; //用意したプレハブ
    [SerializeField]
    private string[] m_prefabNames = new string[0]; //用意したプレハブに対応させる名前

    // 読み込み関数
    void ReadFile()
    {
        string fileText = "";

        // JSONファイルを読み込む
        FileInfo file = new FileInfo(Application.dataPath + m_jsonFilePass + m_jsonFileName);

        // 一行毎読み込み
        using (StreamReader sr = new StreamReader(file.OpenRead(), Encoding.UTF8))
        {
            fileText = sr.ReadToEnd();

            // JSONをパースして値を取り出す
            m_jsonData = JSONNode.Parse(fileText);
        }
    }
}

SimpleJSONを利用してJSONパーサー「JSONNode」を作ります。
FileInfoでJSONを読み込み、StreamReaderでエンコードしたものが「fileText」。
これをJSONNodeでJSON内で定義したkeyで扱えるようにパースしたものを「m_jsonData」に代入してます。

パースしたJSONの値を取り出す
「m_jsonData」を配列として扱い、keyを指定して値を取り出します。

・値を取り出す場合
以下のJSONファイルの場合

{
    "氏名":"田中太郎",
    "年齢":18
}
string name = (string)m_jsonData["氏名"];
int age = (int)m_jsonData["年齢"];

こんな感じ。[key]で指定した値を取り出せます。キャストが必要です。

・オブジェクトにオブジェクトが入っている場合

{
    "プロフィール":{
        "氏名":"田中太郎",
        "年齢":18
    }
}
string name = (string)m_jsonData["プロフィール"]["氏名"];
int age = (int)m_jsonData["プロフィール"]["年齢"];

多次元配列みたいにkeyを足していけばOK。

・配列から値を取り出す

{
    "名簿":[
        {
            "氏名":"田中太郎",
            "年齢":18
        },
        {
            "氏名":"山田花子",
            "年齢":19
        }
    ]
}
//田中太郎
string name1 = (string)m_jsonData["名簿"][0]["氏名"];
int age1 = (int)m_jsonData["名簿"][0]["年齢"];

//山田花子
string name2 = (string)m_jsonData["名簿"][1]["氏名"];
int age2 = (int)m_jsonData["名簿"][1]["年齢"];

C言語の配列と同じように要素番号を指定するだけです。

これらを活用してオブジェクトを生成する「CreateObjects()」を作りましょう。

void CreateObjects()
{
    int objectsNum = m_jsonData["ObjectsNum"].AsInt;

    for (int i = 0; i < objectsNum; i++)
    {
        GameObject obj = null;
        Vector3 pos = Vector3.zero;
        string shape = (string)m_jsonData["Objects"][i]["Shape"];

        //プレハブの指定
        for (int j = 0; j < m_prefabsNum; j++)
        {
            if (shape == m_prefabNames[j])
            {
                obj = m_prefabs[j];
            }
        }

        //位置の指定
        pos.x = m_jsonData["Objects"][i]["Pos"]["X"].AsFloat;
        pos.y = m_jsonData["Objects"][i]["Pos"]["Y"].AsFloat;
        pos.z = m_jsonData["Objects"][i]["Pos"]["Z"].AsFloat;

        if (obj != null)
        {
            //プレハブ生成
            UnityEngine.Object newObj = Instantiate(obj, pos, Quaternion.identity);
        }
    }
}

あとは「Start()」で「ReadFile()」と「CreateObjects()」を使用するようにすればスクリプトの完成です。
完成したスクリプトを適当なオブジェクトにAdd Componentすれば指定したオブジェクトが生成されます。うまくいかない場合はJSONファイル内のShapeのvalueとm_prefabNamesの値が一致しているか確認してみてください。

UnityでJSONを読み込む方法についての解説は以上。これを応用すればエネミーのウェーブの管理もできるはず。

【輪講】UnityでJSONを読み込む(SimpleJSON)” への1件のコメント

  1. ピンバック: 【輪講】JSONの書き方 | TRIDENT Mobile & Network Lab. Blog

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です