7
7

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 5 years have passed since last update.

東京理科大学Advent Calendar 2018

Day 8

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?