Hololens2でMapBox SDK (Maps for unity)を使う 

##はじめに
Hololens2で3Dマップを使用する際、BingMapやGoMAP等いくつかの選択肢がありますが、
今回はMapBoxのUnity用SDK(Maps for Unity)を使用する方法をご紹介したいと思います。

尚、下記がMapBoxを採用した理由です

- 無料である程度の規模まで使える
  https://www.mapbox.com/pricing/

- 大きなサイズの地図を表示できる
  BingMapも試しましたが、地図の大きさが最大3x3 UnityUnitに制限されているようです。
MapBoxは最大10x10UnityUnitまで表示可能です
  
- タイルの品質
  BingMapでは私の使用する拡大率(ZoomLevel 7~13)でのタイル(テクスチャ)が芳しくありませんでした。

  
BingMapではタイルの解像度が宜しくない
![5d963bf1ae0452d43fe8c674251670e0.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83337/59df2b1a-963d-0695-eba0-cdbebe740fe6.jpeg "BingMapではタイルの解像度が宜しくない")

Maps for unityでは良好な解像度が得られる
![a8e2360786afc03867bfda89f0aea448.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83337/30d577e8-4620-805f-c361-1c4f1c3374cb.jpeg "Maps for unityでは良好な解像度が得られる")

#注意点
Maps for UnityはIL2CPPでのビルドに対応していません。
よってScriptingBackendに.Netを指定する必要がありますので、Unityのバージョンは2018.4系を使用する必要があります。


##MapBox アカウント作成
Maps for Unityを使用する為にはmapboxのアカウントが必要です。
https://account.mapbox.com/auth/signup/
からアカウントを作りログインしておきます

##Maps for Unityダウンロード
https://www.mapbox.com/install/unity/
よりSDK(Maps for Unity)をダウンロードします

##MRTKダウンロード
https://github.com/Microsoft/MixedRealityToolkit-Unity/releases
よりMRTK(Unity.Foundation.2.4.0.unitypackage)をダウンロードします。  

##プロジェクト作成 & MRTKインポート
適当なサンプルプロジェクトを作り、MRTKをインポートします。
前述していますがUnityのバージョンは2018.4系を使って下さい。  
プロジェクトを作成後、Assets => Import Package => Custom Package から先ほどダウンロードしたMRTKをインポートします。
途中で表示されるインポートするファイルの指定では、全てのファイルをインポートします。

インポートが終了するとUnityのメニューバーにMixed Reality Toolkitという項目が追加されますので、
ここからAdd Scene and Configure...を実行します。
この段階で、Hierarchyは画像のようになっているはずです。
![0f461e21152b49838171afa326dc1643.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83337/fbe86d5c-028a-f4e3-fd60-2558588cd408.png)

##MRTK 設定
Project ViewからMixedReality Toolkitを選択し、インスペクターでMixed Reality ToolKitコンポーネントの設定を編集します。
Configuration Profileを DefaultHololens2ConfigurationProfileに変更します。

##Buildセッティング
Hololens2向けにビルドセッティングを行います。
File => BuildSettingを選択してBuildSettingダイアログを表示し、PlatformからUniversal Windows Platformを選択後、Switch Platformボタンを押してプラットフォームを切り替えます。
途中MRTK Project Configuratorが表示される場合は、Enable MS Buildのチェックを外してApplyしてください。
![f7a409f6cf027b534fe25f8bbb6b304b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83337/4bf2a791-7e82-0beb-606f-ba07c823553b.png)


##Player設定
続いてBuildSettingダイアログでPlayerSettingボタンを押し、Player設定画面を表示します。

###XR Settingsタブの設定および確認
- Virtual Reality Supportedがチェックされている
- Virtual Reality SDKsにWindows Mixed Realityが追加されている
- Depth Formatを16bit depthに変更
- Enable Depth Buffer Sharingがチェックされている
- Stereo Rendering ModeでSingle Pass Instancedが選択されている
![d1c488942077db96de7cbfc723f07255.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83337/0afbd9bd-7975-bf9a-62c6-a0647b98af6f.png)


###Publish Settingsの設定および確認
- Packagingをプロジェクトにふさわしい内容で適当に書き換えてください。

