Unity+Oculus Go開発メモ
最終更新日:2018年05月13日
UnityでOculus Go対応アプリを開発する方法やTipsをまとめています。書きかけです。
更新履歴
(2018年5月12日)とりあえずページを作成。
UnityでOculus Go対応アプリを作るには
UnityのOculus Go対応の概要について
Unityは標準でOculus Goに対応しています。Oculus GoはAndroidベースですので、プラットフォームをAndroidにしてVRサポートを有効するとOculus Goで動作するアプリをビルドできます。
さらに、Oculus GoやOculusプラットフォーム固有の機能を使用したい場合や、Oculusストアにリリースできるアプリを作る場合はOculus VRのダウンロードページにあるOculus Utilities for UnityをプロジェクトにインポートしてMain CameraをOVRCameraRigプレハブに入れ替えます。
Unityは2017.4.1以降、Oculus Utilitiesは1.24.1以降でOculus Go対応となっています(2018/05/12現在)。
Oculus Goを開発者モードにする
Oculus Goで自作のアプリが動くようにするには、「開発者モード」にする必要があります。スマートフォンにインストールしたOculusアプリの右下の「設定」をタップし、接続されているOculus Goをタップで開いて「その他の設定」をタップすると「開発者モード」が出てきますのでオンにしてください。
PCにUSBケーブルで接続すると、Oculus Goの画面に「USBデバッグを許可しますか?」というダイアログが開きますので許可します。
Oculus Goアプリをビルドするには
Oculus GoはAndroidベースですので、UnityのAndroidビルドを使用します。
Unityで新規プロジェクトを作成したら、Build SettingsでプラットフォームをAndroidに変更して、Player Settings…のXR Settingsにある「Virtual Reality Supported」をチェックしてオンにしてください。また、Minimum API Levelを「Android 4.4 ‘KitKat’ (API level 19)」以上に変更し、Bundle Identifierの「com.Company.ProductName」のCompanyとProductNameを適当な組織名とプロダクト名で書き換えます。
また、Build Settingsでテクスチャの圧縮方式(Texture Compression)をASTCに変更します。
Oculus Goを接続して、アプリをBuild and Runでビルド・実機に転送します。
Unity公式からVR Samplesというサンプルプロジェクトが提供されていますので、とりあえずこれをビルドしてみるのがおすすめです。同じくUnity公式のVRのチュートリアルは非常に分かりやすい内容で必読です。
開発Tips
描画設定やアンチエイリアスについて
フォワードレンダリングにして、Quality SettingsでAnti Aliasingを2xか4xのMulti Samplingに設定するのが基本になりそうです。ほか、
- Single-Pass Stereoレンダリングにする
- Enable Adaptive Resolutionをオフにする
- Dynamic BatchingとStatic Batchingをオンにする(Graphics Jobsは使わないこと)
が基本設定として推奨されています。
(要調査:リニアカラースペースが使用できるか)
Fixed Foveated Renderingを使用するには
Fixed Foveated Renderingは、視野の中心部のみを高解像度で描画し、ピクセル描画負荷を減らすOculus Go固有の機能です。Oculus Utilitiesをインポートして下記コードで設定を変更します。
OVRManager.tiledMultiResLevel = OVRManager.TiledMultiResLevel.Off/LMSLow/LMSMedium/LMSHigh;
Qualcomm 821 SoCのタイルレンダリングで視野の端の方のタイルの描画解像度を下げることによって、ピクセル描画負荷の重いアプリで描画が25%程度軽量化されるとのことです。シンプルなシェーダのアプリやGPUバウンドになっていないアプリでは恩恵を受けられないとのことです。詳細の解説がこちらにあります。
72Hzモードについて
Oculus Utilitiesをインポートして下記コードでリフレッシュレートを72Hzに変更できます。
OVRManager.display.displayFrequency = 72f;
24フレーム/秒の動画を再生する場合などに整数倍となるため再生がなめらかになるメリットがあるようです。
パフォーマンスについて
CPU・GPUの使用率を調べるには
Oculus GoをUSB接続すると、adb logcatコマンドでGPU・CPU使用率が1秒ごとに以下のような形式で報告されます。
05-12 22:54:04.287 1356 16647 I UtilPoller: GPU Util 0.254183 / CPU Util 0.473684 (avg 0.276316)
grepが使用できる場合はadp logcat | grep UtilPoller等でフィルタすると便利です。
CPUとGPUのスロットリングについて
Oculus Utilitiesをインポートして、以下のAPIを使用するとCPUとGPUのパフォーマンスレベルを設定できます。
OVRManager.cpuLevel = 2;
OVRManager.gpuLevel = 2;
パフォーマンスレベルはCPU、GPUそれぞれ0から3(Oculus GoはGear VRより放熱が良いためレベル4が存在するとのこと。未調査)の値で設定し、0が最も低クロックでバッテリー消費・発熱が低く、3が最も高クロックでバッテリー消費・発熱が高くなります。デフォルト値はCPU、GPUともに2です
なお、Gear VRではこの値をマニュアルで設定しましたが、Oculus Goではこの値をベースラインとしてフレームレートが落ちないようにCPU・GPUの動的なスロットリングが行われるようです。
パフォーマンスチェック等でこの動的なスロットリングが邪魔な場合は
adb shell setprop debug.oculus.adaclocks.force 0
でオフにします。再起動するか、debug.oculus.adaclocks.force 1で元に戻ります。
詳細の解説が下記ページにあります。
OVR Metrics Tool
OVR Metrics Toolを使用するとパフォーマンスグラフを表示でき、「adb shell setprop」でパフォーマンスグラフの表示や描画設定を変えるとパフォーマンス・チューニングに便利とのことです(詳細は下記ページの下のほうを参照してください)。
Oculusストアでのアプリ配信について
Oculus Developer Dashboard for Gear VRでサブミット。Gear VRとOculus Goどちら(あるいは両方)に配信するかを選択、Oculus Goで使用できない機能を使っていた場合、Oculus Goには配信できない(アプリをアップロードするときに自動的に通知される)とのことです。その他参考ページ。
参考リンク
- Unity
- APIリファレンス - UnityEngine.XR
- マニュアル - VR 概要
- チュートリアル - VR
- VR Samples - Unityの公式サンプルプロジェクト
- Oculus VR
- Oculus VR公式フォーラム
- Unity公式フォーラム - AR/VR (XR) Discussion
- Oculusデベロッパー助け合い所(Facebookグループ)