本日はMicrosoft Map-SDK for Unityの調査枠です。
前回の記事で任意の場所にピン止めを行うことができました。
ここでは九州新幹線の各停車駅にピンが表示されるようにしました。
今回はこれをベースに手を加えていきます。
〇地図の拡大
Map-SDKの特徴として世界中の地図を見たい拡大率で表示することができます。
この地図の座標に沿って前回ピンを配置しましたが、このピンをジェスチャーで選択することでピンが配置されている地点が拡大されるようにします。
〇ピンの仕組み
ピンは[MapPinProvider]コンポーネントの[Map Pin Prefab]にアタッチしたプレファブの複製として生成されます。
今回使用しているExampleで提供されている[SmallMapPin]プレファブにはCube,Cylinder,テキストの3つで構成されています。
親オブジェクトである[SmallMapPin]には[MapPin]コンポーネントがアタッチされており、ここにピンごとの緯度経度などの座標情報が書き込まれます。
CubeにはMRTKで提供されている[Interactable]コンポーネントがアタッチされています。
[Interactable]コンポーネントの[theme]に設定されている[theme]によりHandRayが当たると色が変わるようになっています。
〇ピンをAirTapするとズームするようにする。
ピンの構造が分かったのでここからAirTapでズームできるようにします。
次のスクリプトを書きました。
using System.Collections; using System.Collections.Generic; using UnityEngine; using Microsoft.Maps; using Microsoft.Maps.Unity; using System.Runtime.InteropServices; using Microsoft.Geospatial; public class ZoomToMap : MonoBehaviour { [SerializeField] MapRenderer MapRenderer; [SerializeField] MapPin MapPin; [SerializeField] LatLon latlon; [SerializeField] float zoomLevel; // Start is called before the first frame update void Start() { MapRenderer = GameObject.Find("Map").GetComponent<MapRenderer>(); MapPin = GetComponent<MapPin>(); latlon = MapPin.Location; } /// <summary> /// ピン止めされた座標をズームします。 /// </summary> public void ZoomToPoint() { MapRenderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(latlon, MapRenderer.ZoomLevel+1f)); } }
①[SmallMapPin]プレファブの親オブジェクト[SmallMapPin]オブジェクトに[ZoomToMap]コンポーネントをアタッチします。
また[ZoomToClusterMapPin]コンポーネントをディアクティブにします。(使用しないので)
②Cubeの[Interactable]コンポーネントの[OnClick()]イベントに[SmallMapPin]オブジェクトの[ZoomToMap]コンポーネント[ZoomToPoint()]を指定します。
以上で完成しました。
〇Unityで実行
HandRayを当ててAirTapすることで拡大されるようになりました。
〇スクリプト解説
スタート関数ではMapを表示させる[MapRenderer]コンポーネントを探し、取得しています。 また、自身のMapPinからLocation(自身の緯度経度)を取得します。
void Start() { MapRenderer = GameObject.Find("Map").GetComponent<MapRenderer>(); MapPin = GetComponent<MapPin>(); latlon = MapPin.Location; }
AirTapによりMRTKの[Interactable]コンポーネントでZoomToPointが読みこまれます。
public void ZoomToPoint() { MapRenderer.SetMapScene(new MapSceneOfLocationAndZoomLevel(latlon, MapRenderer.ZoomLevel+1f)); }
ここではMapを表示させているMapRendererの座標にピン止めされている座標を代入し、現在の拡大率から+1しています。
MapRenderer.ZoomLevel+1fを変えることで任意の拡大を行うことができます。
以上でピンの座標を拡大することができました。