###Other Settingsの設定および確認
- Configuration内のScripting Runtime Versionが.Net 4.x Equivalentが選択されている
- Scripting Backendを.NETに変更
- Api Compatiblility Levelを.NET Standard2.0に変更
  
##Maps for Unityのインストール及び設定
Assets => Import Package => Custom Package から先ほどダウンロードしたMaps for Unityをインポートします。
途中で表示されるインポートするファイルの指定では
・Mapbox
・ThirdpartyAssets
のみをインポートします。

インポート中にMapbox Setupダイアログが表示されますので、Access Tokenの欄にアクセストークンを入力し、submitを押します。
アクセストークンは下記URLより取得して下さい。
https://www.mapbox.com/install/  
またこのダイアログから各種サンプルプログラムにアクセスできます。
今回はサンプルプログラムは使わないので、アクセストークン設定後はそのままダイアログを消してください。  
![998647cababf26326a2ff70c5750a853.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83337/8392d08d-5b86-945f-a596-6ae7eb6a8ef4.png)

Project ViewからAssets\Mapbox\Core\Plugins\Mapbox\MapboxAccounts\net4xのMapboxAccountsUnity.dllを選択し、
インスペクターよりSelect Platforms for pluginセクションのWSAPlyerのチェックをONにします。


##地図の設置
Assets\Mapbox\Prefabs内のMapをHierarchyにドラッグした後に、インスペクターでMapを表示します。
インスペクターでAbstract Mapコンポーネントに対し設定を行う事で地図の表示内容を制御します。
表示する地点や拡大率、衛星写真・地図の切り替え等はここで行います。
今回は下記内容で設定してください

### GENERAL/Locationセクション
-  Latitude Longitude : 35.3611236, 138.7266352
- Zoom : 14
 
### GENERAL/Extent Optionsセクション
- Extent Options : Range Around Center
- West , North , East , South : 10
- Initialization On Start : ON

### GENERAL/Othersセクション
- Unity Tile Size : 1

### IMAGEセクション
- Data Source : Mapbox Satellite
- Use Retina : ON
- Use Compression : OFF
- Use Mip Map : ON

### TERRAINセクション
- Data Source : Mapbox Terrain
- Elevation Layer Type : Terrain With Elevation
- Add Collider : OFF
- Exaggeration Factor : 1

また、MapオブジェクトのTransformのPosition:Yを-2程度にすると見やすくなるかもしれません。

上記設定後、UnityのPlayボタンを押してGameViewに富士山が表示されればＯＫです。
初期表示では視点位置により表示内容が分かり難い場合があります。
その場合はWASDキーと、右クリック+マウス操作で視点を変更して下さい。

初期表示
![982f64504fde6077749ede580af59421.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83337/99632282-f343-5f5f-d1f1-e3f7d2892b53.png)


視点変更後
![d869a3fc3fc0a93822228bd4936c3083.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83337/6fa7da8f-3be5-1fe9-ccd5-e7248d804b19.png)


### UnityでのBuild
File=>Build Settingsを選び、Build Settingsダイアログを表示します。  
Add Open Sceneを押してビルド対象に現在のシーンを追加します。  
Buildを押しビルド結果の出力ディレクトリを指定するとビルドが開始されます。
ビルド終了後、Console Viewでエラーが発生していないことを確認して下さい。

## VisualStudio2019でのBuild 
Unityでのビルドが終了後、ビルド結果の.slnファイルをVisualStudio2019で開き下記設定を行います。
- 構成をDebugからReleaseまたはMasterに変更する
- 構成をARM またはARM64に変更する
- 構成をデバイスに変更する
![457615f638bd5a32dd118be42f62ebd0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83337/60f37101-8af0-2acc-0b7a-8cfc8b7a2798.png)

ソリューションエクスプローラーからUniversal Windowsプロジェクトを選び、Nugetパッケージの管理を選びSQLite.Universalをインストールして下さい。  
デバッグ => デバッグ無しで開始
を選ぶとビルド後に実機にデプロイされ、自動的に起動するはずです。  
全てが正しく行われていれば、目の前に富士山が表れると思います。