前回から UnityREST API(RESTful API)でのシステム連携の方法を説明しています。前回はREST APIの説明を主に行いました。


今回は具体的な Unityでの REST APIの使用法の解説と、実際に REST APIでの天気予報情報の取得方法を説明します。
Unity Basic_059

【UnityでREST APIの使用法】

では Unityで簡単な REST API接続を作ってみましょう。

ここでは、前回最初に紹介した「天気予報API(livedoor天気互換)」https://weather.tsukumijima.net/ )に REST API接続して情報を GETする部分を説明します。
(取得するデータは JSONデータですので、それを分解するのも含めた解説はこの後に説明します。)

まず、全体のソースを示します。
Unity Basic_060

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

using UnityEngine.Networking;

public class API_Test05 : MonoBehaviour
{
    void Start()
    {
        StartCoroutine(Get_WeatherInfo());
    }

    private IEnumerator Get_WeatherInfo()
    {
        //UnityWebRequestを生成
        UnityWebRequest webRequest
        = UnityWebRequest.Get("https://weather.tsukumijima.net/api/forecast?city=130010");

        //送受信開始
        yield return webRequest.SendWebRequest();

        if (webRequest.isHttpError || webRequest.isNetworkError)
        {
            //エラー確認
            Debug.Log(webRequest.error);
        }
        else
        {
            //結果確認
            Debug.Log(webRequest.downloadHandler.text);
        }
    }
}

【ソース解説】

UnityWebRequestに関して、重要な部分の解説します。

まず、UnityWebRequestを使うには「using UnityEngine.Networking;」が必要です。
 Unity Basic_061

UnityWebRequestの Getリクエストの結果を待つのでコルーチンで非同期処理としてメインのメソッドを呼び出す。
 Unity Basic_062

UnityWebRequestの Getリクエストを生成します。
 (ここで天気予報APIの URIを指定していますが、例として東京(city=130010)の天気を指定しています。)
 メソッドの指定が Postや Put等であれば、Get以外を使用します。
 Unity Basic_063

SendWebRequestで作成したリクエストを送信します。
 Unity Basic_064

 UnityWebRequestシステムエラーに対するエラー処理を記述します。
 (isHttpError: HTTP response codeがエラーを示したらTrue、isNetworkError: UnityWebRequestシステムエラーが発生したらTrue)
 Unity Basic_065

DownloadHandlerが受け取ったリクエストに対する応答の中身を直接確認。
 ここではJSONデータがそのまま確認できます。
 Unity Basic_066


このプログラムの実行結果は以下の様になります。REST APIで取得した天気情報の中身が JSON形式で表示されています。
Unity Basic_067



【Unityで天気予報データの取得】

次に今取得した「天気予報API(livedoor天気互換)」の天気予報JSONデータを分解してプログラム内で使用できるようにしてみましょう。

ここでは、ソースは全て載せておきますが、REST API接続での情報取得は前のプログラムと完全に同じなので説明は省きます。(必要な場合、前の章の説明をご確認下さい。)
まず、全体のソースを示します。

Unity Basic_068

Unity Basic_069

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

using UnityEngine.Networking;
using LitJson;

public class API_Test03 : MonoBehaviour
{
    void Start()
    {
        StartCoroutine(Get_WeatherInfo());
    }

    private IEnumerator Get_WeatherInfo()
    {
        //UnityWebRequestを生成
        UnityWebRequest webRequest 
        = UnityWebRequest.Get("https://weather.tsukumijima.net/api/forecast?city=130010");

        //送受信開始
        yield return webRequest.SendWebRequest();

        if (webRequest.isHttpError || webRequest.isNetworkError)
        {
            //エラー確認
            Debug.Log(webRequest.error);
        }
        else
        {
            //結果確認
            Debug.Log(webRequest.downloadHandler.text);

            //JSON変換
            JsonData jsonData = JsonMapper.ToObject(webRequest.downloadHandler.text);

            Debug.Log(jsonData["title"]);
            Debug.Log(jsonData["description"]["text"]);
            Debug.Log(jsonData["forecasts"][0]["date"]);
            Debug.Log(jsonData["forecasts"][0]["telop"]);
            Debug.Log(jsonData["forecasts"][0]["temperature"]["max"]["celsius"]);
            Debug.Log(jsonData["forecasts"][0]["chanceOfRain"]["18-24"]);
            Debug.Log(jsonData["forecasts"][1]["date"]);
            Debug.Log(jsonData["forecasts"][1]["telop"]);
            Debug.Log(jsonData["forecasts"][1]["temperature"]["max"]["celsius"]);
            Debug.Log(jsonData["forecasts"][1]["chanceOfRain"]["18-24"]);
            Debug.Log(jsonData["location"]["city"]);
        }
    }
}

【ソース解説】

UnityWebRequestに関する解説は前章をご覧ください。ここでは JSON変換の部分を説明します。

ここでは Unity標準の JsonUtilityを使わず、LitJSON を使用しています
その理由はこの天気予報APIで帰ってくる JSON形式が階層が深く複雑であるためです。天気の情報を取得してアプリを作りたいわけでなく、APIのテストを少しやることが今回の目的であるので JsonUtilityでJSON形式のクラスの定義が面倒かと思います。

LitJSONであると Unity標準ライブラリではないので下準備は必要ですが、LitJSON自体の使用法は以前紹介していますので、そちらをご覧ください。



まず、LitJsonを使うには「using LitJson;」が必要です。
 Unity Basic_070

DownloadHandlerが受け取ったリクエストに対する応答を JsonMapperで変換します。
 Unity Basic_071

プログラムで利用できる形に分解した天気情報を Debug.Logで表示してみます。
 Unity Basic_072

このプログラムの実行結果は以下の様になります。プログラムで利用できる形に分解した天気情報がそれぞれ表示されています。
Unity Basic_073


【注意事項】

「天気予報API(livedoor天気互換)」のサイトでも注意事項として書かれている通り、明後日のデータは基本的にとれず、時間帯によっては一部の情報がとれない場合もあるそうです。
その場合「null」が返ってきて、上記のプログラムもエラーが出る場合がありますので、その部分をコメントアウトするか、時間帯をずらしてお試しください。
Unity Basic_074



Sponsored Link