本日はツールの調査枠です。
HoloLensのアプリ開発ではMRTKだけではなく多くのツールを使用することができます。
Microsoftから提供されている[Microsoft Map-SDK for Unity(以下Map-SDK)]を調査していきます。
前回はMap-SDKの基礎的なコンポーネントを調査しました。
今回はMap-SDKでスクリプトから任意の場所を表示します。
〇Map-SDKでの任意の場所の表示
Map-SDKでは[MapRenderer]コンポーネントの[Location]から緯度と経度を入力するとその場所のマップデータを取得することができます。

今回はこれをアプリケーション実行中にスクリプトから任意のタイミングで行います。
〇スクリプト
次のスクリプトでは任意のタイミングで関数を呼び出すことで地図の表示を富士山、エベレスト、エルブルス山の3点で切り替えることができます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Microsoft.Maps.Unity;
using Microsoft.Geospatial;
using Microsoft.MixedReality.Toolkit;
/// <summary>
/// このスクリプトでは実行中に任意の場所へ地図表示を移し替えます。
/// </summary>
public class MapMountRender : MonoBehaviour
{
[SerializeField]
MapRenderer _mapRenderer;
// Start is called before the first frame update
void Start()
{
if (_mapRenderer == null)
{
_mapRenderer = GameObject.Find("Map").GetComponent<MapRenderer>();
}
}
//エベレスト
public void MtEverest()
{
MapChanger(27.9878f, 86.925f, 10f);
}
//富士山
public void MtFuji()
{
MapChanger(35.3625f,138.7305555f,10f);
}
//エルブルス山
public void MtElbrus()
{
MapChanger(43.355f, 42.4391666667f, 10f);
}
public void MapChanger(float lat ,float lon,float zoom)
{
_mapRenderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(lat, lon), zoom));
}
}
①これを適当なゲームオブジェクトにアタッチします。 [MapRenderer]には使用しているシーン内の[Map-SDKのMapRenerer]をアタッチします。

②[PressableButtonHoloLens2]プレファブを配置し、3つに複製します。

③ボタンを均等に配置するために親オブジェクトを作り[GridObjectCollection]コンポーネントをアタッチ、[Update Collection]をクリックします。

[Update Collection]コンポーネントは子オブジェクトのレイアウトに用いることができます。
④一番上の[PressableButtonHoloLens2]の[Button Config Helper]コンポーネントの[Main Label Text]をEverestに書き換えます。

⑤[PressableButtonHoloLens2]コンポーネントの[Button Pressed]イベントに新しくイベントを追加し[MapMountRender]コンポーネントのMtEverestを呼び出すように指定します。

これでボタンを押すとEverestの地形が表示されるようになりました。

富士山とエルブルス山も同様に設定します。


次のようにMapChangerに渡す第3引数を変えることでズームレベルも変えることができます。
public void MtFuji()
{
MapChanger(35.3625f,138.7305555f,15f);
}

〇スクリプトの解説
MapMountRenderコンポーネントではMapChanger関数で処理を行っています。
_mapRenderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(lat, lon), zoom));
[MapRenerer.SetMapScene()]はMapRendererのMapSceneを更新します。MapSceneはマップの座標等の変更やアニメーションに用いる値です。
[MapSceneOfLocationAndZoomLevel()]は地図の位置とズームレベルを指定できるタイプのMapSceneです。ここに座標とズームレベルを入れますが座標はLatLon(float ,float )の型で記述します。
LatLonはMicrosoft.Geospatialのネームスペースにある型です。
ボタンを押すことで各山の関数が呼ばれ数値がMapChanger()に渡される仕組みです。