UnityでJSONデータを処理してみたかったので、WebAPIを利用して取得した情報をHoloLensに表示するコンテンツを作成してみました。
実行動画
天気情報を取得し(無駄に)ダイナミックに表示しています。アイコン等で邪魔にならない程度に表示したほうが良いと思います(笑)
天気情報
天気情報はお天気Webサービス(Livedoor Weather Web Service)を利用して取得しています。
JSONの処理はJsonUtility.FromJsonで行っています。内部でUnityのシリアライザーを利用しているため、Serializable 属性を付けたりpublicである必要があるようです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 | using System; using System.Collections; using UnityEngine; using UnityEngine.Networking; /// <summary> /// お天気Webサービス(Livedoor Weather Web Service)のjsonデータを取得する /// http://weather.livedoor.com/weather_hacks/webservice /// </summary> public class GetWeatherJson : MonoBehaviour { #region JsonData /// <summary> /// Jsonデータ /// </summary> [Serializable] public class JsonData { public string title; public Description description; public Forecast[] forecasts; } /// <summary> /// 天気概況文情報 /// </summary> [Serializable] public class Description { public string text; } /// <summary> /// Forecast情報 /// </summary> [Serializable] public class Forecast { public string date; public string telop; public ForecastImage image; public Temperature temperature; } /// <summary> /// 画像情報 /// </summary> [Serializable] public class ForecastImage { public string title; public string url; } /// <summary> /// 気温情報 /// </summary> [Serializable] public class Temperature { /// <summary> /// 最高気温 /// </summary> [Serializable] public class Max { public string celsius; public string fahrenheit; } /// <summary> /// 最低気温 /// </summary> [Serializable] public class Min { public string celsius; public string fahrenheit; } public Max max; public Min min; } #endregion /// <summary> /// Jsonオブジェクト /// </summary> public JsonData json; /// <summary> /// 東京の天気予報URL /// </summary> private string url = "http://weather.livedoor.com/forecast/webservice/json/v1?city=130010"; /// <summary> /// コルーチン実行中かどうか /// </summary> private bool isRunning = false; void Start () { StartCoroutine(GetJson()); } /// <summary> /// 天気情報jsonを取得する /// </summary> /// <returns></returns> private IEnumerator GetJson() { if(isRunning) { yield break; } isRunning = true; var request = new UnityWebRequest(); request.downloadHandler = new DownloadHandlerBuffer(); request.url = url; request.SetRequestHeader("Content-Type", "application/json; charset=UTF-8"); request.method = UnityWebRequest.kHttpVerbGET; // リクエスト送信 yield return request.Send(); // 通信エラーチェック if(request.isNetworkError) { Debug.Log(request.error); } else { if(request.responseCode == 200) { // UTF8文字列として取得する string text = request.downloadHandler.text; //Debug.Log(text); // JSON からオブジェクトを作成 json = JsonUtility.FromJson<jsondata>(text); Debug.Log(json.title); Debug.Log(json.description.text); for(int i = 0; i< json.forecasts.Length; i++) { Debug.Log(json.forecasts[i].date); Debug.Log(json.forecasts[i].telop); Debug.Log(json.forecasts[i].image.title); Debug.Log(json.forecasts[i].image.url); Debug.Log(json.forecasts[i].temperature.max.celsius); Debug.Log(json.forecasts[i].temperature.min.celsius); } } else { Debug.Log("error : " + request.responseCode); } } isRunning = false; } } </jsondata> |
利用していない情報もたくさん取得していますが、参考として。(JsonDataの部分は別ファイルに分けてもよいかもしれません)
上記スクリプトを適当なGameObjectにつけて実行すると、天気情報が取得できます。(実際はタップしたときにGetJson処理が走るようにしています)
あとは取得した情報をもとに表示を切り替えたりすれば完成です。利用したお天気Webサービスではtelopレスポンスが「晴れ、曇り、雨など」といった情報しかないのですが、実際は晴時々曇など様々な文字列が返ってくるので1文字目だけ見て処理を分けるようにしました。
エフェクト
利用したエフェクトについては以下本にすべて作り方が書かれています。かっこいいエフェクトが自分で作れるようになるのでお薦めです。