この記事はHAL Advent Calendar 2018、19日目の記事です。
先日Oculus Goを買いました。ごろ寝アニメ鑑賞デバイスとして最高なのですが、折角なので開発もやっていきます。※本記事のUnityのバージョンは2018.2.xです
とりあえずビルドして実機で動かすまで
- Oculus Developer Dashboardから団体登録を行う (https://dashboard.oculus.com/)
- Oculusアプリから、Oculus Goを開発モードにする
- Build SettingsのPlatformをAndroidに設定する
- Android Supportを入れてなかったら入れる (【Unity】Android SDKやJDKを設定する項目が見つからない時の対処法 - テラシュールブログ)
- Texture Compressionを「ASTC」に設定する
- JDK8が入ってない場合インストールする
- JDKのパスをUnity Preferences->External ToolsからUnityに設定
- Android Studioが入ってない場合インストールする
- Player Settings下の設定
- XR Settingsにある「Virtual Reality Supported」にチェックを入れる
- 下の+ボタンから「Oculus」を追加する
- Package Nameを好きな名前に設定する
- Minimum API Levelを「API level 19」に設定する
- XR Settingsにある「Virtual Reality Supported」にチェックを入れる
- ビルドしたapkを、adbを使って転送する(Build and Runでもok)
- adb install apk_path
サンプルプロジェクトについて
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プレハブを配置すると、ゲーム内でコントローラーが出現します。
注意点として、LeftHandAnchorに配置したControllerには「L Tracked Remote」を設定する必要があります。(デフォルトではR Tracked Remote)
また、静的クラスである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をダウングレードすることで解決しました。