Unity+Oculus Quest 開発メモ

最終更新日:2019年07月28日

UnityでOculus Quest対応アプリを開発する方法やTipsをまとめています。

更新履歴

(2019年7月28日)Oculus Integraion 1.39 にあわせて更新、「両手のコントローラーが動くようにするには」「過去のバージョンの Oculus Integration を参照するには」「Unity のプロファイラを使用するには」を追加、tiledMultiResLevel を fixedFoveatedRenderingLevel に変更
(2019年6月9日)とりあえずページを作成


UnityでOculus Quest対応アプリを作るには

UnityのOculus Quest対応の概要について

Unityは標準でOculus Questに対応しています。Oculus QuestはAndroidベースですので、プラットフォームをAndroidにしてVRサポートを有効するとOculus Questで動作するアプリをビルドできます。

さらに、Oculus Quest や Oculusプラットフォーム固有の機能を使用する場合は、Asset StoreにあるOculus IntegrationをインポートしてMain CameraをOVRCameraRigプレハブに入れ替えます。基本的にはOculus Integrationを使用します。

Compatibility and Version Requirements のページでサポートしている Unityのバージョンを確認できます。

Oculus Questを開発者モードにする

Oculus Questで自作のアプリが動くようにするには、「開発者モード」にする必要があります。スマートフォンにインストールしたOculusアプリの右下の「設定」をタップし、接続されているOculus Questをタップで開いて「その他の設定」をタップすると「開発者モード」が出てきますのでオンにしてください。

PCにUSBケーブルで接続すると、Oculus Questの画面に「USBデバッグを許可しますか?」というダイアログが開きますので許可します。

Oculus Questアプリをビルドするには

Oculus QuestはAndroidベースですので、UnityのAndroidビルドを使用します。

Unity で新規プロジェクトを作成したら、以下の手順を行います。

  • Build SettingsでプラットフォームをAndroidに変更する
  • Build SettingsのTexture Compression(テクスチャの圧縮方式)をASTCに変更する
  • Player Settings… で Graphics APIs の Vulkan を削除する
  • Player Settings… で、Minimum API Levelを「Android 6.0 ‘Marshmallow’ (API level 23)」以上に変更する
  • Package Nameの「com.Company.ProductName」のCompanyとProductNameを適当な組織名とプロダクト名で書き換える
  • XR Settingsにある「Virtual Reality Supported」をチェックして、右下の+ボタンを押してOculusを追加する
  • Asset StoreにあるOculus Integrationをインポート(OVRPlugin 等をアップデートするダイヤログが出たら従う)

さらに下の「両手のコントローラーが動くようにするには」の項目も参照してください。

Projectビューの Oculus/VR/Scenes/Room シーンを開いて、Build Settingsを開き、プロジェクト初期状態のSample Sceneを削除してAdd Open Scenesで入れ替えてください。

Oculus Questを接続して、Build SettingsウィンドウでBuild and Runボタンを押し、適当な.apkファイルを指定してビルド・実機に転送します。初回ビルド時にCompiling shader variantsでOVR Avatar関連の多数のシェーダーのビルドが走りますが、2度目以降はキャッシュされます。成功するとアプリが起動し、コントローラーのサムスティックで移動や回転ができます。

実機に転送したアプリは、Oculus Questの ライブラリ>提供元不明のアプリ に格納され、いつでも実行できます。

両手のコントローラーが動くようにするには

2019/7/23 頃に行われた Oculus Quest のシステムアップデート(7.0.0)によって、コントローラーが片方しか動作しない現象が起きます。Oculus Quest での Oculus Go アプリの対応準備が行われたことによるものです。

以下の対処をすると動作します。

  • OVRCameraRig にアタッチされている OVR Manager の Target Devices の “Gear Vr Or Go” を “Quest” に変更する
  • 以下のメニュー操作で Asset/Plugins/Android/AndroidManifest.xml を作る
    • Oculus > Tools > Remove AndroidManifest.xml
    • Oculus > Tools > Create store-compatible AndroidManifest.xml

なお、Build And Run を実行したときに

