Oculus Integration v1.38からの変更履歴 (【旧】Oculus Quest Build 7.0アップデート後に自作アプリがおかしくなった時の対策)

# はじめに

先日Oculus Questがアップデートされて以下の記事のようにコントローラーのトラッキング改善やガーディアンの機能強化されました。

- [Quest / Go / Gear VR Build 7.0 Release Notes](https://forums.oculusvr.com/community/discussion/78866/quest-go-gear-vr-build-7-0-release-notes/p1)
- [Quest / Go / Gear VR Build 8.0 Release Notes](https://forums.oculusvr.com/community/discussion/79863/quest-go-gear-vr-build-8-0-release-notes/p1)
- [Quest / Go / Gear VR Build 9.0 Release Notes](https://forums.oculusvr.com/community/discussion/80983/quest-go-gear-vr-build-9-0-release-notes/p1)
- [Quest / Go / Gear VR Build 10.0 Release Notes](https://forums.oculusvr.com/community/discussion/81417/quest-go-gear-vr-build-10-0-release-notes/p1)
- [Quest / Go / Gear VR Build 11.0 Release Notes](https://forums.oculusvr.com/community/discussion/82136/quest-go-gear-vr-build-11-0-release-notes/p1)
- [Quest / Go / Gear VR Build 12.0 Release Notes](https://forums.oculusvr.com/community/discussion/83257/quest-go-gear-vr-build-12-0-release-notes/p1)
- [Quest / Go Build 13.0 Release Notes](https://forums.oculusvr.com/community/discussion/86022/quest-go-build-13-0-release-notes/p1)
- [Quest / Go Build 14.0 Release Notes](https://forums.oculusvr.com/community/discussion/86842/quest-go-build-14-0-release-notes/p1)
- [Quest / Go Build 15.0 Release Notes](https://forums.oculusvr.com/community/discussion/87642/quest-go-build-15-0-release-notes/p1)
- [Quest / Go Build 16.0 Release Notes](https://forums.oculusvr.com/community/discussion/88388/quest-go-build-16-0-release-notes/p1)
- [Quest / Go Build 17.0 Release Notes](https://forums.oculusvr.com/community/discussion/89544/quest-go-build-17-0-release-notes/p1)
- [Quest / Go Build 18.0 Release Notes](https://forums.oculusvr.com/community/discussion/90877/quest-go-build-18-0-release-notes/p1)
- [Quest Build 19.0 Release Notes](https://forums.oculusvr.com/community/discussion/91506/quest-build-19-0-release-notes/p1)
- [Quest Build 20.0 Release Notes](https://forums.oculusvr.com/community/discussion/92298/quest-build-20-0-release-notes/p1)
- [Quest 2 / Quest Build 23.0 Release Notes](https://forums.oculusvr.com/community/discussion/95181/quest-2-quest-build-23-0-release-notes/p1)
- [Quest 2 / Quest Build 25.0 Release Notes](https://forums.oculusvr.com/t5/Oculus-Quest-2-and-Quest/Quest-2-Quest-Build-25-0-Release-Notes/td-p/1)
- [Quest 2 / Quest Build 26.0 Release Notes](https://forums.oculusvr.com/t5/Oculus-Quest-2-and-Quest/Quest-2-Quest-Build-26-0-Release-Notes/td-p/851585)
- [Quest 2 / Quest Build 27.0 Release Notes](https://forums.oculusvr.com/t5/Oculus-Quest-2-and-Quest/Quest-2-Quest-Build-27-0-Release-Notes/td-p/857149)
- [Quest 2 / Quest Build 28.0 Release Notes](https://forums.oculusvr.com/t5/Oculus-Quest-2-and-Quest/Quest-2-Quest-Build-28-0-Release-Notes/m-p/862119)
- [Quest 2 / Quest Build 29.0 Release Notes](https://forums.oculusvr.com/t5/Oculus-Quest-2-and-Quest/Quest-2-Quest-Build-29-0-Release-Notes/m-p/867403)
- [Quest build v31 release notes](https://forums.oculusvr.com/t5/General/Quest-build-v31-release-notes/m-p/877560)
- [Oculus QuestとRift Sの次期アプデ内容が公開、トラッキング改善やディスプレイのトラブル解消へ](https://www.moguravr.com/oculus-quest-rift-s-next-update/)

このアップデートで自作したVRアプリを実行するとコントローラーが片手しかトラッキングされなくなったりボタンのマッピングがおかしくなってしまうので対策します。

また、Build 9.0にアップデートされると開発者モードがオフになってしまいます。スマホのアプリから再度オンにしてください。

**※追記1**
Oculus Integration v1.39.0のOvrAvatarの挙動も変わっているので対策します。
以下のシーンはOvrAvatarが使われていて未対策だとアプリがクラッシュするので対策必須です。

```
/Assets/Oculus/SampleFramework/Usage/AvatarGrab.scene
```

**※追記2**
Build 16.0から`AndroidManifest.xml`の`<application>`タグに`android:label="@string/app_name"`とリソースファイルの`app_name`の定義、もしくは`android:label="アプリ名"`がないと提供元不明なアプリに表示されなくなりました。Unityが生成する`AndroidManifest.xml`は大丈夫なので手動で削除していない限り問題ありません。
また、インストール済みのアプリが見えない場合は再インストールすると見えるようになります。

- [PSA: v16 of the firmware brings back new menu, BUT doesn't list most unknown sources apps anymore](https://www.reddit.com/r/OculusQuest/comments/g2n2ro/psa_v16_of_the_firmware_brings_back_new_menu_but/)

# 環境

- Oculus Integration for Unity
    - [v1.38.0](https://developer.oculus.com/downloads/package/unity-integration/1.38.0/)
    - [v1.39.0](https://developer.oculus.com/downloads/package/unity-integration/1.39.0/)
    - [v1.40.0](https://developer.oculus.com/downloads/package/unity-integration/1.40.0/)
    - [v1.41.0](https://developer.oculus.com/downloads/package/unity-integration/1.41.0/)
    - [v1.42.0](https://developer.oculus.com/downloads/package/unity-integration/1.42.0/)
    - [v1.43.0](https://developer.oculus.com/downloads/package/unity-integration/1.43.0/)
    - [v12.0(1.44.0)](https://developer.oculus.com/downloads/package/unity-integration/12.0/)
    - [v13.0(1.45.0)](https://developer.oculus.com/downloads/package/unity-integration/13.0/)
    - [v14.0(1.46.0)](https://developer.oculus.com/downloads/package/unity-integration/14.0/)
    - [v15.0(1.47.0)](https://developer.oculus.com/downloads/package/unity-integration/15.0/)
    - [v16.0(1.48.0)](https://developer.oculus.com/downloads/package/unity-integration/16.0/)
    - [v17.0(1.49.0)](https://developer.oculus.com/downloads/package/unity-integration/17.0/)
    - [v18.0(1.50.0)](https://developer.oculus.com/downloads/package/unity-integration/18.0/)
    - [v19.0(1.51.0)](https://developer.oculus.com/downloads/package/unity-integration/19.0/)
    - [v19.1(1.51.1)](https://developer.oculus.com/downloads/package/unity-integration/19.1/)
    - [v20.0(1.52.0)](https://developer.oculus.com/downloads/package/unity-integration/20.0/)
    - [v20.1(1.52.1)](https://developer.oculus.com/downloads/package/unity-integration/20.1/)
    - [v23.1(1.55.1)](https://developer.oculus.com/downloads/package/unity-integration/23.1/)
    - [v25.0(1.57.0)](https://developer.oculus.com/downloads/package/unity-integration/25.0/)
    - [v27.0(1.59.0)](https://developer.oculus.com/downloads/package/unity-integration/27.0)
    - [v28.0(1.60.0)](https://developer.oculus.com/downloads/package/unity-integration/28.0)
    - [v29.0(1.61.0)](https://developer.oculus.com/downloads/package/unity-integration/29.0)
    - [v31.0(1.63.0)](https://developer.oculus.com/downloads/package/unity-integration/31.0)
- Unreal Engine [UE ver.(Oculus Integration ver.)]
    - 4.22.3([v1.32.0](https://github.com/EpicGames/UnrealEngine/blob/4.22.3-release/Engine/Source/ThirdParty/Oculus/OVRPlugin/OVRPlugin/Include/OVR_Plugin_Types.h#L30-L32))
    - 4.23.1([v1.37.0](https://github.com/EpicGames/UnrealEngine/blob/4.23.1-release/Engine/Source/ThirdParty/Oculus/OVRPlugin/OVRPlugin/Include/OVR_Plugin_Types.h#L30-L32))
    - 4.24.3([v1.40.0](https://github.com/EpicGames/UnrealEngine/blob/4.24.3-release/Engine/Source/ThirdParty/Oculus/OVRPlugin/OVRPlugin/Include/OVR_Plugin_Types.h#L30-L32))
   -  4.25.4([v1.44.0](https://github.com/EpicGames/UnrealEngine/blob/4.25.4-release/Engine/Source/ThirdParty/Oculus/OVRPlugin/OVRPlugin/Include/OVR_Plugin_Types.h#L30-L32))
   -  4.26.2([v1.51.0](https://github.com/EpicGames/UnrealEngine/blob/4.26.2-release/Engine/Source/ThirdParty/Oculus/OVRPlugin/OVRPlugin/Include/OVR_Plugin_Types.h#L30-L32))
- Oculus Unreal Integration [Oculus Integration ver.(UE ver.)]
    - [v1.38.0](https://developer.oculus.com/downloads/package/unreal-engine-4-integration/1.38.0/)([4.22.2](https://github.com/Oculus-VR/UnrealEngine/blob/oculus-4.22.2-release-1.38.0/Engine/Source/ThirdParty/Oculus/OVRPlugin/OVRPlugin/Include/OVR_Plugin_Types.h#L30-L32))
    - [v1.39.0](https://developer.oculus.com/downloads/package/unreal-engine-4-integration/1.39.0/)([4.23.0-preview-3](https://github.com/Oculus-VR/UnrealEngine/blob/oculus-4.23.0-preview-3-1.39.0/Engine/Source/ThirdParty/Oculus/OVRPlugin/OVRPlugin/Include/OVR_Plugin_Types.h))
    - [v1.40.0](https://developer.oculus.com/downloads/package/unreal-engine-4-integration/1.40.0/)([4.23.0-preview-8](https://github.com/Oculus-VR/UnrealEngine/blob/oculus-4.23.0-preview-8-1.40.0/Engine/Source/ThirdParty/Oculus/OVRPlugin/OVRPlugin/Include/OVR_Plugin_Types.h#L30-L32))
    - [v1.41.0](https://developer.oculus.com/downloads/package/unreal-engine-4-integration/1.41.0/)([4.23.0](https://github.com/Oculus-VR/UnrealEngine/blob/oculus-4.23.0-release-1.41.0/Engine/Source/ThirdParty/Oculus/OVRPlugin/OVRPlugin/Include/OVR_Plugin_Types.h#L30-L32))
    - v1.42.0([4.23.1](https://github.com/Oculus-VR/UnrealEngine/blob/oculus-4.23.1-release-1.42.0/Engine/Source/ThirdParty/Oculus/OVRPlugin/OVRPlugin/Include/OVR_Plugin_Types.h#L30-L32))
    - [v1.43.0](https://developer.oculus.com/downloads/package/unreal-engine-4-integration/1.43.0/)([4.23.1](https://github.com/Oculus-VR/UnrealEngine/blob/oculus-4.23.1-release-1.43.0/Engine/Source/ThirdParty/Oculus/OVRPlugin/OVRPlugin/Include/OVR_Plugin_Types.h#L30-L32))
    - [v12.0(v1.44)](https://developer.oculus.com/downloads/package/unreal-engine-4-integration/12.0.0/)([4.24.1](https://github.com/Oculus-VR/UnrealEngine/blob/oculus-4.24.1-release-1.44.0-v12.0/Engine/Source/ThirdParty/Oculus/OVRPlugin/OVRPlugin/Include/OVR_Plugin_Types.h#L30-L32))
    - [v13.0(v1.45)](https://developer.oculus.com/downloads/package/unreal-engine-4-integration/13.0.0/)([4.24.2](https://github.com/Oculus-VR/UnrealEngine/blob/oculus-4.24.2-release-1.45.0-v13.0/Engine/Source/ThirdParty/Oculus/OVRPlugin/OVRPlugin/Include/OVR_Plugin_Types.h#L30-L32))
    - [v14.0(v1.46)](https://developer.oculus.com/downloads/package/unreal-engine-4-integration/14.0.0/)([4.24.3](https://github.com/Oculus-VR/UnrealEngine/blob/oculus-4.24.3-release-1.46.0-v14.0/Engine/Source/ThirdParty/Oculus/OVRPlugin/OVRPlugin/Include/OVR_Plugin_Types.h#L30-L32))
    - [v15.0(v1.47)](https://developer.oculus.com/downloads/package/unreal-engine-4-integration/15.0.0/)([4.24.3](https://github.com/Oculus-VR/UnrealEngine/blob/oculus-4.24.3-release-1.47.0-v15.0/Engine/Source/ThirdParty/Oculus/OVRPlugin/OVRPlugin/Include/OVR_Plugin_Types.h#L30-L32))
    - [v16.0(v1.48)](https://developer.oculus.com/downloads/package/unreal-engine-4-integration/16.0.0/)([4.24.3](https://github.com/Oculus-VR/UnrealEngine/blob/oculus-4.24.3-release-1.48.0-v16.0/Engine/Source/ThirdParty/Oculus/OVRPlugin/OVRPlugin/Include/OVR_Plugin_Types.h#L30-L32))
    - [v17.0(v1.49)](https://developer.oculus.com/downloads/package/unreal-engine-4-integration/17.0.0/)([4.25.0](https://github.com/Oculus-VR/UnrealEngine/blob/oculus-4.25.0-release-1.49.0-v17.0/Engine/Source/ThirdParty/Oculus/OVRPlugin/OVRPlugin/Include/OVR_Plugin_Types.h#L30-L32))
    - [v18.0(v1.50)](https://developer.oculus.com/downloads/package/unreal-engine-4-integration/18.0.0/)([4.25.1](https://github.com/Oculus-VR/UnrealEngine/blob/oculus-4.25.1-release-1.50.0-v18.0/Engine/Source/ThirdParty/Oculus/OVRPlugin/OVRPlugin/Include/OVR_Plugin_Types.h#L30-L32))
    - [v19.0(v1.51)](https://developer.oculus.com/downloads/package/unreal-engine-4-integration/19.0.0/)([4.25.3](https://github.com/Oculus-VR/UnrealEngine/blob/oculus-4.25.3-release-1.51.0-v19.0/Engine/Source/ThirdParty/Oculus/OVRPlugin/OVRPlugin/Include/OVR_Plugin_Types.h#L30-L32))
    - [v20.0(v1.52)](https://developer.oculus.com/downloads/package/unreal-engine-4-integration/20.0.0/)([4.25.3](https://github.com/Oculus-VR/UnrealEngine/blob/oculus-4.25.3-release-1.52.0-v20.0/Engine/Source/ThirdParty/Oculus/OVRPlugin/OVRPlugin/Include/OVR_Plugin_Types.h#L30-L32))
    - [v20.1(v1.52.1)](https://developer.oculus.com/downloads/package/unreal-engine-4-integration/20.1.0/)([4.25.3](https://github.com/Oculus-VR/UnrealEngine/blob/oculus-4.25.3-release-1.52.1-v20.1/Engine/Source/ThirdParty/Oculus/OVRPlugin/OVRPlugin/Include/OVR_Plugin_Types.h#L30-L32))
    - [v23.0(v1.55.0)](https://developer.oculus.com/downloads/package/unreal-engine-4-integration/23.0.0/)([4.25.4](https://github.com/Oculus-VR/UnrealEngine/blob/oculus-4.25.4-release-1.55.0-v23.0/Engine/Source/ThirdParty/Oculus/OVRPlugin/OVRPlugin/Include/OVR_Plugin_Types.h#L24-L26))
    - [v25.0(v1.57.0)](https://developer.oculus.com/downloads/package/unreal-engine-4-integration/25.0.0/)([4.26.0](https://github.com/Oculus-VR/UnrealEngine/blob/oculus-4.26.0-release-1.57.0-v25.0/Engine/Source/ThirdParty/Oculus/OVRPlugin/OVRPlugin/Include/OVR_Plugin_Types.h#L24-L26))
    - [v27.0(v1.59.0)](https://developer.oculus.com/downloads/package/unreal-engine-4-integration/27.0.0/)([4.26.1](https://github.com/Oculus-VR/UnrealEngine/blob/oculus-4.26.1-release-1.59.0-v27.0/Engine/Source/ThirdParty/Oculus/OVRPlugin/OVRPlugin/Include/OVR_Plugin_Types.h#L24-L26))
    - [v28.0(v1.60.0)](https://developer.oculus.com/downloads/package/unreal-engine-4-integration/28.0.0/)([4.26.2](https://github.com/Oculus-VR/UnrealEngine/blob/oculus-4.26.2-release-1.60.0-v28.0/Engine/Source/ThirdParty/Oculus/OVRPlugin/OVRPlugin/Include/OVR_Plugin_Types.h#L24-L26))
    - [v29.0(v1.61.0)](https://developer.oculus.com/downloads/package/unreal-engine-4-integration/29.0.0/)([4.26.2](https://github.com/Oculus-VR/UnrealEngine/blob/oculus-4.26.2-release-1.61.0-v29.0/Engine/Source/ThirdParty/Oculus/OVRPlugin/OVRPlugin/Include/OVR_Plugin_Types.h#L24-L26))
    - [v31.0(v1.63.0)](https://developer.oculus.com/downloads/package/unreal-engine-4-integration/31.0.0/)([4.26.2](https://github.com/Oculus-VR/UnrealEngine/blob/oculus-4.26.2-release-1.63.0-v31.0/Engine/Source/ThirdParty/Oculus/OVRPlugin/OVRPlugin/Include/OVR_Plugin_Types.h#L24-L26))


# Unity

## コントローラーの対策

公式ドキュメントに設定手順が追加されていました。

- [Oculus Unity Getting Started Guide](https://developer.oculus.com/documentation/quest/latest/concepts/book-unity-gsg/#oculus-integration-for-unity)

v1.41.0からOVRManagerコンポーネントのTarget Deivcesは`Quest`がデフォルトになったので何も変更しなくてもよくなりました。そのため逆にOculus Goアプリを作る場合は変更が必要となります。

v1.40.0からOVRManagerコンポーネントのTarget Devicesの先頭を`Quest`に変更するだけでよくなりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/ccb72b20-e408-19b5-dbb2-f9b78f02d668.png)

v1.39.0とv1.38.0はOVRManagerコンポーネントのTarget Devicesの先頭を`Quest`に変更した上でAndroidManifest.xmlに`uses-feature`を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/5b9d5eb5-3c29-32f5-d4c2-a4c941eb24f1.png)


---

公式ドキュメントに追加される前に[Fix for sideloaded/homebrew apps and games with the new firmware update](https://www.reddit.com/r/OculusQuest/comments/chjpu5/fix_for_sideloadedhomebrew_apps_and_games_with/)で対策を見付けた方がいて`AndroidManifest.xml` に以下のfeatureを追加すれば両手のコントローラーが正しくトラッキングされます。これはQuestアプリをOculus Storeに提出する時に必須の設定のようです。

- [Android Manifest Settings (Quest)](https://developer.oculus.com/documentation/quest/latest/concepts/mobile-native-manifest/)

```xml:AndroidManifest.xml
<uses-feature android:name="android.hardware.vr.headtracking" android:required="true" android:version="1"/>
```

具体的に以下のいずれかの方法で`AndroidManifest.xml`を修正します。

### v14.0(v1.46.0)以降

Oculus Integration **v14.0(1.46.0)**から`OVRManager`の`Target Devices`がドロップダウンリストからチェックボックスに変わりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/2a280331-dc10-b015-5217-03bd79a0307a.png)

### v1.40.0以降

Oculus Integration **v1.40.0**から少し手間が減ったので更新をおすすめします。
v1.38.0とv1.39.0のQuest対応が中途半端なのが混乱の元凶だったんだ…

1. OVRManagerのTarget Devicesに`Quest`を追加します。Quest向けアプリなら既に設定済みだと思います。更に**v1.41.0はデフォルト値が`Quest`に変わった**ので設定不要になりました。逆にOculus Goアプリを作る時に設定変更が必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/80837c3e-32b4-5a38-94b4-6f1e763c6308.png)
1. Unity2018.4以下でBuild SettingsのビルドシステムがInternalならGradleに変更します。Unity2019.1以上はビルドシステムの項目がなくなりGradleのみになったので特に設定するものはありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/55b93611-01df-dc25-c911-eb99759adaf8.png)

以上の設定で独自に`/Assets/Plugins/Android/AndroidManifest.xml`がなくてもビルド時にQuestに必要なfeatureが自動で追加されます。

### v1.39.0以前

#### Create store-compatible AndroidManifest.xml

Oculus Store提出用のAndroidManifest.xmlを作る方法です。

1. v1.40.0以上に更新する方法と同様にOVRManagerのTarget Devicesに`Quest`を追加します。
2. 次に`/Assets/Plugins/Android/AndroidManifest.xml`を削除します。メニューのOculus > Tools > Remove AndroidManifest.xmlが簡単です。
3. 最後にメニューのOculus > Tools > Create store-compatible AndroidManifest.xmlを実行します。これで上記のfeatureが含まれたAndroidManifest.xmlが生成されます。あらかじめOVRManagerのTarget Devicesに`Quest`を入れておかないと必要なfeatureが含まれないので注意してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/c41168a9-8be0-e67d-0e16-b2c9f5108ceb.png)

#### ビルドして実行エラー対策

* v1.39.0までのバージョンで生成した`AndroidManifest.xml`で「ビルドして実行」を行うと以下のエラーが出ます。これはビルドとインストールまで完了しているのですがUnityから実行する時に必要な`android.intent.category.LAUNCHER`が定義されていないためです。
* v1.40.0から`android.intent.category.LAUNCHER`が定義された`AndroidManifest.xml`が生成されるようになったのでビルドして実行エラーは出なくなりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/cdf6df4e-0379-3b3a-4fde-beadb1421353.png)

そこで以下のように`android.intent.category.LAUNCHER`を追加するとビルドして実行からアプリの実行までできるようになります。

```xml:AndroidManifest.xml
<intent-filter>
    <action android:name="android.intent.action.MAIN"/>
    <category android:name="android.intent.category.INFO"/>
    <category android:name="android.intent.category.LAUNCHER"/> <!-- この行を追加する -->
</intent-filter>
```

#### 直接記述する

UnityプロジェクトでAndroid向けにビルドすると`[Project Folder]/Temp/gradleOut/src/main/AndroidManifext.xml`が生成されるので`[Project Folder]/Assets/Plugins/Android/AndroidManifest.xml`にコピーして他の`uses-feature`の近くに上記のfeatureを追記します。


#### コールバックで対策する

UnityはGradleプロジェクト生成後に呼ばれるコールバックがあるので以下のスクリプトで`AndroidManifest.xml`に上記のfeatureを追加します。

このコールバックを利用すると次のような事もできます。

- [UnityでOculus Go/Questアプリをビルドする時に不要なパーミッションを取り除く](https://qiita.com/shiena/items/88217a3fc76370e77078)
- [UnityでAARに入っているAndroidManifest.xmlからマージされる要素を取り除く](https://qiita.com/shiena/items/df9912c15c4fbc617e35)

```cs:/Assets/Editor/ModifyUnityAndroidAppManifest.cs
#if UNITY_ANDROID
using System;
using System.IO;
using System.Text;
using System.Xml;
using UnityEditor;
using UnityEditor.Android;

public class ModifyUnityAndroidAppManifest : IPostGenerateGradleAndroidProject
{
	public void OnPostGenerateGradleAndroidProject(string basePath)
	{
		var isVr = PlayerSettings.GetVirtualRealitySupported(BuildTargetGroup.Android);
		var vrSdks = PlayerSettings.GetVirtualRealitySDKs(BuildTargetGroup.Android);
		var hasOculus = Array.Exists(vrSdks, s => s == OVRManager.OCULUS_UNITY_NAME_STR);

		if (isVr && hasOculus)
		{
			if (OVRDeviceSelector.isTargetDeviceQuest)
			{
				var androidManifest = new AndroidManifest(GetManifestPath(basePath));
				androidManifest.EnableQuestApp();
				androidManifest.Save();
			}
		}

	}

	public int callbackOrder => 10;

	private string _manifestFilePath;

	private string GetManifestPath(string basePath)
	{
		if (string.IsNullOrEmpty(_manifestFilePath))
		{
			var pathBuilder = new StringBuilder(basePath);
			pathBuilder.Append(Path.DirectorySeparatorChar).Append("src");
			pathBuilder.Append(Path.DirectorySeparatorChar).Append("main");
			pathBuilder.Append(Path.DirectorySeparatorChar).Append("AndroidManifest.xml");
			_manifestFilePath = pathBuilder.ToString();
		}

		return _manifestFilePath;
	}
}


internal class AndroidXmlDocument : XmlDocument
{
	private string m_Path;
	protected XmlNamespaceManager nsMgr;
	public readonly string AndroidXmlNamespace = "http://schemas.android.com/apk/res/android";
	public readonly string ToolsXmlNamespace = "http://schemas.android.com/tools";

	public AndroidXmlDocument(string path)
	{
		m_Path = path;
		using (var reader = new XmlTextReader(m_Path))
		{
			reader.Read();
			Load(reader);
		}

		nsMgr = new XmlNamespaceManager(NameTable);
		nsMgr.AddNamespace("android", AndroidXmlNamespace);
	}

	public string Save()
	{
		return SaveAs(m_Path);
	}

	public string SaveAs(string path)
	{
		using (var writer = new XmlTextWriter(path, new UTF8Encoding(false)))
		{
			writer.Formatting = Formatting.Indented;
			Save(writer);
		}

		return path;
	}
}

internal class AndroidManifest : AndroidXmlDocument
{
	private readonly XmlElement ApplicationElement;

	public AndroidManifest(string path) : base(path)
	{
		ApplicationElement = SelectSingleNode("/manifest/application") as XmlElement;
	}

	private XmlAttribute CreateAndroidAttribute(string key, string value)
	{
		var attr = CreateAttribute("android", key, AndroidXmlNamespace);
		attr.Value = value;
		return attr;
	}

	private XmlAttribute CreateToolsAttribute(string key, string value)
	{
		var attr = CreateAttribute("tools", key, ToolsXmlNamespace);
		attr.Value = value;
		return attr;
	}

	public void EnableQuestApp()
	{
		const string headTrackingName = "android.hardware.vr.headtracking";
		var headTrackingData = SelectNodes($"/manifest/uses-feature[@android:name='{headTrackingName}']", nsMgr);
		if (headTrackingData != null && headTrackingData.Count > 0)
		{
			return;
		}

		var manifest = SelectSingleNode("/manifest");
		if (manifest == null)
		{
			return;
		}

		// /manifest に <uses-feature android:name="android.hardware.vr.headtracking" android:required="true" android:version="1" tools:node="merge" /> を追加する
		var newUsesFeature = CreateElement("uses-feature");
		newUsesFeature.Attributes.Append(CreateAndroidAttribute("name", headTrackingName));
		newUsesFeature.Attributes.Append(CreateAndroidAttribute("required", "true"));
		newUsesFeature.Attributes.Append(CreateAndroidAttribute("version", "1"));
		newUsesFeature.Attributes.Append(CreateToolsAttribute("node", "merge"));

		manifest.AppendChild(newUsesFeature);
	}
}
#endif
```

## OvrAvatarの対策

* v1.38.0のOvrAvatarはARMv7向けライブラリしかありません。IL2CPP/ARM64でビルドおよび実行できるのですが手が表示されません。ARMv7でビルドしましょう。
* v1.39.0以降のOvrAvatarはOculus > Avatars > Edit Settingsから生成したOvrAvatarSettings.assetにId設定が必須になりました。未設定だとクラッシュしてしまうので自分のIdや[Testing Your Integration](https://developer.oculus.com/documentation/avatarsdk/latest/concepts/avatars-gsg-unity-mobile/#testing-your-integration)に用意されているテスト用Idを設定します。
また、ARM64向けライブラリが追加されたのですがIL2CPP/ARM64でビルドして実行するとスプラッシュ画面の後に[Oculus Questで「アップデート中」が出た場合の対処法](https://qiita.com/y-michishita/items/540a2703c288c674c0f2)と同じダイアログが出て結局実行できません…
* v1.40.0でARM64でビルドしても動くようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/d13933c8-842d-a223-7649-36a8882921dc.png)

またv1.39.0以降のOvrAvatarで`Controller Shader`が追加されていますが`/Assets/Oculus/SampleFramework/Usage/AvatarGrab.scene`では設定されていないのが原因でアバターのオブジェクトを無限生成して落ちてしまいます。
`/Assets/Oculus/Avatar/Content/Prefabs/LocalAvatar.prefab`を参考に`OvrAvatar/AvatarPBRV2Simple`を設定すればよいでしょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/b55aec11-04e4-d5e7-dd5f-c35c1f7cf6d5.png)

## v1.41.0

### セキュリティ設定

Oculus Integration **v1.41.0**から`OVRManager`にセキュリティ設定が追加されました。

* `Disable Backups`をチェックするとAndroidManifest.xmlに`android:allowBackup="false"`が設定されて`adb`コマンドでもバックアップできなくなります。
* `Enable NSC Configuration`をチェックすると[ネットワークセキュリティ構成](https://developer.android.com/training/articles/security-config)が有効になりHTTPS通信が必須になります。設定ファイルは`/Assets/Oculus/VR/Editor/network_sec_config.xml`にあるので必要に応じて設定を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/d9931961-1c58-c411-f321-55c1a78067f8.png)

### Low Overhead ModeとOVROverlay

Oculus Integration **v1.41.0**と**Unity2018.4.9f1** / **Unity2019.2.0f1**からLow Overhead Modeが追加されています。このオプションを有効にするとOpenGL ESのエラーチェックをスキップしてパフォーマンスを向上させるのですがOVROverlayを一緒に使うとクラッシュしてしまいます。他にもクラッシュする原因があるかもしれないので安易に有効にするのは危険です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/f2e59bbd-c2ab-8abc-890b-db4120a42fe9.png)

## v1.42.0

### OVRVoiceModが同梱されなくなった

Oculus Integration v1.41.0までOVRVoiceMod(ボイスチェンジャーみたいなもの)が同梱されていたのですが**v1.42.0**から削除されました。
必要な場合は別途ダウンロードすると引き続き利用できます。

* [Oculus OVRVoiceMod for Unity 5](https://developer.oculus.com/downloads/package/oculus-ovrvoicemod-for-unity-5/)

### GearVRサポート廃止

Oculus開発ブログよりOculus Integration **v1.42.0** (Mobile SDK **1.27.0**)からGearVRのサポートが廃止されます。GearVRアプリを開発する場合はそれより前のバージョンを使う必要があります。

- [Gear VR Update: Gear VR App Development no Longer Supported From Oculus SDK Suite 1.42 and Future Versions](https://developer.oculus.com/blog/gear-vr-app-development-no-longer-supported-from-sdk-suite-142-and-future-versions/)

## v12.0(1.44.0)

### ハンドトラッキング設定

**permission名はv17.0(1.49.0)から`com.oculus.permission.HAND_TRACKING`変更されています。**

Oculus Integration **v12.0(1.44.0)**から`OVRManager`にハンドトラッキング設定が追加されました。
デフォルトでは`Controllers Only`なのでハンドトラッキングを使う場合は`Controllers And Hands`か`Hands Only`に変更してください。
この設定によりAndroidManifest.xmlに以下が追加されます。

- Controllers Only
    - 変更なし
- Controllers And Hands

    ```xml:AndroidManifest.xml
    <uses-permission android:name="oculus.permission.handtracking" />
    <uses-feature android:name="oculus.software.handtracking" android:required="false" />
    ```

- Hands Only

    ```xml:AndroidManifest.xml
    <uses-permission android:name="oculus.permission.handtracking" />
    <uses-feature android:name="oculus.software.handtracking" android:required="true" />
    ```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/0120879a-3edb-acd9-510e-2eb4e0b2e441.png)

## v13.0(1.45.0)

### Enable Focus Awareness

Oculus Integration **v13.0(1.45.0)**から`OVRManager`に[Enabling Focus Awareness](https://developer.oculus.com/documentation/unity/unity-overlays/)が追加されました。
Oculus QuestのアプリはシステムUIが表示される時はアプリが一時停止するのですがこの機能を有効にするとアプリが動いたままシステムUIがオーバーレイで表示されるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/cbd7a7b3-cded-c702-00a7-0aabc9f6bd47.png)

### Unityエディターでハンドトラッキングサポート

Oculus Integration **v13.0(1.45.0)**からOculus QuestでOculus Linkを有効にしてUnityエディターをPlayするとハンドトラッキングできます。
ただしマウスやキーボードでUnityエディターをPlayすると動いたのですが、Oculus DesktopからPlayするとUnityエディターが落ちてしまいました。

Unityエディタがクラッシュする件について @torano0314 さんから再現パターンをコメントで教えてきただきました。ハンドトラッキングしたい時はコントローラーが認識されなくなるまで待てば良さそうです。

> Oculus Questでハンドトラッキング有効にし、Linkを使ってエディターから実行するとクラッシュする問題ですが、Oculus Desktopには関係なく、コントローラを触っているとクラッシュするみたいです。コントローラが認識されなくなるのを待ち(コントローラが画面から消え、コントローラが必要です、のようなポップアップがでるのを待ち)実行するとクラッシュしないで済みます。
> https://forums.oculusvr.com/developer/discussion/86322/v13-15-editor-crashes-on-play-after-upgrading-oculus-integration#latest
> 
> また他にもAndroidManifestやOVRManagerのハンドトラッキングの項目に関わらず手とコントローラ両方が有効になっているという問題もあります。(ハンドトラッキングがオフの時は問題ないかもしれません。)
> 
> この問題はv13のときにOculusに報告したのですがまだ解決されず、v15でも続いているみたいです。何か解決策がないかと探しているのですが見つからず。。。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Unityエディタでハンドトラッキング動いたあああ。さっきと何が違ったんだろう？ <a href="https://t.co/CEqHbm5Emg">https://t.co/CEqHbm5Emg</a> <a href="https://t.co/6R6HDelR2O">pic.twitter.com/6R6HDelR2O</a></p>&mdash; KOGA Mitsuhiro (@shiena) <a href="https://twitter.com/shiena/status/1226124217873096705?ref_src=twsrc%5Etfw">February 8, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## v14.0(1.46.0)

### dynamic foveation

Oculus Integration **v14.0(1.46.0)**から`OVRManager`にdynamic foveationが追加されました。有効にすると適切なfoveation levelに設定されます。

```csharp
/// <summary>
/// Let the system decide the best foveation level adaptively (Off .. fixedFoveatedRenderingLevel)
/// This feature is only supported on QCOMM-based Android devices
/// </summary>
public static bool useDynamicFixedFoveatedRendering
{
	get
	{
		if (!OVRPlugin.fixedFoveatedRenderingSupported)
		{
			Debug.LogWarning("Fixed Foveated Rendering feature is not supported");
		}
		return OVRPlugin.useDynamicFixedFoveatedRendering;
	}
	set
	{
		if (!OVRPlugin.fixedFoveatedRenderingSupported)
		{
			Debug.LogWarning("Fixed Foveated Rendering feature is not supported");
		}
		OVRPlugin.useDynamicFixedFoveatedRendering = value;
	}
}
```

### Color Gamut

Oculus Integration **v14.0(1.46.0)**から`OVRManager`で`Color Gamut`を設定できるようになりました。

![color_gamut.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/edf25306-d9fc-2fd6-3dc7-efbad85ac154.png)

## v15.0(1.47.0)

### OVRVignette

Oculus Integration **v15.0(1.47.0)**から`OVRVignette`が追加されてCameraと同じGameObjectにアタッチするとVignetteエフェクトを表現できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/ffa9215a-6f1d-2ed8-6df3-039b3232fae3.png)

### OVRManager/Security/Custom Security XML Path

Oculus Integration **v17.0(1.49.0)**からOVRManagerのSecucityで`Custom Security XML Path`を指定できるようになりました。
それまでは`Assets/Oculus/VR/Editor/network_sec_config.xml`で固定されていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/664d0c34-4ed5-1ccf-9b39-0e22a8d28f65.png)

### リリース版ハンドトラッキングのパーミッション

Oculus Integration **v17.0(1.49.0)**からOculus Questでハンドトラッキングを有効にした時のパーミッション名が変更されました。
自前で用意した`AndroidManifest.xml`に記述した場合は変更が必要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/6734dd53-f3ca-ef96-14b4-fa8703cc015a.png)

## v18.0(1.50.0)

### v18.0からUnity2018.4.3f1以上必須

Oculus Integration **v18.0(1.50.0)**からUnity2018.4.3f1以上が必要になったのでそれ以前のバージョンを判定する`#if UNITY_2018_3_OR_NEWER`のようなプリプロセッサディレクティブが削除されました。

## v19.0(1.51.0) / v19.1(1.51.1)

### Oculus Questで組み込みキーボード

Oculus Integration **v19.0(1.50.1)**から`Focus Aware`と`Requires System Keyboard`を有効にするとInput Filedにフォーカスを当てた時にシステムキーボードを利用できるようになりました。またプログラムからは[TouchScreenKeyboard](https://docs.unity3d.com/ScriptReference/TouchScreenKeyboard.html)で開くことができます。

- [Enable Keyboard Overlay in Unity](https://developer.oculus.com/documentation/unity/unity-keyboard-overlay/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/cb24633e-16b4-9f26-3956-dd0c3ca4f57b.png)

`Require System Keyboard`を有効にするとAndroidManifest.xmlに以下の`uses-feature`が追加されます。

```xml:AndroidManifest.xml
<uses-feature android:name="oculus.software.overlay_keyboard" android:required="false"/>
```

キーボードが出ない場合は一旦ユニバーサルメニューを無効にして再度有効にすると出るかもしれません。

![com.DefaultCompany.XRInteractionExamples-20200811-042138.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/04c3dc1c-97ba-fd4d-65d1-e97a8c5d17b0.jpeg)

### v19.0からGearVR/OculusGoが非推奨

Oculus Integration **v19.0(1.50.1)**からGearVR/OculusGo対応コードが削除されました。それに伴ないOVRManagerの`Target Devices`もQuestしか選べなくなっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/d39122ac-700c-fc97-0050-7b013a5fa78d.png)

### ARM64とOculus XR Plugin 1.4.0以上を推奨

Oculus Integration **v19.0(1.50.1)**からARM64とOculus XR Plugin 1.4.0以上が推奨されています。ARMv7や古いOculus XR PluginやレガシーXRサポートで問題が出たら切り替えると解決するようです。

## v20.0(1.52.0)

### OVROverlayをエディタでプレビュー

Oculus Integration **v20.0(1.52.0)**からOVROverlayをエディタでプレビューできるようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/527ad35d-c04a-9c1a-b90d-2ed4284f7d5b.png)

### SampleFrameworkのGuardianBoundarySystem削除

Oculus Integration **v20.0(1.52.0)**からSampleFrameworkにあった以下のGuardianBoundarySystemシーンとアセットが削除されました。

```
Assets/Oculus/SampleFramework/Usage/GuardianBoundarySystem.unity
Assets/Oculus/SampleFramework/Usage/GuardianBoundarySystem/
```

## v20.1(1.52.1)

### Oculus Quest2をサポート

Oculus Integration **v20.1(1.52.1)**からOculus Quest2がサポートされて以下の通りに変更されました。

* OVRManagerのTarget DevicesにQuest2が追加されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/c7fc6322-b455-4086-fe01-66a12285d67f.png)
* Quest2をチェックするとビルド時にmeta-data属性が追加されます。これでQuest2をサポートする事を示します。
    * [Android Manifest Settings (Quest)](https://developer.oculus.com/documentation/quest/latest/concepts/mobile-native-manifest/)
    
    ```xml:AndroidManifest.xml
<meta-data android:name="com.oculus.supportedDevices" android:value="quest|delmar"/>
    ```
* meta-dataを追加するとQuest2の`OVRPlugin.GetHeadsetType()`は`SystemHeadset.Oculus_Quest_2`を返します。meta-dataがない場合はQuest2でも`SystemHeadset.Oculus_Quest`を返します。
* OVRController.prefabにQuest2のモデルが追加されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/edd7a418-eb18-b246-2d6c-c22f9b505a52.png)

## v23.1(1.55.1)

### OpenXRを実験的にサポート

Oculus Integration **v23.1(1.55.1)**からOpenXRを実験的にサポートされてメニューから有効、無効を切り替えられるようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/1b344420-d9fb-c68b-ac49-e9be9f3ab63c.png)

現時点では以下の機能がサポートされていません。
> Considering that the availablity of OVRPlugin with OpenXR is under experimental state, there are a few known features that are not supported. The list includes FFR, OVROverlay, Near touch buttons, and Hand tracking.

- [Activate Oculus Utilities Plugin with OpenXR](https://developer.oculus.com/documentation/unity/unity-openxr/)

### 同期フェーズ

Oculus Integration **v23.1(1.55.1)**から同期フェーズがサポートされました。
XR Plugin ManagementとOculus XR Plugin v1.7.0以上で設定できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/fd318d8f-dfa3-5be8-6446-06ecc80c1b8d.png)

- [Enable Phase Sync](https://developer.oculus.com/documentation/unity/enable-phase-sync/)

### Quest2で80Hzと90Hzのリフレッシュレートをサポート

Oculus Integration **v23.1(1.55.1)**から80Hzと90Hzの表示リフレッシュレートをサポートするようになりました。
このリフレッシュレートを利用するためには以下のQuest2判定も一緒に設定が必要です。

- [表示リフレッシュレートの設定](https://developer.oculus.com/documentation/unity/unity-set-disp-freq/)

### Quest2判定の値変更

Oculus Integration **v23.1(1.55.1)**からOculus Quest2判定の値が`delmar`から`quest2`に変わりました。
自前で用意したAndroidManifest.xmlに記述した場合は変更が必要です。

```xml:AndroidManifest.xml
<meta-data android:name="com.oculus.supportedDevices" android:value="quest|quest2"/>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/39b7bea0-690d-4444-7528-37bb6ebbfb2a.png)

### ~~Android arm64版のOculusSparializerがなくなった~~

いつの間にか戻っていました。
~~Oculus Integration **v23.1(1.55.1)**で何故かarm64版のOculusSpatializerが削除されました。~~

<details>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/9b5b32e8-567a-3a81-aa0b-e787acdb3bac.png)
</details>

## v25.0(1.57.0)

- Unityからストアにデバッグシンボルをアップロードできるようになる
- コントローラーがアニメーションする
- Color Space APIが`nativeColorGamut`と`colorGamut`を使う
- OVROverlayが魚眼レイヤーをサポート
- `OVRPlugin.SetKeyboardOverlayUV()`でキーボード位置を変更するAPI追加
- `eyeFovPremultipliedAlphaModeEnabled`でEye Fovレイヤーの事前アルファの有効、無効を可能になる
- 以下のOpenXRの機能をサポート
    - Different color spaces
    - Color Scale/Bias
    - Is External Surface
    - Equirect Layer
    - Cubemap Layer
    - Underlays
    - Left/Right Textures
    - Headlocked Layer
    - Cylinder Layer
    - Quad Layer

## v27.0(1.59.0)～v29.0(1.61.0)

主にバグ修正とOpenXRのサポート範囲拡大です。

## v31.0(1.63.0)

- カメラパススルーAPIを追加
    - パススルーAPIを使うためには以下の設定が必須です。
    - Unity2019.4以前の場合はメニューのOculus -> Tools -> OpenXR -> Switch to OVRPlugin with OpenXR backendを実行してOpenXRを有効にする
    - Color SpaceをLinearに設定
    - Scripting BackendをIL2CPPに設定
    - Target ArchitectureをARM64をチェック
    - OVRManagerで`Experiment Features Enabled`と`Passthrough Capability Enabled`と`Enable Paththrough`をチェック
    - `adb shell setprop debug.oculus.experimentalEnabled 1`を実行する
- Firebase AnalyticsとCrashlyticsを組込むサンプル追加
    - Firebase Unity SDKをインストールしてメニューのOculus -> Samples -> Firebase -> Enable Firebase Sampleを実行するとサンプルシーンの`Assets/Oculus/SampleFramework/Usage/Firebase.unity`で確認できます。

## XR Managementパッケージ利用時の注意

Package Managerにある[XR Management](https://docs.unity3d.com/Packages/com.unity.xr.management@3.0/manual/index.html)とXR SettingsのVRサポートはどちらか一方しか利用できません。またXR Managementパッケージを利用する時は[Oculus XR Plugin](https://docs.unity3d.com/Packages/com.unity.xr.oculus@1.1/manual/index.html)も一緒に利用しないとOVRInputなどが動作しなくなるので必ずOculus Loaderを設定して`Initialize on Startup`を有効にしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/55484f68-c133-91cc-0a15-79661099b2ec.png)

## Oculus Integration更新時に注意すること

Oculus Integrationはバージョンアップでファイルのパスが変わることがあるので上書き更新するとおかしな状態になる事があります。そのため`/Assets/Oculus/`と`/Assets/Oculus.meta`を削除した後に新規でインポートすることをお勧めします。その際にUnityから`/Assets/Oculus/`を削除してもUnityがdllをロックしているのでいくつか削除されないファイルがあります。
なので以下の手順が確実です。

1. 一旦、Unityを終了する
2. エクスプローラから`/Assets/Oculus/`と`/Assets/Oculus.meta`を削除する
3. Unityを開く。この時Oculus Integrationがないのでエラーが出るが一旦無視する
4. Asset StoreからOculus Integrationをインポートする

# Oculus Link

Oculus HomeおよびOculus Quest v13から「コントロールパネル > サウンド > 再生」にあるOculus Virtual Audio Deviceの名前を`Headphones`にしないとOculus Linkにつながらなくなりました。

https://forums.oculusvr.com/community/discussion/comment/730475/#Comment_730475

# UE4

## コントローラーの対策

公式ドキュメントに設定手順が追加されていました。

- [Oculus Quest: Quick Start](https://developer.oculus.com/documentation/quest/latest/concepts/unreal-quick-start-guide-quest/#developing-applications-with-the-ue4-editor)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/5df47609-76d7-de6b-f705-8075bf93674b.png)

---

### UE4.23以降

1. プロジェクト設定 > Oculus VRプラグインの`Launch Oculus Performance Windows`から`Target Platform`を`Mobile`に変更します。
2. プロジェクト設定 > Android > Advanced APK Packagingの`Package for Oculus Mobile devices`に`Oculus Quest`を追加します。

以上を設定することで`Engine\Plugins\Runtime\Oculus\OculusVR\Source\OculusHMD\OculusMobile_APL.xml`によりAndroidManifest.xmlにfeatureが追加されます。

- https://forums.oculusvr.com/developer/discussion/comment/699790/#Comment_699790

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/b023f0b3-26e8-3d5f-f543-036d63e88af2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/77021864-b13f-06ff-5d58-5140e73ebe24.png)


### UE4.22以前

`[Project Folder]/Build/Android/ManifestRequirementsAdditions.txt`に上述したfeatureを記述するとビルド時にAndroidManifest.xmlに追加されます。このフォルダはプロジェクト設定の`ビルドフォルダを開く`ボタンから開くことができます。
以下のリンクでは`ManifestRequirementsOverride.txt`が使われていますがUE4独自の設定も上書きするので追加だけの`ManifestRequirementsAdditions.txt`の方が安全です。

- https://forums.oculusvr.com/community/discussion/comment/698454/#Comment_698454
- https://answers.unrealengine.com/questions/912347/view.html
- https://www.reddit.com/r/OculusQuest/comments/chjpu5/fix_for_sideloadedhomebrew_apps_and_games_with/eved24q/
- [[UE4] AndroidManifest.xmlをカスタマイズする](http://historia.co.jp/archives/5892/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/6ba4e114-f147-2a45-1d7e-8e7f7fb16a60.png)

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/pafuhana1213?ref_src=twsrc%5Etfw">@pafuhana1213</a> <a href="https://twitter.com/CrabPunch?ref_src=twsrc%5Etfw">@CrabPunch</a> マニフェスト生成のコード見たら、上記の通りManifestRequirementsAdditions.txtで追記するしかないっぽくて試したらちゃんとQuestで両手動くようになりました！！</p>&mdash; なっつー@BNUT　Vスタンプリニューアル！ (@yashinut) <a href="https://twitter.com/yashinut/status/1155377399195791361?ref_src=twsrc%5Etfw">July 28, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## ハンドトラッキングの対策

### UE4.24以前

Oculus Unreal Integrationならハンドトラッキングに対応したMobile SDKが入っていますが設定画面やBlueprintなどがありません。
ハンドトラッキングAPIはC++から呼び出し、上記の`ManifestRequirementsAdditions.txt`にハンドトラッキング用の`uses-permission`と`uses-feature`を記述すると動作します。

- [UE4によるOculus Quest ハンドトラッキング 自前対応への道](https://qiita.com/ruyo/items/08ac751ba61cb1201e96)

# 原因

今後Oculus QuestにはOculus Goをエミュレートする機能が追加される予定です。その機能が一部取り込まれて今回のfeatureがあるとQuest向け、ないとGo向けとして動作しているのではないかと思われます。

- [Oculus Quest Is Getting Go Emulation ‘Later This Year’](https://uploadvr.com/oculus-quest-go-emulation/)
- [Oculus Questに“Oculus Goのアプリが使える”モードが実装予定](https://www.moguravr.com/oculus-quest-21/)

# 参考リンク

- Build 7.0とGoエミュレーション
	- [Quest / Go / Gear VR Build 7.0 Release Notes](https://forums.oculusvr.com/community/discussion/78866/quest-go-gear-vr-build-7-0-release-notes/p1)
	- [Quest / Go / Gear VR Build 8.0 Release Notes](https://forums.oculusvr.com/community/discussion/79863/quest-go-gear-vr-build-8-0-release-notes/p1)
	- [Quest / Go / Gear VR Build 9.0 Release Notes](https://forums.oculusvr.com/community/discussion/80983/quest-go-gear-vr-build-9-0-release-notes/p1)
	- [Quest / Go / Gear VR Build 10.0 Release Notes](https://forums.oculusvr.com/community/discussion/81417/quest-go-gear-vr-build-10-0-release-notes/p1)
	- [Quest / Go / Gear VR Build 11.0 Release Notes](https://forums.oculusvr.com/community/discussion/82136/quest-go-gear-vr-build-11-0-release-notes/p1)
	- [Quest / Go / Gear VR Build 12.0 Release Notes](https://forums.oculusvr.com/community/discussion/83257/quest-go-gear-vr-build-12-0-release-notes/p1)
	- [Quest / Go Build 13.0 Release Notes](https://forums.oculusvr.com/community/discussion/86022/quest-go-build-13-0-release-notes/p1)
	- [Quest / Go Build 14.0 Release Notes](https://forums.oculusvr.com/community/discussion/86842/quest-go-build-14-0-release-notes/p1)
	- [Quest / Go Build 15.0 Release Notes](https://forums.oculusvr.com/community/discussion/87642/quest-go-build-15-0-release-notes/p1)
	- [Quest / Go Build 16.0 Release Notes](https://forums.oculusvr.com/community/discussion/88388/quest-go-build-16-0-release-notes/p1)
	- [Quest / Go Build 17.0 Release Notes](https://forums.oculusvr.com/community/discussion/89544/quest-go-build-17-0-release-notes/p1)
	- [Quest / Go Build 18.0 Release Notes](https://forums.oculusvr.com/community/discussion/90877/quest-go-build-18-0-release-notes/p1)
	- [Quest Build 19.0 Release Notes](https://forums.oculusvr.com/community/discussion/91506/quest-build-19-0-release-notes/p1)
	- [Quest Build 20.0 Release Notes](https://forums.oculusvr.com/community/discussion/92298/quest-build-20-0-release-notes/p1)
	- [Quest 2 / Quest Build 23.0 Release Notes](https://forums.oculusvr.com/community/discussion/95181/quest-2-quest-build-23-0-release-notes/p1)
	- [Quest 2 / Quest Build 25.0 Release Notes](https://forums.oculusvr.com/t5/Oculus-Quest-2-and-Quest/Quest-2-Quest-Build-25-0-Release-Notes/td-p/1)
	- [Quest 2 / Quest Build 26.0 Release Notes](https://forums.oculusvr.com/t5/Oculus-Quest-2-and-Quest/Quest-2-Quest-Build-26-0-Release-Notes/td-p/851585)
	- [Quest 2 / Quest Build 27.0 Release Notes](https://forums.oculusvr.com/t5/Oculus-Quest-2-and-Quest/Quest-2-Quest-Build-27-0-Release-Notes/td-p/857149)
	- [Oculus QuestとRift Sの次期アプデ内容が公開、トラッキング改善やディスプレイのトラブル解消へ](https://www.moguravr.com/oculus-quest-rift-s-next-update/)
	- [Oculus Quest Is Getting Go Emulation ‘Later This Year’](https://uploadvr.com/oculus-quest-go-emulation/)
	- [Oculus Questに“Oculus Goのアプリが使える”モードが実装予定](https://www.moguravr.com/oculus-quest-21/)
	- [Gear VR Update: Gear VR App Development no Longer Supported From Oculus SDK Suite 1.42 and Future Versions](https://developer.oculus.com/blog/gear-vr-app-development-no-longer-supported-from-sdk-suite-142-and-future-versions/)
- 対策方法
	- [Oculus Unity Getting Started Guide](https://developer.oculus.com/documentation/quest/latest/concepts/book-unity-gsg/#oculus-integration-for-unity)
	- [Fix for sideloaded/homebrew apps and games with the new firmware update](https://www.reddit.com/r/OculusQuest/comments/chjpu5/fix_for_sideloadedhomebrew_apps_and_games_with/)
	- [Oculus Questで「アップデート中」が出た場合の対処法](https://qiita.com/y-michishita/items/540a2703c288c674c0f2)
- AndroidManifest.xmlの設定とOvrAvatarのテスト用Id
	- [Android Manifest Settings (Quest)](https://developer.oculus.com/documentation/quest/latest/concepts/mobile-native-manifest/)
	- [Testing Your Integration](https://developer.oculus.com/documentation/avatarsdk/latest/concepts/avatars-gsg-unity-mobile/#testing-your-integration)
	- [PSA: v16 of the firmware brings back new menu, BUT doesn't list most unknown sources apps anymore](https://www.reddit.com/r/OculusQuest/comments/g2n2ro/psa_v16_of_the_firmware_brings_back_new_menu_but/)
- UE4の対策および設定
	- [Oculus Quest: Quick Start](https://developer.oculus.com/documentation/quest/latest/concepts/unreal-quick-start-guide-quest/#developing-applications-with-the-ue4-editor)

	- https://forums.oculusvr.com/developer/discussion/comment/699790/#Comment_699790
	- https://forums.oculusvr.com/community/discussion/comment/698454/#Comment_698454
	- https://answers.unrealengine.com/questions/912347/view.html
	- https://www.reddit.com/r/OculusQuest/comments/chjpu5/fix_for_sideloadedhomebrew_apps_and_games_with/eved24q/
	- [[UE4] AndroidManifest.xmlをカスタマイズする](http://historia.co.jp/archives/5892/)
	- [UE4によるOculus Quest ハンドトラッキング 自前対応への道](https://qiita.com/ruyo/items/08ac751ba61cb1201e96)