MRTK で Oculus Quest のプロジェクトにハンドトラッキングと空間操作用のUIを実装する

# MRTK とは
Microsoft 主導のプロジェクトで、Unity でクロスプラットフォームの MR アプリの開発時間を短縮するために、空間操作および UI 用のクロスプラットフォーム入力システムと構成を簡単に実装出来ます。
![mrtk_ux_hero.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229633/a305fece-e7bd-5103-19d0-5015d9c54f43.png)
幅広い範囲のプラットフォームがサポートされていますが、今回は Oculus Quest2 で動作するように実装したので、備忘録としてまとめました。

## 必要なもの
- [Oculus Quest 2](https://amzn.to/3Ew6e2c)
  - デバイスで [開発者モード](https://qiita.com/nekoharuyuki/items/79c2c4fa6bf88d11b108) が有効になっている必要があります。
- Unity
  - (バージョンは 2020.3.21f1 LTS を使用しました。)
- [Unity XR SDK パイプライン](https://docs.unity3d.com/2021.2/Documentation/Manual/XR.html)
- [Oculus Integration](https://assetstore.unity.com/packages/tools/integration/oculus-integration-82022)
- [MRTK](https://github.com/microsoft/MixedRealityToolkit-Unity/releases)
  - Microsoft.MixedReality.Toolkit.Unity.Foundation.unitypackage

※ MRTK のパッケージを Windows PC で用意する場合は [Mixed Reality Feature Tool](https://www.microsoft.com/en-us/download/details.aspx?id=102778) を使用してダウンロード出来ます。（ 詳細は[こちら](https://docs.microsoft.com/ja-jp/windows/mixed-reality/mrtk-unity/configuration/usingupm?view=mrtkunity-2021-05) ）

## 実装手順
1. プロジェクトの準備
2. XR Plugin Frameworkのインポート
3. Oculus Integrationのインポート
4. MRTKのインポート
5. MRTK用のコンポーネントとプロファイルを追加
6. ハンドトラッキングの有効化
7. URP で MRTK を使用する場合
8. ボタン / ハンドメニューの追加
9. Oculus Questでの実行

### 1. プロジェクトの準備
Oculus Quest2 のプロジェクトの設定をします。
詳細は [開発環境を設定](https://developer.oculus.com/documentation/unity/book-unity-gsg/) にまとめられています。


> ■ Unityの準備
1. Unity HubでUnityをインストールします。モジュールの追加で「Android Build Support」をチェックします。
2. Unityのプロジェクトを作成します。
3. メニュー「File → Build Settings」で、「Android」を選択して「Switch Platform」ボタンを押します。

### 2. XR Plugin Frameworkのインポート
1. メニュー「Edit → Project Settings → XR Plugin Management」で「Install XR Plugin Management」ボタンを押します。「XR Plugin Management」がインポートされます。
2. Androidタブの「Oculus」にチェックを入れます。

![18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229633/f9d7a4fd-7c2c-3621-cef8-e226462b45cd.png)
### 3. Oculus Integrationのインポート
Unity アセット ストア から [Oculus Integration](https://assetstore.unity.com/packages/tools/integration/oculus-integration-82022) をダウンロードしてインポートします。
※ 全てのファイルをインポートします。インポートには時間がかかります。

インポートが完了したら、メニュー「Edit → Project Settings → Audio」の「Spatializer Plugin」に「OculusSpatializer」を指定します。
![53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229633/79dff20a-07ad-c0e6-31bc-5dedbf8b73fa.png)


### 4. MRTKのインポート
1. [MRTK](https://github.com/microsoft/MixedRealityToolkit-Unity/releases) のリポジトリからパッケージをダウンロードします。

```
Microsoft.MixedReality.Toolkit.Unity.Foundation.unitypackage
Microsoft.MixedReality.Toolkit.Unity.Tools.unitypackage
```

2. メニュー「Assets → Import Package → Custom Package」で、パッケージをインポートします。

3. 以下のダイアログを入力していきます。
![スクリーンショット 2021-10-31 7.52.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229633/fd0a7cde-21d6-d54a-6f4e-f9e12f20a989.png)
「Next」を選択。
![スクリーンショット 2021-11-01 13.51.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229633/e93de44a-d75c-b10f-0b0d-5e12525c1302.png)
「Apply」を選択。
![スクリーンショット 2021-10-31 7.52.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229633/3f2c772e-6e2e-9625-eeaf-00d610b2a3b6.png)
「Next」を選択。
![スクリーンショット 2021-11-01 13.52.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229633/8ba56dc4-925b-5a00-2816-d43f69cb2306.png)
「Import TMP Essentials」を選択。
![スクリーンショット 2021-10-31 7.52.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229633/09226f7f-5dff-d849-ecaf-c6b058d71ba7.png)
「Done」を選択。

※ MRTK のパッケージを Windows PC で用意する場合は [Mixed Reality Feature Tool](https://www.microsoft.com/en-us/download/details.aspx?id=102778) を使用してダウンロード出来ます。（ 詳細は[こちら](https://docs.microsoft.com/ja-jp/windows/mixed-reality/mrtk-unity/configuration/usingupm?view=mrtkunity-2021-05) ）
### 5. MRTK用のコンポーネントとプロファイルを追加
メニュー「Mixed Reality Toolkit → Add to Scene and Configure...」を選択します。
以下が Hierarchy に追加されます。

```
MixedRealityToolkit
MixedRealityPlayspace
MixedRealitySceneContent
```

### 6. ハンドトラッキングの有効化
メニュー「Mixed Reality Toolkit → Utilities → Oculus → Integrate Oculus Integration Unity Module」を選択します。
![oculusintegrationasmdef.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229633/f8580a61-b508-f7da-01c2-b3c357bce75a.png)
インポートされた Oculus フォルダーの、OculusProjectConfig で、HandTrackingSupport を 「Controllers and Hands」か「Hands Only」に設定します。
![oculusintegrationcontrollerandhands.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229633/e51483f9-433e-cb1c-18ef-c396f99e4b77.png)
参考 : [Oculus Integration Unity パッケージを設定してハンドトラッキングを有効にする](https://docs.microsoft.com/ja-jp/windows/mixed-reality/mrtk-unity/supported-devices/oculus-quest-mrtk?view=mrtkunity-2021-05#setting-up-the-oculus-integration-unity-package-to-enable-handtracking)

#### Oculus コントローラー
Oculus コントローラーモデルを視覚化するには、Oculus クエストデプロイの手順に従います。 コントローラーを使用しているときに仮想ハンズオンを表示する場合は、XR SDK Oculus Device Manager の下で、[コントローラーでは なくアバター を表示する] がオンになっていることを確認します。それ以外の場合は、このオプションをオフにします。
![oculusdevicemanager.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229633/c82efd7a-a994-bd01-84b6-55800aa61e62.png)
コントローラーと手のモデルは以下の設定にすると表示されます。
![スクリーンショット 2021-11-06 17.49.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229633/fb8870ce-0d75-a3f6-649f-190f29d4669c.png)

### 7. URP で MRTK を使用する場合
メニュー「Mixed Reality Toolkit → Utilities → Upgrade MRTK Standard Shader for Lightweight Render Pipeline」を実行します。

https://docs.microsoft.com/ja-jp/windows/mixed-reality/mrtk-unity/features/tools/update-mrtk-shaders?view=mrtkunity-2021-05

### 8. ボタン / ハンドメニューの追加

試しにハンドメニューの実装をしました。

https://twitter.com/pirorororonn/status/1456766198427705346

下記の記事を参考にUIなどを作成し動作確認をしました。

https://qiita.com/miyaura/items/7f6bb7ddcaab8bc6cb8e

https://qiita.com/_udonba/items/030dab3e7dbe65922a28

https://note.com/npaka/n/n159027eb708c

### 9. Oculus Questでの実行

#### ビルドエラー
最初に「Build And Run」を選択すると、ビルドエラー が発生する可能性があります。「Build And Run」を再度選択すると、正常にビルドが完了します。
参考 : [プロジェクトをビルドして Oculus Quest にデプロイする](https://docs.microsoft.com/ja-jp/windows/mixed-reality/mrtk-unity/supported-devices/oculus-quest-mrtk?view=mrtkunity-2021-05#build-and-deploy-your-project-to-oculus-quest)

#### 診断システムの表示/非表示
![20200702172203.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229633/55855d22-f6e1-757d-96e8-e82d7d1552bd.png)
「Diagnostics」を選択し、「Enable Diagnostics System」のチェックボックスをOFFにします。
![スクリーンショット 2021-11-02 7.52.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229633/d42cc636-05f0-58fd-46fe-611f76086c77.png)
参考 : [診断システムの構成](https://docs.microsoft.com/ja-jp/windows/mixed-reality/mrtk-unity/features/diagnostics/diagnostics-system-getting-started?view=mrtkunity-2021-05)


## 参考サイト
### 公式ドキュメント
https://docs.microsoft.com/ja-jp/windows/mixed-reality/mrtk-unity/?view=mrtkunity-2021-05

## Github
https://github.com/Microsoft/MixedRealityToolkit-Unity

## 参考にした本
- [Unityゲーム プログラミング・バイブル 2nd Generation](https://amzn.to/3vZdqki)