はじめに
テクロスというゲーム会社で学生バイトとしてゲームを作ってる駆け出しプログラマーです。現在mapboxを用いたゲームの製作を行なっています。
mapboxはいいぞって話は他の人に任せます。
この記事は多分初心者向けです。ここでつまずかない人は中級以上や、、
問題発生
Unity で地図が表示可能な mapbox を触ってみた(初級編)等を見ながら設定すれば容易くmapを表示させることができました。
でもこれスクリプトからどうやって動かすんだ??って思って調べてたらインスタンス化やvirtualについてよく分かっておらずつまずきまくったのでまとめておきます。
状況確認
上の画像に載ってるように、どうやらAbstractMapというscriptでマップ表示を制御してるみたい。なのでまずはそれを見てみます。
usingMapbox.Platform.Cache;...namespaceMapbox.Unity.Map{usinghogehoge;publicclassAbstractMap:MonoBehaviour,IMap{hogehoge...publicvirtualvoidUpdateMap(Vector2dlatLon,floatzoom){hogehoge...
長かったので要点だけまとめて抜粋しました。名前的にUpdateMap関数ってのを呼び出せばマップ表示いじれそう!(単純)(でも分かりやすい命名ほんと助かる)
namespaceとは
さっきのコードでクラスの前にnamespace Mapbox.Unity.Mapってなってますね。これはなんなのか。
簡単に言うとフォルダとしてまとめてるってだけです。
上のコードのUpdateMap関数を使いたい!ってときは
Mapbox.Unity.Mapフォルダの中にある、AbstractMapフォルダの中にあるUpdateMap関数を使いたい!
と指定しないといけません。
namespace内のclassを呼び出すのは簡単です。
publicclasshogehoge:MonoBehaviour{Mapbox.Unity.Map.AbstractMap}
みたいにピリオドで繋いでやればいいだけですね。毎回Mapbox.Unity.Map.AbstractMapって打つのが鬱になる人は
usingMapbox.Unity.Mappublicclasshogehoge:MonoBehaviour{AbstractMap}
usingで宣言しちゃえばいいです。簡単ですよね。
今度はAbstractMapからUpdateMapを呼び出したいですね。でもクラスから呼び出すのはまたちょっと違います。インスタンス化というのをしてやる必要があります。
インスタンス化
インスタンス化というのは簡単にいうと、クラスという抽象的なものから具体的なものを生成するってことです。
この辺はオブジェクト指向の話なんですが、勉強したい人はドラゴンボールで学ぶオブジェクト指向 改とか面白くてよかったですよ。
まあそんなの知らなくても動かせます。具体的には
AbstractMapabstractMap=GameObject.Find("Map").GetComponent<AbstractMap>();
と書くとインスタンス化できちゃいます。これは簡単にいうとAbstractMapクラスのabstractMapインスタンスを生成しますってコードですね。これで!
abstractMap.Update(latLon:latLon,zoom:zoom);
って感じでクラス内の関数を利用することができます!
まとめ
以上まとめて、スクリプトからmapboxの"Latitude Longitude"をいじりたいときは以下のように書けばオッケーです。
usingMapbox.Unity.Map;usingMapbox.Utils;publicclassGameManager:MonoBehaviour{//初期位置とzoomレベルVector2dlatLon=newVector2d(37.784179f,-122.401583f);floatzoom=15.0f;voidStart(){Map_Setup();}publicvoidMap_Setup(){AbstractMapabstractMap=GameObject.Find("Map").GetComponent<AbstractMap>();abstractMap.UpdateMap(latLon,zoom);}}
ちょっとした罠なんですが、UpdateMapの引数はVector2じゃなくてVector2dです。これを使うためには二行目のusingが必要です。僕はこれに30秒くらいハマりました。
そういえばvirtualとは
実はpublic virtual void UpdateMap()ってなってたの気付いてましたか。これが付いてればoverrideといって、その関数の定義を書き直すことができるんです。興味あったら調べてみてくだしあ。
おわりに
mapboxのマップ表示ってスクリプトからどうやっていじれるんだろうと思って調べてみたので記事書いてみたんですが、なんか主旨がずれた記事になってしまった。でも応用きくので誰かの助けとならんことを、、
僕自身すごく初心者なのでなにか間違ってたら教えてください!