Hiromuブログ

最近はこちら(https://zenn.dev/hiromu)が本体

ダイナミック天気予報

UnityでJSONデータを処理してみたかったので、WebAPIを利用して取得した情報をHoloLensに表示するコンテンツを作成してみました。


実行動画

天気情報を取得し(無駄に)ダイナミックに表示しています。アイコン等で邪魔にならない程度に表示したほうが良いと思います(笑)


天気情報

天気情報はお天気Webサービス(Livedoor Weather Web Service)を利用して取得しています。

JSONの処理はJsonUtility.FromJsonで行っています。内部でUnityのシリアライザーを利用しているため、Serializable 属性を付けたりpublicである必要があるようです。

using System;
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;

/// 
/// お天気WebサービスLivedoor Weather Web Service)のjsonデータを取得する
/// http://weather.livedoor.com/weather_hacks/webservice
/// 
public class GetWeatherJson : MonoBehaviour {
    #region JsonData
    /// 
    /// Jsonデータ
    /// 
    [Serializable]
    public class JsonData
    {
        public string title;
        public Description description;
        public Forecast[] forecasts;
    }

    /// 
    /// 天気概況文情報
    /// 
    [Serializable]
    public class Description
    {
        public string text;
    }

    /// 
    /// Forecast情報
    /// 
    [Serializable]
    public class Forecast
    {
        public string date;
        public string telop;
        public ForecastImage image;
        public Temperature temperature;
    }

    /// 
    /// 画像情報
    /// 
    [Serializable]
    public class ForecastImage
    {
        public string title;
        public string url;
    }

    /// 
    /// 気温情報
    /// 
    [Serializable]
    public class Temperature
    {
        /// 
        /// 最高気温
        /// 
        [Serializable]
        public class Max
        {
            public string celsius;
            public string fahrenheit;
        }

        /// 
        /// 最低気温
        /// 
        [Serializable]
        public class Min
        {
            public string celsius;
            public string fahrenheit;
        }

        public Max max;
        public Min min;
    }
    #endregion

    /// 
    /// Jsonオブジェクト
    /// 
    public JsonData json;

    /// 
    /// 東京の天気予報URL
    /// 
    private string url = "http://weather.livedoor.com/forecast/webservice/json/v1?city=130010";

    /// 
    /// コルーチン実行中かどうか
    /// 
    private bool isRunning = false;

    void Start ()
    {
        StartCoroutine(GetJson());
    }
    
    /// 
    /// 天気情報jsonを取得する
    /// 
    /// 
    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(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の部分は別ファイルに分けてもよいかもしれません)


上記スクリプトを適当なGameObjectにつけて実行すると、天気情報が取得できます。(実際はタップしたときにGetJson処理が走るようにしています)

あとは取得した情報をもとに表示を切り替えたりすれば完成です。利用したお天気Webサービスではtelopレスポンスが「晴れ、曇り、雨など」といった情報しかないのですが、実際は晴時々曇など様々な文字列が返ってくるので1文字目だけ見て処理を分けるようにしました。


エフェクト

利用したエフェクトについては以下本にすべて作り方が書かれています。かっこいいエフェクトが自分で作れるようになるのでお薦めです。