Oculus Questで動くアプリをUnreal Engineで作ってみる(1)


# 背景
- 今更ながらOculus Questを最近買ってハマったのでUnreal Engineでアプリを作ろうと考えた。
- きっと他に沢山Tipsがあるだろうけれど、自己満足でTipsを書いておく。
- 今回はただのサンプル動かすだけ。

# 参考にした動画
- 大筋この動画の通り。こんなにキレイに行かないけど。
    - https://youtu.be/jlcj4HB9LX8

<iframe width="560" height="315" src="https://www.youtube.com/embed/jlcj4HB9LX8" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# 団体を作る
- アプリを配信するための団体を作る
    - https://dashboard.oculus.com/organizations/create/


# スマホ経由で開発モードオン
- 近くのヘッドセットにアプリでつなぎ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/a6d07026-dc49-3a0d-9c76-678bc68cd51d.png)


- 開発者モードをオン

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/633590a9-27c5-e17a-221a-a24523e1a046.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/2285e0db-977e-6108-2427-6a6b47a664f8.png)

- occulusを再起動すると、設定画面に開発者オプションがでているので、確認したかったら確認。

![com.oculus.vrshell-20200229-155515.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/13a38776-abfe-d74d-8cc3-d67b38e438e0.jpeg)


# ADBをインストール
- Occulus向けのADBをダウンロード
    - https://developer.oculus.com/downloads/package/oculus-adb-drivers/
    
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/485f0969-193d-45c5-b547-d645440f8141.png)


- ダウンロードしたものを解凍すると下記のような中身

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/6ae54d18-2a9c-710b-3bc1-cae5ab39f35d.png)

- android_winusb.infを右クリック→インストール

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/69fc38f8-aad1-8cf0-d2e6-65cfa25cf341.png)

- 完了後、下記ポップアップが出る

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/b1b59abe-c155-263a-b073-a491f53b796b.png)

# NVIDIA CodeWorksをインストール

- 次にNVIDIA CodeWorksが必要。これをいれるとAndroidの開発するのが楽らしい。下図ページでダウンロード。
    - NVIDIA Developerのアカウントは作る必要あり。
    - 今回は1R8 For Windows 64bitをダウンロード。
    - https://developer.nvidia.com/codeworks-android
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/b99f5f46-db69-5b7d-47bc-327219f8d896.png)

- ダウンロードしたファイルを開いてインストール開始。
    - Nextで次々と進む。自分はインストールパスはデフォルト、usageデータは送らない設定に。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/ee3863d9-6e8f-0048-d2bf-d88156b9dca8.png)

- Components Managerが開かれる。ここもStandard設定のままNext。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/3664d594-7387-5ae3-f7b1-355403731bf6.png)

- Accept Allをチェック入れて、Acceptボタン押下。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/b985ee46-9408-b9f9-64cf-d747279192d4.png)

- インストールが始まるので、終わるまで待機。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/be70d00a-3d92-0e04-df70-1c4fd7bbbb3c.png)

- 完了したら下図の画面。Next。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/fda2162c-8d94-963a-c76c-f7522344a410.png)

- 次の画面。Finish。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/1dc82c57-75fb-1f84-d0d6-8ea0ba27d05b.png)


- 再起動するか聞かれるので、「はい」で再起動。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/18b556ca-cc60-88c0-83d1-a74de5a2badc.png)


# Oculus QuestをPCに接続してadb devicesで確認
- Oculus QuestをPCにUSB3.0ケーブルでつなぐ。
- Oculusのヘッドセットを装着すると、Oculus内で「USBデバッグを許可しますか？」と表示が出ているので、許可ボタンを押す。
- コマンドプロンプトを開き、「adb devices」を実行。下図のようにIDの文字列が入ったdeivceが出力されれば成功。
    - Occulus内でアクセス許可をしなかった場合、Unauthorizedと表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/1b0b0b51-492f-73dd-6e1e-a802eb9c4140.png)

# UnrealEngineでプロジェクト作成

- ここまでこればUnreal Engineでアプリ作るところに矢ッと入ることができる。
    - バージョンはUnreal Engine 4.24.2を使いました。
