3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

JSONをUnityで読み込んでみる

Last updated at Posted at 2021-11-11

#JSONをUnityで読み込んでみる
一旦簡単な解説を殴り書きで書いてます。
また時間があれば詳しく書いていきたいと思います。

##そもそもJSONって何??
めちゃくちゃ詳しく書くとこんな感じらしい
JavaScript Object Notation(JSON、ジェイソン)はデータ記述言語の1つである。軽量なテキストベースのデータ交換用フォーマットでありプログラミング言語を問わず利用できる。名称と構文はJavaScriptにおけるオブジェクトの表記法に由来する。
wikipediaから引用 https://ja.wikipedia.org/wiki/JavaScript_Object_Notation
簡単に言うとゲーム等で使うデータを保存するものという認識で概ねOK!


でも、まだ言葉だけだと難しいと思うので、実際にJSONを見てみましょう!
下の例はJobAttackerHp100あるキャラクターのJSONデータです
{} でデータ全体を括って、その中の左側にHpやJobといったキー,右側に100や"Attacker"といったを記入します。
記入したデータのキーと値の間には:を書いて、データの区切りには,をつけましょう

JSONの例
{
  "Hp" : 100,
  "Job" : "Attacker",
}

また、同じような形のJSONのデータセットを利用するために配列を使うこともできます

JSONの例
[
  {
    "name": "Sato",
    "Hp" : 100,
    "Job": ["Attacker", "Healer"],
    "alive": true
  },
  {
    "name": "Mori",
    "Hp" : 20,
    "Job": ["Magician", "Teacher"],
    "alive": true
  }
]

##JSONをUnityで動かしてみよう

1. 必要なライブラリ2つをダウンロードしよう

JsonNode.cs

MiniJSON.cs

URL先の「Download ZIP」からダウンロードすることができます!
how to dl

2. ライブラリをUnityへインポートしましょう

ProjectウィンドウへJsonNodeMiniJSONスクリプトが追加されていればOKです!
how to import

3. 今回のテスト用にJSONを作成しよう

今回使ったjsonのデータは↓になります。

Test.json
{
  "title": "TestTittle",
  "notes": [
    {"timing": "0.5","type": "A"},
    {"timing": "3","type": "B"},
    {"timing": "6.5","type": "A"},
    {"timing": "7","type": "B"}
  ]
}

もし新規でJSONファイルを作れなかった場合は↓先のリンクからDLしてください!
https://drive.google.com/file/d/1EeL2EPjr_784TmYQWWGASbnrO4I_DcXw/view?usp=sharing
Testと書かれたファイルを追加できていればOKです!
clear to import

4. JSONを読み込むコードを書いてみよう

新しくJsonLoaderというスクリプトを作成してコードを以下のように書いてみましょう
詳しい解説は下の方でやっていきます!

JsonLoader.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class JsonLoader : MonoBehaviour
{
    public TextAsset textAsset;
    // Start is called before the first frame update
    void Start()
    {
        string jsonText = textAsset.ToString();
        JsonNode json = JsonNode.Parse(jsonText);
        //Json上にある"title"の値を表示する
        Debug.Log(json["title"].Get<string>());
        
        foreach (JsonNode note in json["notes"])
        {
            string type = note["type"].Get<string>();
            float timing = float.Parse(note["timing"].Get<string>());
            Debug.Log(type +" : "+ timing);
        }
    }
}

5. 書いたコードをアタッチしよう

a. 新しいゲームオブジェクトを作ってそこへ作ったJsonLoaderをアタッチしましょう!
clear to import
b. Json Loader内のText Assetへ先ほど作った Test.jsonをアタッチ
clear to import

6. 書いたコードを実行してみよう

実行してこんな感じに表示されたらOK!
clear to import
UnityのConsoleウィンドウへ↓のコードにある水色部分全てが表示されるようになりました!
clear to import

これでファイルの読み込み自体は完了です!

コードの中身について軽く解説

Text Assetとは

Text Asset は、インポートされたテキストファイルのための形式です。プロジェクトフォルダーにテキストをドロップすると、テキストアセットに変換されます。以下のファイル形式がサポートされています。
使えるファイル形式は「txt,html,htm,xml,bytes,json,csv,yaml,fnt」が使えます。
Unity公式リファレンスから:テキストアセット

つまり、txtのようなテキストファイルをUnityで使えるようにするものということです!
今回の場合だとTest.jsonをプログラムで使う為以下のコードを書いています!

public TextAsset textAsset;

JSONの読み込み

先ほど読み込んだtextAssetをstring(文字列)として扱う為にToString()で変換しています

string jsonText = textAsset.ToString();

文字列に変換したJSONのデータはこのままではただの文字列でしかないので、この文字列はJsonだよー!と教えてあげる為にParseというものを行います。
(参照) JsonNode.Parse メソッド

JsonNode json = JsonNode.Parse(jsonText);

JSONデータの表示(1)

JSON内のデータからキー:tittleと書かれている部分のデータをstring(文字列)として取得して、その後Debug.Logを用いてUnityのConsoleウィンドウで表示しています。

//Json上にある"title"の値を表示する
Debug.Log(json["title"].Get<string>());

↑のコードを実行すると↓のデータを取得することができるようになりました!

"title": "TestTittle"

JSONデータの表示(2)

次は、このような↓JSONの配列を読み取っていきます。

"notes": [
    {"timing": "0.5","type": "A"},
    {"timing": "3","type": "B"},
    {"timing": "6.5","type": "A"},
    {"timing": "7","type": "B"}
  ]

今回みたいにデータの個数が不明な場合に、データの個数回だけ読み込みを行い時はforeachと呼ばれるものを使います。
foreach文はデータの回数分処理が実行されるループ文(for文やwhile文の仲間!)です!
結果的に指定した配列などのデータ全ての要素を読み取ることができます。


例として以下のコードを書いてみます。
実行してみるとaaa,bbb,cccの順でconsoleに表示されます。
つまりforeach文によって「1回目のループでaaa,2回目のループでbbb,3回目のループでccc」iへ代入されていることがわかりました!

string[] array = { "aaa", "bbb", "ccc" };
//配列の個数の回数だけ処理を実行する
foreach(string i in array)
{
    Debug.Log(i);
}

では、最後に今回書いたコードについて見てみましょう!
a. まずforeach文を使ってキー"notes"にあるデータの個数回、処理を行っています。(今回の場合だと4回ですね)
b. そして、その処理の中でキー"type"と"timing"を読み込んでいます(読み込みの書き方は"tittle"の時とおなじ!)
c. timingは文字列ではなくで数値なので、float.Parse を用いて変換してます!
d. Debug.logを使ってUnityのconsoleで表示!

foreach (JsonNode note in json["notes"])
{
     string type = note["type"].Get<string>();
     float timing = float.Parse(note["timing"].Get<string>());
     Debug.Log(type +" : "+ timing);
}

これで読み込みに関する軽めの説明もおしまいです!

最後に

今回はJSONを初めて使う人も多いかと思い、必要最低限の説明と解説だけを記載していますが、是非興味を持たれた方はJSONをゲーム等へ積極的に使ってもらえたら嬉しいです!

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?