LoginSignup
7
7

More than 5 years have passed since last update.

JSONファイルをUnityで利用

Posted at

はじめに

まず完全に忘れておりました。大変申し訳ございませんんんんん。

で、今回ですが芸大の友人とADVゲーム作ろうという話になったんで、今回はティラノスクリプトや吉里吉里といった開発ツールは使わずにJSONファイルを利用して製作することにしました。

そのためにまずJSONファイルをUnityで扱う方法を勉強してみたのでそれをまとめます。
今回はWeather Hacksから天気情報を取ってきて今日、明日、明後日の天気情報を表示するUIをUnityで制作してみました。

JSONファイルの中身

上記のサイトでJSONファイルの中で今回使用するところを取り出すと以下の部分です。

{
   "forecasts":
   [
      {
       "dateLabel":"\u4eca\u65e5",
       "telop":"\u66c7\u6642\u3005\u96e8",
      },
      {
       "dateLabel":"\u660e\u65e5",
       "telop":"\u6674\u306e\u3061\u96e8",
      },
      {
       "dateLabel":"\u660e\u5f8c\u65e5",
       "telop":"\u66c7\u6642\u3005\u96e8",
      }
   ]
}

JSONファイルをUnityで取得

今回はJSONUtilityを使ってJSONファイルを取得する予定なので、JSONファイルの構造をスクリプト内で定義する必要があります。
Itemという名前は適当につけたものなのであしからず。

GetWether.cs

    [Serializable]
    public class Item{
        public forecasts forecasts;
    }

    [Serializable]
    public class forecasts{
        public string dateLabel;
        public string telop;
    }

JSONファイルを獲得し、そのファイルから成形したデータでインスタンスを生成する。
WWW (name)= new WWW(link);でリンク先のデータをダウンロードできます。
リンク先からnull値を返された時のためにコルーチンを使っていきます。
ダウンロードしたデータを使ってデータを成形し、それらをUnity上のオブジェクトにアタッチしましょう。

GetWeather.cs

    [SerializeField]
    public GameObject NodePrefab;

public void Getinfo() {
        StartCoroutine ("GetWeatherInfo");      //コルーチンを開始
    }

    IEnumerator GetWeatherInfo(){

        WWW www =new WWW("http://weather.livedoor.com/forecast/webservice/json/v1?city=130010");
        yield return www;

        //エラーが出た時
        if(!string.IsNullOrEmpty(www.error)){
            Debug.LogError (string.Format ("Fail Whale!\n{0}", www.error)); //エラーを表示
            yield break;
        }

        string jsonText = www.text;

        Item item =JsonUtility.FromJson<Item>(jsonText);

        for (int i = 0; i < 3; i++) {
            var node = Instantiate (NodePrefab, Content, false);
            var wn = node.GetComponent<WeatherNode> ();

            wn.dateLabel.text=item.forecasts[i].dateLabel;
            wn.telop.text = item.forecasts[i].telop;
        }
    }

インスタンス化するNodeにアタッチするスクリプトは以下。
dateLabelとtelopをUnityでアタッチする。

WheatherNode.cs
    [SerializeField]
    public Text dateLabel;

    [SerializeField]
    public Text telop;

こんな感じでやっていけばできると思います。

まとめ

Qiita書くのそもそも初めてなんでレイアウトとか変だったらごめんなさい。
JSONを利用する方法はUnityではあんまり使うことはないのかも...とやってるうちに思ったりましたが何かの助けになれば幸いです。

7
7
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
7
7