- Unreal Engineを開き、ゲーム＞バーチャルリアリティ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/b274e075-6521-e4c4-8156-510b8b045aad.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/6abaed07-a98a-0ecf-748e-4750ee8b2f55.png)

- プロジェクト設定では、
    - プラットフォームは、「モバイル/タブレット」
    - パフォーマンス特性は「スケーラブルな3D・2D」
    - スターターコンテンツなし。
    - ブループリント。
    - レイトレーシング無効。
- プロジェクト名は、VRAppTest01。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/b00ead9f-fe85-4100-6d96-047fa5866891.png)

- 起動すると下図。
    - 自分の場合はロードにすごく時間がかかった。あと画面が出た後も右下に「シェーダーをコンパイル中」というのが出ていて結構時間がかかった感じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/605166a9-1cbd-ac61-69e1-d170206e4106.png)

## プラグイン確認

- まずはきちんとOculus VRのプラグインがあるか確認。
    - 編集 > プラグインでプラグイン画面を開いた後、Virtual Realityの項目の中にOculus VRがあればＯＫ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/4e239739-d5b6-bed2-d903-6766c47a44c8.png)

## コンテンツ編集

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/eabe4a7f-936d-1440-8c25-8e0977882bd6.png)

- 次にコンテンツブラウザのVirtualRealityBP＞Mapsに入り、Motion Controller Mapを開く。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/a46af9dd-9571-7884-0973-aa4cdb09c4ff.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/860f610f-84e6-8ee8-353d-05bfea64097b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/d573d4c6-572d-352a-80c5-a7b0e8164de7.png)

- 下図のように画面が切り替わる。3DCGの表示がMotion ControllerMapになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/fbcea797-f4fb-ca61-5bca-a3f79a447170.png)

- ここで、Motion Controller Map以外の下図選択はすべて削除しておく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/6f299239-64cd-e323-8e66-909d2d18066b.png)

# プロジェクト設定

- プロジェクト設定を開き、プロジェクト＞マップ＆モードを開く。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/7ec8e6fb-6d5b-63b1-a4c9-6179b0b66b1d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/6f8cfee8-b5e4-90cf-ca6d-f5bb12082617.png)

- エディタのスタートアップマップをMotionControllerMapに設定。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/2c887608-9bf0-08db-36a4-4ee2a2ef7294.png)

- エンジン＞インプットを開く。
    - モバイルのデフォルトのタッチインターフェースがNoneになっていることを確認。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/4c35361e-b267-10a3-25c8-d60b426f38fc.png)

- エンジン＞レンダリングを開く。
    - モバイルHDRがオフになっていることを確認。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/96e9ba8f-9f54-e101-c2df-0721fc2d14aa.png)

- プラットフォーム＞Androidを開く。
    - 「プロジェクトはAndroidプラットフォームに対応していません」と赤いエラーが出ているので、「今すぐ設定」を押す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/1029cc09-ec20-bd6b-4f15-153183359f3b.png)

- よくわからないが「今すぐ設定」を押すと設定が住んで緑の「プラットフォームファイルは書き込み可能です」に代わる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/e0846564-d73b-aaee-ef38-6a9c4b7ca9eb.png)

- 最低のＳＤＫバージョン、ターゲットのＳＤＫバージョンはともに２５に設定。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/4d611fe0-27a6-a9cd-fd13-03ff7805daff.png)

- 「KitKatおよび上記のデバイスで全画面の没入モードを有効化」にチェックをいれる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/aeac96f8-144b-c27e-77b9-87d65110ab13.png)

- スクロールダウンしていき、Advanced APK Packaging内の「配布APKからOculus署名ファイルを削除」にチェック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/a192404c-0947-8e49-c39c-81c54aace9cd.png)

- プロジェクト設定を閉じる。


## 起動設定

- 「起動」ボタンの横の▼を押して、「対応プラットフォーム」を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/c0efd4d5-539d-491d-fe15-a1fa512833ec.png)

- 「Android」にチェックをいれて、プロジェクト設定画面を閉じる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/1aa193ca-6695-284b-3e5e-03f656a43c48.png)

