UE4.14・AndroidでVRの実機プレイまでの解説

こちらは「裏 Unreal Engine 4 (UE4) Advent Calendar 2016」13日目の記事として紹介していきます。
<hr>
全く裏情報とは言えないかもしれませんが、
androidの実機プレイ・VR用に実機で動作確認する所を解説していきます。
せっかくなので4.14を使用してみました。
### UE4.14で対応しているモバイルVRのプラグインについて
<b>GEARVR</b>
GEARVR用のプラグインになります。
4.7.4以降のプロジェクトから利用可能みたいです。
UE4の初期に近い頃からあるプラグインでもあります。
[GearVRについてはこちら](http://www.samsung.com/jp/product/gearvr/#gear-vr)

<b>GoogleVR</b>
GoogleのVRデバイスなどを利用した、
VRアプリを作れるプラグインになります。
UE4でDaydreamの対応しましたので、
付属のモーションコントローラーの操作も対応できます。
[DayDreamの紹介](http://www.moguravr.com/daydream-google-vr-matome/)

<b>SimpleHMD</b>
VRに対応できるプラグイン。
簡単にVRを体験するだけならこちらがおすすめ。

<b>今回はGoogleVR（HMDのみ）とSimpleHMDの動作確認まで紹介します。</b>
### Androidの実機の準備とテスト
ue4はandroidsdkなどちゃんと用意されたものがあります。
ue4のバージョンは4.14になります。
まずはこちらからUE4用のADTをダウンロードします。
[CodeWorksダウンロード](https://developer.nvidia.com/gameworksdownload#?dn=codeworks-for-android-1r5)

パソコンに対応したOSでダウンロードしてください。
![8.png](https://qiita-image-store.s3.amazonaws.com/0/34911/8e0ded55-dc59-0b03-a93c-4843bc6a75c0.png)

ダウンロードしたら、
<b>Android 1R5</b>を選択してstandardでインストールします。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/34911/24b7fab7-e739-e825-34e4-a2d0917b9704.png)

<b>※注意点としては、VisualStudioがインストールされていないとNsightの所でインストールエラーが出ます。試すだけであれば不要なのでno actionでインストールしないようにしておくのがいいです。</b>

インストールが終了したら再起動して完了になります。
次にue4のプロジェクトを作成して動作確認をしていきます。
### プロジェクトの作成と動作確認
次に携帯端末用のプロジェクトを作成してテストします。
携帯用プロジェクトはモバイル対応で、スケーラブルな3D・2D表示にします。
スターターコンテンツは無しで大丈夫です。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/34911/3a4a0db7-0b1b-1b8a-d646-73edc9ce2d73.png)

androidの端末をUSB接続できるよう設定。
<b>※usbデバッグの設定は下記リンクよりご確認ください。</b>
[端末設定のやり方はこちら！](https://docs.unrealengine.com/latest/JPN/Platforms/Android/GettingStarted/2/index.html)

空のプロジェクトでテストする場合はそもそも初期のmap（最初に起動したときに動作する画面）が無いので作成して、プロジェクト設定で作成したmapが初期起動するように設定してください。

![7.png](https://qiita-image-store.s3.amazonaws.com/0/34911/6b35941e-46d0-b9b6-43b4-244a6c2e84e4.png)

後は起動オプションのところにドロイド君のマークがあり、それを選択すると実行が開始されます。
<b>※先にビルドしてシェ―ダをモバイル用にビルドしておくとスムーズに進められます。</b>

![5.png](https://qiita-image-store.s3.amazonaws.com/0/34911/7b98719d-bc9c-c61f-ad1c-c543681a9af3.png)

## SimpleHMDプラグインの設定
プロジェクトから<b>編集>plugins</b>を選択してプラグイン設定を開きます。

![9.png](https://qiita-image-store.s3.amazonaws.com/0/34911/2a627689-e63f-a5dc-dfb5-314693f2c83a.png)
開いたら、SimpleHMDのチェックボックスのEnableにチェックを入れます。

![10.png](https://qiita-image-store.s3.amazonaws.com/0/34911/64a7ab9a-f100-34b3-c4b8-217a7de492ec.png)
チェックを入れたら再起動して、起動オプションから実機デバッグが行え、VR仕様に書き出されます。

SimpleHMDだとこんな感じになりました。
他の人がやっていたのを見た限りだと全画面だったような・・・
![Screenshot_20161204-011147.png](https://qiita-image-store.s3.amazonaws.com/0/34911/a538b2f8-8eab-5279-d042-b65252159a9b.png)


## GoogleVRプラグインの設定
<b>※GoogleVRのHMDの設定になります。</b>

まずは、googleVRプラグインを利用できるようにします。
方法は先ほどSimpleHMDと同様の流れで行います。

![11.png](https://qiita-image-store.s3.amazonaws.com/0/34911/d1723095-3a89-52a1-9db8-82cf518ee062.png)

SimpleHMDの時とは違い、Android用のプロジェクト設定が必要になります。
<b>編集>プロズジェクト設定>レンダリング</b>を選択。
mobileHMDのチェックを外しておく。

![12.png](https://qiita-image-store.s3.amazonaws.com/0/34911/8b5f4b48-c735-dc15-8873-034630bb1040.png)

左メニューの下のほうにある<b>プラットフォーム</b>からAndroidのsdkターゲットとfullscreen用の設定をします。
最初は赤の帯になっていますが、右側のボタンを選択してファイルの書き込みを可能にしましょう。
![16.png](https://qiita-image-store.s3.amazonaws.com/0/34911/fdb6f18e-c714-8022-5fc6-8466cefb061e.png)


SDKのターゲットは21でロリポップ（Androidのバージョンは5.0）に設定しました。

![13.png](https://qiita-image-store.s3.amazonaws.com/0/34911/e6eac7d3-c772-c21c-e4b7-3b7c6383788d.png)

GooglePlayサービスの対応も忘れず設定しておきます。

![17.png](https://qiita-image-store.s3.amazonaws.com/0/34911/1680b54f-247d-7219-4e38-f27622b58170.png)

最後にAndroidSDKのSDKAPIレベルとNDKAPIのターゲットを同じ21に設定して完了になります。

![15.png](https://qiita-image-store.s3.amazonaws.com/0/34911/e1c180b2-b012-7a2b-8d64-6b7094b01f2b.png)

プロジェクト設定などは以上になります。
あとは動作確認で説明したようにUSBで端末を接続して動作確認が出来たら完了です。

ちょっとロールボールのサンプルで動かしてみました。
思ったよりきれい(´∀｀)
機種はXperiaZ4です。
![Screenshot_20161204-160453.png](https://qiita-image-store.s3.amazonaws.com/0/34911/e0646322-6257-6496-97a5-9cc9c6b1c45b.png)

## HMD用の変更とHMD用ブループリントについて
携帯のジョイスティック操作は基本使わないので、非表示にします。
編集>プロジェクト設定から左サイドのインプットを選択。
DefaultTouchInterfaceをなしにします。
![18.png](https://qiita-image-store.s3.amazonaws.com/0/34911/d61dbb49-8861-cd51-5694-ed5af3e00e37.png)

下記の表はHMD用のブループリントの簡易説明表です。モバイル用ではなくPC用ですので、OculusRiftやViveなどで何か作っている方は参考程度に見てみてください。（間違ってたらぜひ指摘していただけるとありがたいです・・・・）
[正式ドキュメントはこちら！](https://docs.unrealengine.com/latest/INT/BlueprintAPI/Input/HeadMountedDisplay/index.html)

| BlueprintのAction |どういったものなのか |
|:------------: | :------------: |
| Enable HMD |HMDでの表示の有効・無効| 
| Enable LowPersistence Mode |VR酔い対策となる低抵抗の有効化・無効化の設定(bool型で設定)|
| Get HMDDevice Name |HMDのデバイス名を取得 (Text型・何もないとUnknownを返す)|
|Get Num Of Tracking Sensors |複数の位置センサーがある場合、接続している総数を返す (int型)|
|Get Orientation and Position|現在の位置と角度を取得する。位置センサーから外れたりすると、すると位置を0で返す。(位置はVector、角度はRotation)|
|Get Screen Percentage|VR表示での画面全体の利用率を返します（float型）|
|Get Tracking Origin|位置センサーの原点を目線または床の高さから取得|
|Get Tracking Sensor Parameters|HMDが有効な場合、ゲーム世界での位置と、センサーが反応する境界位置などを返します。センサーの範囲から外れたりすると全ての値が0で返ってきます。|
|Get VR Focus State|VRのフォーカスの状態を取得（VRフォーカスを使っているのかと持っているのかをbool型で返す）|
|Get World to Meters Scale|VRで見ているオブジェクトのスケール感を取得（float型で返してくれます。標準は100です。）|
|Has Valid Tracking Position|位置トラッキングが有効な状態かを返す(bool型)|
|Is Head Mounted Display Enabled|HMDが有効な状態か返す（bool型）|
|Is in Low Persistence Mode|lowPersistenceを利用しているかどうかを返す（bool型）|
|Reset Orientation and Position|ヨーが正方向を向いているのと0の位置にいることと仮定してがロールとピッチの位置を0にリセットする(リセット後のヨーの角度とOptionで位置などもリセットするかどうかのenumを設定可能)|
|Set Clipping Planes|VRで表示する際の領域の開始地点（NCP）とどこまで表示するかの終了地点（FCP）を設定する。（どちらもfloat型で設定）※呼び出されて設定されても.iniファイルには保存されないので注意が必要です。|
|Set Tracking Origin|位置センサーの原点を目線または床の高さから設定する（目線または床のどちらかをenumで設定可能）|
|Set World to Meters Scale|VRで見ているオブジェクトのスケール感を設定（float型で設定します。）|

#### 最後に・・・
さらっとした説明で申し訳ないですが、以上になります。
それとVR関係で個人的に見ておくといいと思ったページをいくつか紹介します。
※他にもまだまだ沢山あるのでごく一部だけでもと思い、紹介しています。

[バーチャルリアリティの開発（公式・日本語）](https://docs.unrealengine.com/latest/JPN/Platforms/VR/index.html)
[仮想現実 （VR） のベスト プラクティス（公式・日本語）](https://docs.unrealengine.com/latest/JPN/Platforms/VR/ContentSetup/index.html)
[UE4のHMD関係のコンソールコマンドについて纏めました（おかずさん）](http://pafuhana1213.hatenablog.com/entry/2015/12/08/001421)