kazumalab tech log

流行りとリラックマと嵐が大好きです。技術的ログ。

UnityでGoogleMapを表示する方法

かずまです。


今回はUnity上でGoogleMapを表示する方法を書いておきたいと思います。

f:id:kazumalab:20161026080137p:plain

流れ

  1. GoogleMapの緯度経度を地名から取ってくる
  2. GoogleAPIに緯度経度を投げて帰って来た画像を表示する

この2つになります。

緯度経度を取ってくる方法

色々あるとは思いますが、これいいな、と思ったので僕はコレにしました。

http://www.geocoding.jp/

このサイトを使います。
パラメーターに地名を渡すだけでXML形式で緯度経度が返って来ます。

こんな感じです。
f:id:kazumalab:20161026075121p:plain

Unityではサーバーから何かダウンロードしてきたり、GET、POSTリクエストをする場合にはIEnumerator(非同期処理)を使うのでそれで書いていきます。

クラスを作ってAPIで呼び出せるようにする

今回はGmapというClassを作り、その中に記載していきます。
呼び出す側のコードを減らすためです。

呼び出し方の成功例

// GmapTest.cs
private IEnumerator Start () {
  Gmap gmap = new Gmap ("東京");
  Coroutine getGeo = StartCoroutine( gmap.GetGmap ());
  yield return e;
  print ("東京(" + gmap.Latitude + " ," + gmap.Longitude + ")");
  
  Coroutine getImage = StartCoroutine(gmap.GetImage ());
  yield return getImage;
}

Coroutineで受け止めているのはStartCoroutineの処理が終わったときに次の処理に移ると言うものです。

getImageまで終わればgmap.textureでGmapのImageが取れているはずなのでPlaneなどのTextureに入れて上げればOKです。


今回Includeするのは

// Gmap.cs
using UnityEngine;
using System.Collections;
using System.Xml; # 返って来たXmlを解析するため
using System; # double型にConvertするため

Gmap.csを書く


C#のGet, Setを使う

プロパティーをそのまま触らずにゲッター、セッターを使って書いています。
参考URL プロパティ - C# によるプログラミング入門 | ++C++; // 未確認飛行 C

XmlDocumentを使う

// L43あたり
xmlDoc.LoadXml (www.text);

これでWWWで返ってきた文字列をXMLで読み取ります。
その後

XmlNodeList nodes = xmlDoc.GetElementsByTagName ("result");

ここでresultというタグを取ってきます。
Nodesの中にはcoordinateというタグがあり、その下にlatitude, longitudeがあります。
そこを取ってくればいいわけですね。

WWWクラス

GetImageするところの実装ですが、Unity C#ではWWWを使ってダウンロードします。
GetImageをするときに

WWW www = new WWW (url);
		while (!www.isDone) {
			print (www.progress * 100 + "%");
		}
		yield return www;

このようにするとダウンロードされているものが今何%かを知ることができます。
参考URL Unity - スクリプトリファレンス: WWW

最後に

今のところコレだとタダ画像を取ってきてるだけなので残念ながらGoogleMapのようにスクロール、ピン留めなどはできません。

ちょっと残念。