Oculus Go + Unity 開発メモ

この記事はHAL Advent Calendar 2018、19日目の記事です。

先日Oculus Goを買いました。ごろ寝アニメ鑑賞デバイスとして最高なのですが、折角なので開発もやっていきます。※本記事のUnityのバージョンは2018.2.xです

とりあえずビルドして実機で動かすまで

サンプルプロジェクトについて

VRのサンプルプロジェクトとしてUnity公式から出ている、VRSamplesがとても参考になります。取っ掛かりとして、VRSamplesをビルドしてOculus Goで試すのはオススメです。
assetstore.unity.com

Oculus Unity Integrationの導入

assetstore.unity.com
Oculus Goのコントローラーの入力を取ったり、Oculus Go特有のレンダリング周りの設定に必要なので入れます。

Oculus/VR/PrefabsにあるOVRCameraRigプレハブをシーンに配置すれば、OVRManagerの機能を扱えるようになります。既にシーン上で配置されているMainCameraは取り除いて下さい。

コントローラーを使う場合

OVRCameraRigの孫にある、LeftHandAnchorとRightHandAnchorの下にTrackedRemoteプレハブを配置すると、ゲーム内でコントローラーが出現します。

https://i.gyazo.com/09ee6aabadbb1bdf6344d6a4fd703239.gif

注意点として、LeftHandAnchorに配置したControllerには「L Tracked Remote」を設定する必要があります。(デフォルトではR Tracked Remote)

https://i.gyazo.com/b6089d1586b472493e9db5cea2629aea.png

また、静的クラスであるOVRInputにアクセスすることで、コントローラーの状態を取得できます。

OVRInput.GetDown(OVRInput.Button.PrimaryIndexTrigger); // トリガーの入力状態を取得

OVRInputの詳細については、ドキュメントにあります。
https://developer.oculus.com/documentation/unity/latest/concepts/unity-ovrinput/

Oculus Goのレンダリングについて

Oculus GoはFFR(Fixed Foveated Rendering)に対応しています。FFRを使用すると認知されにくいエッジ部分のレンダリング解像度を下げてくれるので、GPUバウンドに陥ってる場合は一つの最適化手段として役立ちそうです。

OVRManagerから設定することで使用できます。Off~Highまで4段階の設定が可能です。

OVRManager.tiledMultiResLevel = OVRManager.TiledMultiResLevel.{Off/LMSLow/LMSMedium/LMSHigh};

Advanced Rendering on the Oculus Go

また、OVRManagerから設定することで、72Hzで動作させることも可能です。

OVRManager.display.displayFrequency = 72.0f;

モバイルVRの最適化について

今までモバイルに向けて開発したことがなかったので、パフォーマンスについては気をつけたいところです。PCと同じノリで開発していては、死にます。

Oculus開発者のブログにて、モバイルVRをビルドする際注意したほうがいい設定項目について取り上げられています。
Tech Note: Unity Settings for Mobile VR | Oculus

上の記事でも言及されていますが、特にシングルパスステレオレンダリングは必ずOnにしておきたいです。シングルパスステレオレンダリングについては凹さんの解説が分かりやすいです。
tips.hecomi.com

他にもDeveloperGuideにて、モバイル開発において注意したほうが良い点について取り上げられています。
Android Development

入力のエミュレーション

Oculus Goでの開発において、一つ困った点が実機に転送しないと動作が確認出来ない点です。(スタンドアローン型なので仕方がない点ではありますが…)

コーディング→Build and Run→動作確認と毎回していては、開発のイテレーションが遅すぎます。ゲームで使う入力のインターフェイスを定義して、Editor上で実機の入力をエミュレーション出来るようにするのが良いと思います。

ただエミュレーションにも限界があるので、動作確認用のRiftを用意するってのも有りなのかなと…。

public interface IInputEventProvider
{
    IReadOnlyReactiveProperty<bool> ShotButton { get; }
    IReadOnlyReactiveProperty<Quaternion> LookRotation { get; }
}

入力イベントをインターフェイス化した例

実機上でのログを確認する

adb logcatで監視します。無用なログも多々流れるので、Unityタグでフィルタするといい感じです。

adb logcat -c
adb logcat -s Unity:*

あと、Unity2017からはログの接続先が選択出来るようになっているので、それでadbに繋ぎEditor上で確認することも可能です。
tsubakit1.hateblo.jp

個別に遭遇したトラブルについて

Unable to list target platforms. って言われてビルドがコケる

unity3d - not finding android sdk (Unity) - Stack Overflow

I fixed by android sdk tool version downgrade.
The steps.
1. Delete android sdk "tools" folder : [Your Android SDK root]/tools -> tools
2. Download SDK Tools: http://dl-ssl.google.com/android/repository/tools_r25.2.5-windows.zip
3. Extract that to Android SDK root
4. Build your project

SDK Toolsをダウングレードすることで解決しました。

まとめ

モバイルVRは、VR開発とAndroid開発を並行するようなところがあるので、それぞれが初めてだと導入が少し大変なところがありますね…。

2019年にはOculus Questも出て、更に熱くなっていくモバイルVRに期待です。