【Unity】Mapbox SDKでマップ上の任意の緯度経度の座標にオブジェクトを配置する
はじめに
前回の記事でUnityにマップを召喚しました。
今回はその続きで、マップ上の任意の緯度経度の座標にオブジェクトを配置してみたいと思います。 マップを配置したところからスタートするのでお済みでない方は、先にそこまで進めてみてください。
検証環境
- 機種: MacBook Air(m1)
- OS: MacOS Monterey(12.3.1)
- メモリ: 8GB
- Unity: 2021.2.16f1(SILICON)
- mapbox-unity-sdk: v2.1.1
プロジェクトの準備
前回のプロジェクトを使いますので、Unityで開いてください。
緯度経度をワールド座標に変換する
スクリプト
まず、スクリプトを追加しましょう。名前はMapboxLocation
とします。
緯度経度は、長崎市役所の座標にしています。
using System.Collections; using System.Collections.Generic; using UnityEngine; using Mapbox.Unity.Utilities; using Mapbox.Unity.Map; using Mapbox.Utils; public class MapboxLocation : MonoBehaviour { public AbstractMap map = null; void Start() { map.MapVisualizer.OnMapVisualizerStateChanged += (state) => { if (state == ModuleState.Finished) { double lat = 32.7503353; // 緯度 double lng = 129.8777355; // 経度 Vector2d latlng = new Vector2d(lat, lng); Vector3 pos = map.GeoToWorldPosition(latlng); Debug.Log(pos); } }; } void Update() { } }
スクリプトをアタッチ
スクリプトを適当なオブジェクトにアタッチして、マップのコンポーネントを入れます。
結果
実行すると画像のようにワールド座標を取得できました。
オブジェクトを配置する
Cubeを配置する
検証用のオブジェクトを配置します。Sphereでも何でもいいですが、ここではCubeにします。
スクリプトの改造
単純にCubeのPositionにワールド座標を代入するだけです。 コンパイルが済んだら、Cubeをスクリプトコンポーネントにアタッチしてください。
using System.Collections; using System.Collections.Generic; using UnityEngine; using Mapbox.Unity.Utilities; using Mapbox.Unity.Map; using Mapbox.Utils; public class MapboxLocation : MonoBehaviour { public AbstractMap map = null; public GameObject cube = null; void Start() { map.MapVisualizer.OnMapVisualizerStateChanged += (state) => { if (state == ModuleState.Finished) { double lat = 32.7503353; // 緯度 double lng = 129.8777355; // 経度 Vector2d latlng = new Vector2d(lat, lng); Vector3 pos = map.GeoToWorldPosition(latlng); Debug.Log(pos); cube.transform.position = pos; } }; } void Update() { } }
結果
y座標をいじってないので埋もれていますが、指定した緯度経度にCubeが配置されていることがわかります。
おわりに
Mapbox Unity SDKを使って、マップ上の指定した緯度経度にオブジェクトを配置してみました。 今回はCube1個だけでしたが、複数のオブジェクトに適用することも可能ですので、試してみて欲しいです。
それでは素敵なUnityライフをお過ごしください。