## 起動・・・失敗したので対策
- Oculus QuestがＰＣに接続されていることを確認したうえで、起動＞Questを選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/002d6c2e-c65d-3b1d-1739-9c9da83a3ee7.png)

- ちょっとここでハプニング。ここで「SDKライセンスが承認されていない」とメッセージが出てきた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/addf6ea9-d741-6756-c726-7568633a58eb.png)

- プロジェクト設定>Androidを開いてみると、「Accept SDK License」というボタンがあったので、クリックし、LicenseにAgreeした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/4b5de3c5-1104-7c15-bd99-ce95bd9710b7.png)

- 再度、起動>Questを選択。
    - 右下に起動中・・・という文字が出てしばらくウィンドウが固まる・・・。
    - 次にAndroid_ASTCのアセットを処理中・・・とでる。
    - またシェーダーをコンパイル中・・・と出る。
    - 品質低下させますか？的な表示が出たけど無視したら消えて・・・
    - デプロイ中・・・
    - まだかなぁ・・・？

- と思ったら起動失敗！と出てきた。エラー内容を見ると、NDKのバージョンがだめらしい。r18cを使ってるが、r14bかr18bを使えとのこと。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/fb342f9d-c65f-b77f-0c94-3ff53aecc5b3.png)

- しかしながら、自分はr18bを入れているハズ・・・と思ったら、下記forumで指摘されている通り、最新Unreal Engineのバグで、r18bをr18cと認識してしまうらしい。まじかい。どうやら対応方法としては、r14bを入れるのがよさげ。
    - https://forums.unrealengine.com/development-discussion/android-development/1678244-android-toolchain-error
- 下記リンクからr14bをダウンロードして解凍。
    - https://dl.google.com/android/repository/android-ndk-r14b-windows-x86_64.zip
- プロジェクト設定を開き、プラットフォーム＞Android SDKのSDKConfig中にあるLocation of Android NDKに、回答したフォルダへのパスを指定。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/00a69e3c-7bba-9f9b-3f19-f34443a0dfb7.png)

## 今度こそ起動！・・・と思ったがまたエラー

- 再度、起動>Questを選択。
- すると次のエラー発生。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/1b3dd91a-d85a-677a-29c5-cc925d305fd6.png)

- エラーの内容はなんだか根が深いらしく、「色々試したけど全然解決策がねぇよ！」と英語でキレてる人たちが多かったので、いったん「フォルダパスに日本語が含まれてるのが悪いのでは？(ユーザー名が日本語だった)」と思い、いったんC:\UE4_projectというフォルダを作り、そのなかにプロジェクトを作り直したところ、解決できた。

## 起動したが周りが真っ黒

- これでやっと起動！したのだが、なんとOculus内は暗黒の世界。なぜ・・・。
- 公式ドキュメントを見直してみると、若干下記の設定が足りなかったので追加。


### プロジェクト設定の修正

- プロジェクト設定>プラットフォーム>AndroidのなかのAdvanced APK Packagingのなかにある、「Oculusモバイルデバイス向けのパッケージ」というところで、＋ボタンをおして、Oculus Questを指定。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/aff5f22b-0690-e25a-70c2-eebd0b7e8918.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/902889e6-1c16-934a-1208-05fcca2dbb29.png)


## 起動・・・できた！！
- 再度起動試みたところ、ちゃんと起動できました！
![com.YourCompany.VRAppTest002-20200229-223223.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/44bf1677-afdc-97c2-2996-a1083755cf5c.jpeg)


- ちゃんとVR内でモノを掴んだりもできました。

![com.YourCompany.VRAppTest002-20200229-223155.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/71c21e20-df90-68ad-af46-a929e6e3f255.jpeg)


- 作ったアプリはライブラリ内の提供不明元アプリから再度いつでも起動可能になってます。

![com.oculus.vrshell-20200229-223119.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206243/ff7455e8-236d-396c-b460-12b9109761ab.jpeg)

# まとめ

- なんとかUE4で作ったもの(サンプルですが)を動かせるところまでいきました。
- ちょいちょいつまづきましたが、誰か同じところで躓いた方のヒントになれば幸いです。