夜風のMixedReality

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

HoloLens ゆるっとLT会に参加してきました。 登壇内容

本日はイベント登壇記事です。

〇HoloLens ゆるっとLT会とは?

Microsoft Map-SDK for Unityで簡単なアプリを作ってみる。

筆者の登壇内容はMicrosoft Map-SDK for Unityで簡単なアプリを作ってみるという内容で、ライブでUnity上でデモを行いました。

Microsoft Map-SDK for Untiyとは?

 Microsoft Map-SDK for Untiy(以下Map-SDK)このブログでも何度か扱っているツールになりますが、一言で表すと『UnityプロジェクトでMapを扱えるツール』です。

 Map-SDKを使用することでUnityでマップが使えますが、これはMixed Realityデバイスでの使用を前提に作成されているためMRTKを用いてHoloLens上で動かすことができます。

redhologerbera.hatenablog.com

〇Map-SDKでできること

Map-SDKを用いれば大きく次のようなことが実現できます。

①Mapの読み込み、表示

 Map-SDKによって地図データがストリーミングされます。(この性質からMap-SDKはオフライン環境下では動作しません。

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

②Mapの座標に合わせてオブジェクトの配置

 Unityの座標を用いるのではなくMap-SDKで読み込まれた地図の座標に合わせてピン止めやオブジェクトの表示が行えます。

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

③Mapのカスタマイズ

 csvなどのデータを用意することでMapをカスタマイズし住所や建物名等、任意の表示を行うことができます。

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

④拡大,縮小,移動

 MRTKのコンポーネントを用いることで簡単に地図の拡大、縮小、移動が行えます。

〇Map-SDKの導入

〇Map-SDKの取得

Map-SDKの導入には2種類の方法があります。

Githubでサンプルプロジェクトを取得

Map-SDKは以下のGitHubリポジトリでサンプルプロジェクトを取得することができます。

github.com

②UnityのpackageManagerから取得

 UnityのパッケージmanagerでNget経由で導入する方法です。

〇Bing Maps keyの取得

Map-SDKを用いるためにはBing Mapの開発者キーが必要です。

これは以下のBing Maps Dev Centerにサインインして取得することができます。

www.bingmapsportal.com

詳しい手順はその①の記事でまとめています。

redhologerbera.hatenablog.com

〇アプリの構築

今回のイベントではライブコーディングをやってみたいとMRTKとMap-SDKを導入したUnityプロジェクトでMap-SDKの構築を説明しながらライブで行いました。

たった一行ですがコードも書きました。

今回の記事でも実際にイベントでやったように紹介したいと思います。

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

①Unity上部[MixedRealityToolkit]タブからMRTKのコンポーネントを追加する。

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

②空オブジェクトを作成し[Map]という名前を付けます。

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

③[Map]オブジェクトに[MapSession][MapRenderer]コンポーネントを追加します。

④[MapSession]コンポーネントの[Developer Key]にBing Mapsのキーのキーを入力します。

正しくキーが入力されるとMapのレンダリングが始まります。

[Map Renderer]コンポーネントの[Location]に緯度経度、ズームの設定がありここに任意の地球上の座標を入力することでその場所の地図を表示できます。

スクリプトで任意の座標を表示する。

エディタ上では任意の座標を表示できましたが、HoloLens上で任意のタイミングで座標を変えるためにはスクリプトを書く必要があります。

今回はごくごく簡単にUnityエディタでPlayするとStart関数で任意の座標が表示されるようなスクリプトをライブで書きました(たった一行ですが)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Microsoft.Maps;
using Microsoft.Maps.Unity;

public class Demo : MonoBehaviour
{
    [SerializeField]
    MapRenderer _render;
    [SerializeField]
    float Lat;
    [SerializeField]
    float Lot;
    // Start is called before the first frame update
    void Start()
    {

    }
}

[MapRenderer]の情報を更新するのでネームスペースにMicrosoft.MapsとMicrosoft.Maps.Unityを追加します。

_renderはMapRendererでLatとLotが緯度経度になります。

MapRendererの情報を更新するためにはMapSceneメソッドを用います。 MapSceneメソッドにはいくつかタイプがありますが今回は座標と拡大率を指定できる[MapSceneOfLocationAndZoomLevel]メソッドを用います。

Start()
{
  _render.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(Lat,Lot),15f));
}

[MapSceneOfLocationAndZoomLevel]メソッドは(LatLon location,float zoomLevel)の引数を持ちそれぞれ緯度経度、と拡大率です。

LatLonを扱うためにはネームスペースに[using Microsoft.Geospatial;]の一文を追加する必要があります。

LatLonはLatitude LongitudeをまとめたものでLatLon(float Latitude ,float longitude)というように緯度経度のfloat型の引数を持ちます。

最終的なスクリプトは次のようになります。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Microsoft.Maps;
using Microsoft.Maps.Unity;
using Microsoft.Geospatial;

public class Demo : MonoBehaviour
{
    [SerializeField]
    MapRenderer _render;
    [SerializeField]
    float Lat;
    [SerializeField]
    float Lot;
    // Start is called before the first frame update
    void Start()
    {
        _render.SetMapScene(new MapSceneOfLocationAndZoomLevel(new LatLon(Lat,Lot),15f));
    }
}

これを適当なオブジェクトにアタッチしてUnityを実行すると次のようになります。 Lat,Lonには富士山の座標を入力しています。 (Lat=35.3625,Lon=138.730555555555556)

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

世界地図から富士山へズームしていきました。 Map-SDKを用いるとこのようなアニメーションも使用することができます。

以上が登壇内容でした。

〇感想

筆者にとって初めてのライブで構築するという機会で途中止まってしまうこともありましたが、コミュニティの皆さんがアドバイスを途中くれたこともあり、最後までデモを行えました。

今回のようなゆるっと会ならではの雰囲気でとても私自身にとっても良い時間になりました。

また、ZoomのコメントでMap-SDKが動いた瞬間など「すごい」や「こんどさわってみよう」という参加者の方のコメントを見てとてもやりがいのある発表になったと感じます。

イベントでライブでデモを行うことは限られた時間でデモを成功させ魅力を伝えることが重要と感じるので、知識と経験が必要と感じます。

その点でも今回非常に貴重な時間になりました。