UnityのMR TemplateをHoloLens 2にデプロイしてみる

# はじめに

思いっきり遅刻しているんですが昨日(12/23)は私が担当の[HoloLens アドヴェントカレンダー](https://qiita.com/advent-calendar/2023/hololens)

今日のネタは [XRKaigi 2023](https://www.xrkaigi.com/)の中のネタから

Unityの高橋 忍さんのセッションの中でも紹介があったMR Templateを使ってHoloLens 2のデプロイしてみます。
https://www.xrkaigi.com/pages/session_detail?session_id=XRKG2023-S-023

## Mixed Reailty Templateってなに？

Unity 2022から追加されているテンプレートで以下の機能を利用して「Oculus/Meta Quest」「HoloLens 2」「Magic Leap 2」のアプリ開発のベースを構築されています。Mixed Reailtyが示す通りパススルーや空間認識といった機能が最初から入ってる便利なテンプレートです。

使っている機能は以下のようなもの

* OpenXR
* AR Foundation
* XR Interaction Toolkit

OpenXRやAR Foundationでできる空間認識や入力系をサポートしていて、特に大きな変更なくMRデバイスでの対応が可能なテンプレートになっています。
これらは英語ですが、「[Mixed Reality Template Quick Start Guide](https://docs.unity3d.com/Packages/com.unity.template.mixed-reality@1.0/manual/index.html)」に整理されています。今回はこれをHoloLens 2にそのままビルド&配置できるかやってみます。



## 開発環境

開発環境は以下の通りです。

* Unity 2022.3.16f1 
   * Universal Windows Platform Build Support
   * Windows Build Support (IL2CPP)
* Visual Studio 2022
* Mixed Reality Feature Tool

個別にインポートが必要なパッケージ

* Microsoft Mixed Reality OpenXR Plugin V1.10.0

## 環境構築

MR Templateは基本的にそのままほぼ完成済みのサンプルがあるのでこれをそのままビルドします。

### プロジェクトの作成

Unity 2022.3からMRテンプレートでプロジェクトを作成します。Unity Hubから新しいプロジェクトを作成します。この時にバージョンをUnity 2022.3.7f1を選択するとテンプレートが表示されます。この中に[Mixed Reality]がリストにあるのでこれを選択します。最初はテンプレートのダウンロードが必要になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/ad229af1-2f35-f014-042f-2ad37451c224.png)

一旦プロジェクトを作成したらUnity Editorを閉じてください。

### 不足のパッケージを追加する。

Mixed Reality テンプレートはサンプルシーンで基本的な実装が行われているサンプルになっています。
ただし、デバイスによってはパッケージなどは個別に入れる必要があります。Hololens 2にかんしてはHoloLens 2用のOpenXR用のプラグインの導入が必要になります。これはMixed Reailty Feature Toolから行います。
もしMixed Reailty Feature Toolを持っていない場合は[Microsoft 公式サイト](https://learn.microsoft.com/ja-jp/windows/mixed-reality/develop/unity/welcome-to-mr-feature-tool?WT.mc_id=WDIT-MVP-5003104)からダウンロードできます。

アプリを起動して先ほど作ったUnityプロジェクトを選択し[Platform Support]-[Mixed Reality OpenXR Plugin]を選択します。バージョンは最新で問題ありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/3b96ef1d-075f-332b-f899-8cec786fb459.png)

### プロジェクトの設定を行う

Mixed Reailty OpenXR Pluginを導入したらプロジェクト設定を行っていきます。
まずPlatformをUniversal Windows Platformに変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/09ac769b-5473-02d1-3932-78d6ba5fb6e9.png)

変更したら、メニューから[Edit]-[Project Settings]を選択し、プロジェクト設定を開きます。
プロジェクト設定から[XR Plug-in Management]を選択します。Build PlatformをUWPに変更しているとUWPタブが選択された状態になっています。Mixed Reailty OpenXR Pluginをインポートしていれば[Microsoft HoloLens feature Group]が選択可能になっているのでそれをチェックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/c80e67a9-d4d0-e79a-2775-779c75cd4e43.png)
チェックするとOpenXRの横に警告が表示されるので、[XR Plug-in Management]-[Project Validation]を選択し[Fix All]ボタンを押して必要な設定変更を反映させてください。

次にOpenXRの設定を行います。[XR Plug-in Management]-[OpenXR]で以下の設定を追加で行います。

* Depth Submission ModeをDepth 16Bit
* Microsoft HoloLensにチェックがある
* Hand Trackingに**チェックがない**
* Motion Controller Modelに**チェックがない**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/c2e766b6-9dd7-201d-5508-28054693479e.png)


これで設定完了です。

### ビルドを行う。

最近のHoloLensのビルドはUnity上でUWPパッケージを直接デプロイして実行することができます。この方法を利用するためには以下のようにBuild SettingsでHoloLensのDevice Portalに関する設定を入力します。
もしHoloLensでDevice Portalを使う設定を行っていない場合は[公式サイトのWindows デバイス ポータルを使用する](https://learn.microsoft.com/ja-jp/windows/mixed-reality/develop/advanced-concepts/using-the-windows-device-portal?WT.mc_id=WDIT-MVP-5003104)を参照してください。

* Architectureを[ARM 64-bit]
* Build and Run on を[Remote Device(via Device Portal)]
    * Build Configurationを[Release]
    * Device Portal Addressを[https://(HoloLensのローカルIPアドレス)]
    * Device Portal Usernameを[設定したユーザ名]
    * Device Portal Passwordを[設定したパスワード]

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/c28f631d-a913-3c3c-8d26-3ce415c27c9d.png)

## 実行

実行すると解説のダイアログが表示されます。
![20231226_143754_HoloLens.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/72aad041-a483-d47e-ef5d-50e6af8d3e05.jpeg)

平面認識の機能がついているので、平面をタップすると何かがでてくる仕様です。
![20231226_143929_HoloLens.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/91fb46e0-f79b-a549-b88c-db5febbdb31c.jpeg)

色々出てきます。大砲から紙吹雪が発射されたりします。
![20231226_144131_HoloLens.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/d5056fc7-5f85-ff3b-b467-84edef72598a.jpeg)

## 所感
動きます。そのままだと正直文字通りというレベルであまりHoloLens 2用とするのは難しいです。理由はいくつかあります。

### URPのプロジェクトだから

現状HoloLens 2のアプリを作る際にはUnity 2022系のURPでパフォーマンス劣化します。この問題は既知の問題として取り上げられてはいるのですが発生日が2023/1なんですよね。。。

https://learn.microsoft.com/ja-jp/windows/mixed-reality/develop/unity/known-issues

なので対処方法としては、このプロジェクトをURPから変更して使う必要があります。

### ハンドトラッキングの動きも怪しい

HoloLensのハンドトラッキング（正確には全部のデバイスのハンドトラッキング）はこのサンプルについてはHand Tracking Subsystemを利用しています。このサブシステムはOpenXRで定義されているHand Tracking拡張機能をサポートする機能を提供しています。手の認識、などはちゃんとしているのですが、とりあえず動かした場合うまく動作しない部分があります。

* 手のひらを返してもメニューが表示されない
* ハンドレイが正しく動いていない。

おそらくハンドトラッキング周りはMixed Reality OpenXR Pluginのハンドトラッキングを使う方が安定すると思います。

この辺りもどうできるのか調査したいと思います。