夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

Microsoft Map-SDK for Unity その8 Map-SDKでスクリプトから任意の場所を表示させる。

本日はツールの調査枠です。

HoloLensのアプリ開発ではMRTKだけではなく多くのツールを使用することができます。

Microsoftから提供されている[Microsoft Map-SDK for Unity(以下Map-SDK]を調査していきます。

前回はMap-SDKの基礎的なコンポーネントを調査しました。

redhologerbera.hatenablog.com

今回はMap-SDKスクリプトから任意の場所を表示します。

〇Map-SDKでの任意の場所の表示

 Map-SDKでは[MapRenderer]コンポーネントの[Location]から緯度と経度を入力するとその場所のマップデータを取得することができます。

f:id:Holomoto-Sumire:20200911092852j:plain

 今回はこれをアプリケーション実行中にスクリプトから任意のタイミングで行います。

スクリプト

次のスクリプトでは任意のタイミングで関数を呼び出すことで地図の表示を富士山、エベレスト、エルブルス山の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]をアタッチします。

f:id:Holomoto-Sumire:20200912181135j:plain

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

f:id:Holomoto-Sumire:20200912181425j:plain

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

f:id:Holomoto-Sumire:20200912181716j:plain

[Update Collection]コンポーネントは子オブジェクトのレイアウトに用いることができます。

④一番上の[PressableButtonHoloLens2]の[Button Config Helper]コンポーネントの[Main Label Text]をEverestに書き換えます。

f:id:Holomoto-Sumire:20200912182125j:plain

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

f:id:Holomoto-Sumire:20200912182433j:plain

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

f:id:Holomoto-Sumire:20200912182950g:plain

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

f:id:Holomoto-Sumire:20200912184631g:plain

f:id:Holomoto-Sumire:20200912184739g:plain

次のようにMapChangerに渡す第3引数を変えることでズームレベルも変えることができます。

   public void MtFuji()
    {
        MapChanger(35.3625f,138.7305555f,15f);
    }

f:id:Holomoto-Sumire:20200912185314g:plain

スクリプトの解説

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()に渡される仕組みです。