これちのPost-it

技術ネタをペラペラと

Unityで気象情報をWebから取得し、1日の天気を表示してみる

作りたいもの

Unityを使って気象情報を取得し、1日の天気や取得した瞬間の天気を取得する。
用途としては例えば、ダイアリーアプリを作る時に天気の情報を載せたり、Unityで作ったゲーム内の天気を現実の天気に合わせるのにも使えそう。

今回使用するWebAPI

DarkSky.netという気象情報サービスを使用します。
URLはここ
f:id:korechi:20170801231014p:plain:w600
1日に1000リクエストまで無料でAPIを使用することができます。それ以降は課金が必要となり、適宜請求が来るみたいです。

他の気象情報API

他の気象情報を取得できるサービスとして、例えば
OpenWeatherMap
あたりがあります。
これもフリーで利用できるAPIが提供されており、1日のうち3時間ごとの天気などが取得可能です。
地点はTokyo,jpのように、大まかな範囲で指定できます。
このサービスは完全にフリーでリクエストごとの課金とかがありません。なので使っていて安心なのですが、緯度経度が指定できたり、1時間ごとの天気を取得できるDarkSky.netを今回使用します。

DarkSky.netのAPIの使い方

このサービスを使用するにはまずサインインする必要があるため、上にあるDevelopersをクリックしてサインアップしてください。
f:id:korechi:20170801231100p:plain:w400
そしてシークレットキーを取得してください。
URLリクエストに使うURLは以下のようになります。

https://api.darksky.net/forecast/<Secret Key>/<longitude>,<latitude>

longitudeには、気象情報を取得したい地点の緯度を、latitudeには経度を入れてください。
このURLリクエストを行うと、JSON形式で気象データが受信できます。
f:id:korechi:20170801232450p:plain
ただしこのままだと非常に見づらいので、自分の欲しいデータだけうまいこと取得する必要があります。

Unityで気象情報を取得してみる

UnityからWebAPIを叩く

WWWクラスを使います。

public class ExampleClass : MonoBehaviour {
    // 適切な値を埋め込んでください
    string url = "https://api.darksky.net/forecast/<Secret Key>/<longitude>,<latitude>";

    IEnumerator Start() {
        WWW www = new WWW(url);
        yield return www;
        string jsonString = www.test;
        Debug.Log(jsonString);
    }
}

jsonStringオブジェクトに取得したJSONのテキストが格納されています。

位置情報を取得

これは、こちらのサイトが参考になりました。
[Unity] Unityで位置情報を取得する: ものづくりログ

JSONのパース

UnityにJSONのパーサはあったのですが、リストに対応していなかったりと使い勝手がイマイチっぽかったので、自分でJSONデータをパースしました。
パースとは言うものの、JSONのデータをstring型の変数として格納し、1文字1文字読み進めていき文字列を地道に探すというやり方です(非効率ですみません)。
例えば上のJSONをよーく見ると"summary":"Partly Cloudy"という部分が天気を表しているらしいことが分かります。
そのためsummaryの次の"“で囲まれている部分のstringを取り出せば天気が取得できたことになります。 サンプルコードは下のようになります。

for (;; ) {
  // summaryから始まる部分を探す
  if (jsonString.StartsWith("summary")) {
    // summaryの次のstringを抜き出す処理
    // "summary":" の部分がいらないため11文字Removeする
    jsonString.Remove(0, 11);
    string weather = "";
    int i = 0;
    while (jsonString[i] != "\"") {
      i++;
      weather += jsonString[i];
    }
  } else {
    // 1文字目を削除->jsonStringを先に進めていくイメージ
    jsonString = jsonString.Remove(0, 1);
  }
}

こうしてjsonStringから天気の情報を抜き出すことができます。(正確なコードではないので適宜修正して下さい)
時間については"time":1501596000の部分に記載されているため上と同様にすることで時間も取得できます。
ただしこれはUNIX時間なので日本時間に直す処理は別途必要となります。
あとは取得した情報をUniyで表示してあげれば終了です。

サンプルコード

緯度経度を取得し、気象情報を取得しログに出力するサンプルコードをのせておきます。