DeploymentOperationFailedException: No activity in the manifest with action MAIN and category LAUNCHER. Try launching the application manually on the device.
UnityException: Could not find any valid targets to launch on for Android

というエラーが出る場合は、生成された AndroidManifest.xml の

<category android:name="android.intent.category.INFO"/>

のところに

<category android:name="android.intent.category.LAUNCHER"/>

を書き足すととりあえず上手くいくようです。

動かない場合は

UnityのPlayer SettingsのXR Settingsにある「Virtual Reality Supported」がオンになっているか、またVirtual Reality SDKsでOculusが有効になっているか確認してください。

エディタで簡単に開発するには

Oculus Integration は Rift や HTC Vive に対応しています。それら PC ヘッドセットがあると Editor で再生して実行できるため開発が楽になります。


開発Tips

過去のバージョンの Oculus Integration を参照するには

Oculus Integration のリリースノートのページと、ダウンロードのページは、バージョン番号のところがプルダウンメニューになっていて、過去のバージョンが参照できます。

位置トラッキングをリセットするには

コントローラーのトリガーを引くと位置トラッキングをリセットするサンプルスクリプトです(Oculus Quest では Oculus ボタンを長押しするとリセンターされるので Rift と比べて使う機会は少ないかもしれません)。OVRInput を使っているので、OVRCameraRig が必要です。

using UnityEngine;

public class Recenterer : MonoBehaviour
{
    void Update()
    {
        if (OVRInput.GetDown(OVRInput.Button.PrimaryIndexTrigger))
        {
            OVRManager.display.RecenterPose();
        }
    }
}

描画設定やアンチエイリアスについて

フォワードレンダリングにして、Quality Settings で Anti Aliasing を 2x か 4x の Multi Sampling に設定するのが基本になりそうです。ほか、

  • Single-Pass Stereo レンダリングにする
  • Dynamic Batching と Static Batching をオンにする(Graphics Jobs は使わないこと)

が基本設定として推奨されています。リニアカラーに対応しています。

ほかこちらのページがとても参考になります。

Fixed Foveated Renderingを使用するには

Fixed Foveated Renderingは、視野の中心部のみを高解像度で描画し、ピクセル描画負荷を減らす Oculus 固有の機能です。設定の変更方法です。

OVRManager.fixedFoveatedRenderingLevel = OVRManager.FixedFoveatedRenderingLevel.{High/HighTop/Low/Medium/Off};

(Oculus Integration 1.38.0 で tiledMultiResLevel から API が変更されています)

タイルレンダリングで視野の端の方のタイルの描画解像度を下げることによって、ピクセル描画負荷の重いアプリで描画が25%程度軽量化されるとのことです。シンプルなシェーダのアプリやGPUバウンドになっていないアプリでは恩恵を受けられないとのことです。詳細の解説がこちらにあります。

パフォーマンスについて

CPU・GPUの使用率を調べるには

Oculus Questを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 のようにしてフィルタすると便利です。

Unity のプロファイラを使用するには

Oculus Integration 1.39 から Unity のプロファイラで CPU・GPU 表示ができるようになっています。

Build Settings で Development Build をチェックした上で、ビルド・実行して、プロファイラを開き、プロファイラ上部の “Editor” と表示されているところを “Android” に変更してください。

OVR Metrics Tool

OVR Metrics Toolを使用するとパフォーマンスグラフを表示でき、「adb shell setprop」でパフォーマンスグラフの表示や描画設定を変えるとパフォーマンス・チューニングに便利とのことです(詳細は下記ページの下のほうを参照してください)。

運用 Tips

ビルド・転送したアプリをアンインストールするには

Oculus Quest の「提供元不明のアプリ」でリストされているパッケージ名を確認して、

adb uninstall [パッケージ名]

を実行してください。

Guardian の表示を切るには

Settings > See All > Developer > Guardian でガーディアンの表示を切ることができます。安全のため警告メッセージが表示されます。一度スリープすると元に戻ってしまうようなので、スリープ時間を最長の15分とかにして対処でしょうか……。

ヘッドセット内の映像を PC で表示するには

srccpy を使うのがおすすめです。


参考リンク

書いた人:こりん(@korinVR
VR開発メモトップ