Unity+Oculus Quest 開発メモ

最終更新日:2020年08月08日

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

更新履歴

(2020年8月8日)Unity 2019.4.7f1 の変更を反映、その他修正
(2020年8月3日)「Oculus Quest アプリをビルドするには」のつまずきそうなところを補足、「OVR Build APK and Run」の動作と効果について補記
(2020年8月2日)Oculus Profiler Panel の項目を削除(おそらく使用しないので……)
(2020年7月29日)「Oculus Quest アプリをビルドするには」を XR Plug-in Management ベースに書き換え、「コントローラーを振動させるには」を追加
(2020年7月29日)「指でつまむ動作を取得するには」を追加


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

Unity の Oculus Quest 対応の概要

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

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

必要な Unity のバージョンは Set Up Development Environment のページで確認できます。2020年7月現在は 2018.4 以降が必要で、2019.4 LTS で大丈夫だと思います。

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

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

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

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

Quest アプリをビルドする手順を示します。

Unity Hub から Unity をインストールする

Unity Hub から Unity をインストールします。Android ビルドができるように、モジュール追加のところで、Android Build Support と、Android Build Support のタブを開いたところにある Android SDK & NDK Tools、OpenJDK にすべてチェックを入れてください。

Unity でプロジェクトを作成する

Unity の新規プロジェクトを「3D」テンプレートまたは「Universal Render Pipeline」テンプレートで作成し、以下の手順を行います。

  • Build Settings を開いてプラットフォームを Android に、Texture Compression(テクスチャの圧縮方式)を ASTC に変更して Switch Platform する
  • Player Settings… で Player > Other Settings > Graphics APIs の Vulkan を削除する
  • 必要なら Colos Space も Linear に変えておく
  • その下のほうの Minimum API Level を「Android 6.0 ‘Marshmallow’ (API level 23)」に変更する

Oculus Integarion をインポートする

Asset Store にある Oculus Integration をプロジェクトにインポートします。

インポートが完了すると Oculus の新しいプラグインを認識しましたというダイヤログメッセージが出るので、「Yes」「Upgrade」「Restart」等をクリックしてください。

XR Plug-in Management を有効化する

以下の手順でUnity の XR サポートを有効にします。

  • Windows > Package を開いて、XR Plugin Management パッケージをインストールする
  • Edit > Project Settings > XR Plug-in Management を開いて「Oculus」にチェックを入れる(これによって Oculus XR Plugin パッケージがインストールされる)
  • そのまま XR Plug-in Management のタブを PC, Mac and Linux Standalone settings に切り替えて、そちらでも「Oculus」にチェックを入れる(これでエディタで VR モードで再生できるようになります)
  • 再度 Window > Package を開き、Oculus XR Plugin パッケージの項目を左の矢印で開いて 1.4.0 に更新する(Oculus Integration 18.0 以降で必要になります。Unity 2019.4.7f1 以降ではデフォルトで 1.4.0 がインストールされます)

ビルド・実行する

試しに Project ビューの Oculus/VR/Scenes/Room シーンを開いてみてください。

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

ビルドしても動かないときは

Quest の画面が真っ暗のまま動かないときは、Unity の XR サポートがきちんと有効になっていないケースが多いです。

  • Window > Package Manager で XR Plugin Management パッケージと Oculus XR Plugin パッケージがインストールされているか、バージョンが新しいかを確認してください。
  • Edit > Project Settings… で XR Plug-in Management の Oculus と Initialize XR on Startup のチェックが入っているかを確認してください。

Build and Run したアプリを再度実行するには

実機に転送したアプリは、Oculus Quest の「ライブラリ(Library)」メニューの「提供元不明のアプリ(Unknown Sources)」に格納されていていつでも実行できます。

Unity のエディタで再生するには

Oculus Integration は PC ヘッドセットにも対応しています。Quest を Oculus Link で接続すると PC ヘッドセットとして認識され、Unity のエディタ上で再生できます。ビルドしなくても実行できるため開発が楽になります。

Rift や HTC Vive も使用できます。Rift だとバッテリーや接続の不安定さを気にしないでいいメリットが、Quest だとハンドトラッキングも使用できるメリットがあります。「Oculus Link でハンドトラッキングを使用するには」を参照してください。


プロジェクト設定について

グラフィックス設定

フォワードレンダリングにして、Quality Settings で Anti Aliasing を 2x か 4x の Multi Sampling に設定するのが基本になります。2x はとても軽量でかつ効果が大きいので必ずかけておいたほうがいいです。4x はさらに綺麗になりますが若干重めです。重いシェーダーを使用していると負荷増が顕著になります。

その他、

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

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

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

ビルド設定

Oculus Store にアプリを提出する場合は Scripting Backend を IL2CPP にして ARM64 でビルドする必要があります。が、IL2CPP はビルドが重すぎるので、開発中や、ストアにリリースするつもりのない制作物では Mono でいいかもしれません。

アプリの管理について

adb コマンドを使用すると(Android同様)コマンドラインからアプリのアンインストールその他の操作が可能です。

adb コマンドは下記ページからダウンロードできるほか、Unity のインストール時に同梱されるものを使用することもできます。Unity の Android Logcat パッケージをインストールしていれば、Android Logcat のウィンドウの右上の Open Terminal をクリックすると Platform-Tools のインストールフォルダが開きます。

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

下記adbコマンドを実行します。

$ adb uninstall [パッケージ名]

パッケージ名は、Questの「提供元不明のアプリ」で確認したり、下記コマンドで一覧表示することもできます。

インストールされているアプリの一覧を表示するには

$ adb shell cmd package list packages

apkファイルをインストールするには

$ adb install [パッケージ名]

adbコマンドでアプリを実行するには

下記コマンドでUnityでビルドした指定パッケージ名のアプリを実行できます。

$ adb shell am start -n [パッケージ名]/com.unity3d.player.UnityPlayerActivity

デバッグに使えるツール

Android Logcatパッケージ

UnityからAndroidのログ出力(adb logcatコマンド)を簡単に閲覧できるウィンドウです。Unityのパッケージマネージャーからインストールします(previewパッケージです)。Build and Runすると自動的にデバイスに接続してログが表示されます。キーワードでフィルタをかけたり、スクリーンショットを撮ることもできます。

OVR Scene Quick Preview

Oculus Integraionに含まれているツールで、Questでアプリを実行したままでシーンを更新できるツールです。簡単な実験シーンを更新して試したり、負荷を比較したりするのに使用できます。

使用方法は以下の通りです。

  • あらかじめBuild Settingsでシーンを登録しておく
  • Oculus > OVR Build > OVR Scene Quick Preview メニューでウィンドウを開く
  • 「Build and Deploy App」で転送用のアプリをビルド・起動する
  • 「Build and Deploy Scene(s)」を押すとQuestのシーンが更新される

モーションコントローラーについて

コントローラーを VR 空間に表示するには

OVRCameraRig の LeftControllerAnchor および RightControllerAnchor に OVRControllerPrefab をアタッチしてください。

コントローラーの操作で動く手を表示するには

OVRCameraRig の LeftControllerAnchor に CustomHandLeft を、RightControllerAnchor に CustomHandRight をアタッチすると、コントローラーの操作で動く手を表示できます。

Oculus/SampleFrameworks/Usage/CustomHandsシーンがサンプルシーンです。

コントローラーのトリガーやボタンの状態を取得するには

Unity+Oculus Touch開発メモをいったん参考にしてください(Quest 用に書き直す予定です)。

コントローラーを振動させるには

OVRInput.SetControllerVibration を使用します。周波数と振動の大きさをそれぞれ 0~1 で指定します。両方とも0に設定すると振動が止まります。振動をオンにすると振動を続け、2秒後に止まるようになっています。多くの場合は自分で明示的に0にして止める必要があります。

周波数については変えても体感でほとんど分からないのですが、1よりも0のほうが心持ち荒い振動のような感じがします。

右手トリガーを引いている間振動を続けるサンプルスクリプトです。適当な GameObject にアタッチしてください。

using UnityEngine;

public class ControllerVibrationTest : MonoBehaviour
{
    void Update()
    {
        // 右手トリガーを引いたら振動を開始
        if (OVRInput.GetDown(OVRInput.Button.PrimaryIndexTrigger, OVRInput.Controller.RTouch))
        {
            OVRInput.SetControllerVibration(0f, 1f, OVRInput.Controller.RTouch);
        }
        // 右手トリガーを離したら振動を停止
        if (OVRInput.GetUp(OVRInput.Button.PrimaryIndexTrigger, OVRInput.Controller.RTouch))
        {
            OVRInput.SetControllerVibration(0f, 0f, OVRInput.Controller.RTouch);
        }
    }
}

ハンドトラッキングについて

ハンドトラッキングを使用するには

まず Quest の「設定(Settings) > デバイス(Device) > ハンドトラッキングとコントローラー(Hands and Controllers)」の「ハンドトラッキング(Hand Tracking)」をオンにしてハンドトラッキングを有効にしてください。

Oculus/VR/HandTest シーンがハンドトラッキングの最小限のサンプルシーンなので、こちらを動かしてみるのが手っ取り早いです。シーンを開いたら OVR Manager の Hand Tracking Support を Controllers And Hands に変更してビルドしてみてください。

OVRCameraRig の LeftHandAnchor / RightHandAnchor に OVRHandPrefab と OVRControllerPrefab がアタッチされていて、現在の入力に応じて手またはコントローラーが適宜表示されるようになっています。

Oculus Link を使用して、Unity のエディタ上でハンドトラッキングを使用できます。ビルドしなくても動作をテストできるため、ハンドトラッキングを使用したアプリの開発が楽になります。

「設定(Settings) > デバイス(Device) > ハンドトラッキングとコントローラー(Hands and Controllers)」の「手またはコントローラーを自動で有効にする(Auto Enable Hands or Controllers)」をオンにした状態で Oculus Link を有効にしてください。このオプションがオフだと、ハンドトラッキングをオンにしていても Oculus Link を接続した時点でオフに戻ってしまうのでエディタで手が使用できないようです。

OVRHandPrefab の手のマテリアルを変更するには

OVRHandPrefab を使用している場合、Skinnded Mesh Renderer に BasicHandMaterialがアサインされているので、これを変更することで手のマテリアル・テクスチャを変更できます。

指でつまむ動作を取得するには

左右の OVRHandPrefab にアタッチされている OVRHand に対して GetFingerIsPinching(finger) を呼ぶと、それぞれの指先がほかのいずれかの指先とくっついているかどうかを true / false で取得できます。

finger の値
親指 OVRHand.HandFinger.Thumb
人差し指 OVRHand.HandFinger.Index
中指 OVRHand.HandFinger.Middle
薬指 OVRHand.HandFinger.Ring
小指 OVRHand.HandFinger.Pinky

たとえば、親指と人差し指でつまむ形をしているかどうかは下記で判定できます。

public class FingerPinchTest : MonoBehaviour
{
    [SerializeField]
    OVRHand ovrHand;

    void Update()
    {
        if (ovrHand.GetFingerIsPinching(OVRHand.HandFinger.Index) &&
            ovrHand.GetFingerIsPinching(OVRHand.HandFinger.Thumb))
        {
            Debug.Log("つまんでる!");
        }
    }
}

親指と人差し指、親指と中指あたりでつまむ動作は比較的正しく取得できますが、3本以上になるとだいぶ怪しくなります。また、指先と指先がくっついているかの判定であって、指が立っているかどうかを判定するわけではないことに注意してください(たとえばグー・チョキ・パーの認識には使用できない)。

また、指先同士の接触の度合いを GetFingerPinchStrength で取得できます。指先と指先が離れていると0で、近づけると接触する数cmほど前から数値が上がっていき、接触する直前で1になります。

現在ハンドトラッキングかどうかを調べるには

OVRInput.IsControllerConnected を使用すると、現在 Touch コントローラーを使用しているか、ハンドトラッキングを使用しているかを調べることができます。

using UnityEngine;

public class ControllerChecker : MonoBehaviour
{
    void Update()
    {
        var usingHand = OVRInput.IsControllerConnected(OVRInput.Controller.Hands);
        var usingTouch = OVRInput.IsControllerConnected(OVRInput.Controller.Touch);

        Debug.Log($"usingHand = {usingHand} / usingTouch = {usingTouch}");
    }
}

なお、OVRInput.Controller.Hands と OVRInput.Controller.Touch は切り替わりの瞬間に両方とも false になっている場合があります。

ビルドを速くするには

IL2CPPビルドをできるだけ避ける

上でも触れた通り、Oculus StoreでリリースするためにはIL2CPP/ARM64でビルドする必要がありますが、開発中はMono/ARMv7でビルドするようにするととても楽です。

Skip Unneeded Shaders

Unity のモバイルビルドではグラフィックス性能によって Tier 1 から Tier 3 までの描画設定が切り替わるようになっていますが(Project Settings > Graphicsを参照)、Quest では Tier 2 しか使用されません。Tier 2 で使用されるシェーダーのみをビルドする設定を有効にするとビルド時間が短くなります。

Oculus > Tools > Oculus Platform Tool でウィンドウを開くとProjectビューに Oculus/OculusProjectConfig が生成されますので、選択して Skip Unneeded Shaders をチェックしてください(Oculus Integration 17.0以降)。

シェーダーストリッピングの処理は OVRShaderBuildProcessor.cs で行われています。

OVR Build APK and Run

Oculus > OVR Build > OVR Build APK and Run でビルドすると、ビルドの最終段の “Building Gradle project” がキャッシュされ、ビルド時間が数割短縮されます。ショートカットキーが割り当てられており、Ctrl+K で実行できます。

このメニューは Unity のプラットフォームを Android にしないと表示されないので注意してください。また、Android Logcatを使用している場合は、実行開始時にフィルターが自動で設定されないため自分で設定する必要があります。

USB 3.0 ケーブルを使う

USB 3.0 ケーブルを使うとビルドした apk ファイルの Quest への転送時間が短くなります。下記エントリが参考になります。

パフォーマンス・チューニング

Oculus Questのパフォーマンス最適化に使用できるツールや基本的な考え方について、xRLT vol.03で使用したスライドをひとまず置いておきます。今のところ、ページの以降の記述よりもスライドのほうが内容が新しく、說明の流れになっていると思います(後日ページに反映予定)。

Questのハードウェアについて

ハードウェア詳細の解説がOculusのブログの下記エントリにあります。

QuestはSnapdragon 835を搭載しています。CPUは8コアで、4つが性能重視のPerformanceコア、4つが省電力重視のEfficiencyコアです。アプリの実行に割り当てられているのは3つのPerformanceコアで、残りの1つのPerformanceコアはタイムワープとシステムサービスに、4つのEfficiencyコアはトラッキングやその他のシステムソフトウェアに使用されているとのことです。

下記で紹介するツールの多くはCPUのコアごとの使用率を確認できないため注意が必要です(100%行ってないのになんで処理落ちするんだってなる)。

GPUはSnapdragon 835に統合されているAdreno 540ですが、多くのモバイルGPU同様タイルベースレンダリングであることに注意が必要です。Qualcommのサイトのドキュメント「Adreno Vulkan Developer Guide」にチューニングのTipsが載っています。

CPU・GPUレベルについて

Questでは負荷によってCPU・GPUレベルという形でクロック数が変動します。現在のレベルはOVR Metrics ToolやOculus Profilerで確認できます。クロック数によってCPU・GPUの使用率が変動するため、使用率を比較する場合はOculus Integrationの下記APIでレベルを固定する必要があります。

OVRManager.cpuLevel = 4;
OVRManager.gpuLevel = 4;

パフォーマンス・チューニングに使用できるツール

Oculus Questのパフォーマンス最適化に使用できる主なツールを列挙します。

OVR Metrics Tool

真っ先に使用するべきツールがこれになります。Quest にインストールして、CPU 使用率や GPU 使用率等のグラフ・数値をヘッドセット内でオーバーレイ表示できます。どんなシチュエーションで重くなるかを簡易的に確認できます。

下記ページからダウンロードできる .apk ファイルを adb install でインストールして Quest で起動し、「Enable Persistent Overlay」を有効にして、まずは真ん中にあるプリセットの「BASIC」ボタンあたりをクリックしてください。表示されなくなったときは電源ボタンで一度スリープして復帰してみてください。STATS タブで表示項目をひとつひとつオン・オフできます。

(version 1.5以降)STATSタブの下のほうで「CPU Utilization (Core 0-7)」を有効にするとコアごとの数値が確認できます。Core 0-3がPerformanceコア、4-7がEfficiencyコアのようです。

また、adb shell ovrgpuprofiler -e を実行するとGPUの細かい項目も有効にできるようになります。無効に戻すには -d オプションです。

ドキュメントは下記ページにあります。

Unity のプロファイラー

Quest 実機に対して、Unity のプロファイラーが使用できます。Build Settings で Development Build をチェックした上でビルド・実行して、プロファイラを開き、プロファイラ上部の “Playmode” と表示されているところを “AndroidPlayer” に変更してください。

CPU モジュールで Timeline を表示して、フレームごとの処理の詳細を追いかけるのがおすすめです。

なお GPU のモジュールを有効にしているとプロファイラーのクエリ待ちでフレームレートが低下しますので注意してください。

RenderDoc

Quest実機に対して使用できるオープンソースのフレームデバッガです。Oculusのブログに使い方が詳しいです。描画コールごとの処理時間を計測表示できますが、タイルベースレンダリングなので参考程度にとのことです。

Snapdragon Profiler

Qualcommの公式ツールです(Qualcommの開発者アカウント作成が必要)。Snapdragonの各種メトリクスを詳細表示できます。特に、SnapdragonのCPU各コアごとの使用率や、タイルベースレンダリングのタイル数等も見ることができます。

描画解像度について

VR ヘッドセットはディスプレイの解像度およびフレームレートが高く(Oculus Quest は片目 1440x1600/72Hz)、ピクセルの描画が GPU の大きな負荷になります。Standard Shader やユニティちゃんトゥーンシェーダー等、フラグメントシェーダーが重いマテリアルで視野の広範囲が覆われている場合、描画解像度を調整することで、見た目をあまり損なわずに GPU 負荷を下げられる場合があります。

視野全体の解像度の変更

下記APIで視野全体の描画解像度を変更できます。0.9や0.8等に試しに下げてみるのがおすすめです。

using UnityEngine.XR;
...
XRSettings.eyeTextureResolutionScale = 0.5f;

また、OVRCameraRig の OVRManager の Enable Adaptive Resolution をオンにすると、GPU 負荷に応じて描画解像度を自動的に変更することができます。Min Render Scale と Max Render Scale で最小値と最大値を設定します。

周辺視野の解像度の変更(Fixed Foveated Rendering)

目立たない周辺視野の描画解像度を下げることによって GPU 負荷を下げるVR特有の最適化機能です。ケースによりますが、GPU 使用率が10%から数十%下がります。

下記 API で使用できます。

// High、HighTop、Low、Medium、Off のいずれかで設定
OVRManager.fixedFoveatedRenderingLevel = OVRManager.FixedFoveatedRenderingLevel.High;

OVR Metrics Tools の STATS で Foveation Levelの項目をオンにすると現在のレベルを確認できます。シーンを開始して1フレーム待たないと設定が反映されない場合がありました。サンプルコードです。

using System.Collections;
using UnityEngine;

public class FoveatedRenderingTest : MonoBehaviour
{
    IEnumerator Start()
    {
        // 1フレーム待たないと設定できない場合がある。
        yield return null;
        OVRManager.fixedFoveatedRenderingLevel = OVRManager.FixedFoveatedRenderingLevel.Medium;
    }

    void Update()
    {
        if (OVRInput.GetDown(OVRInput.Button.One))
        {
            OVRManager.fixedFoveatedRenderingLevel = OVRManager.FixedFoveatedRenderingLevel.HighTop;
        }
        if (OVRInput.GetDown(OVRInput.Button.Two))
        {
            OVRManager.fixedFoveatedRenderingLevel = OVRManager.FixedFoveatedRenderingLevel.Off;
        }
    }
}

技術的には、タイルベースレンダリングのタイルごとに解像度を変えているようです。詳細の解説がこちらにあります。

Dynamic Fixed Foveated Rendering

(Oculus Integration 14.0 以降)描画負荷によって自動的に Foveated Rendering のレベルを変更できます。

OVRManager.useDynamicFixedFoveatedRendering = true;

で有効になり、fixedFoveatedRenderingLevel には最大のレベルを設定します。

XR Plug-in Managementの場合

(Oculus XR Plugin 1.4.0 以降)Unityの XR Plug-in Management の API でもレベルを設定できます。Dynamic Fixed Foveated Rendering にはまだ対応していないようです。

Unity.XR.Oculus.Utils.SetFoveationLevel(2); // 0-4。2はMiddle

リフレッシュレートについて

Quest のデフォルトのリフレッシュレートは 72Hz ですが、OVRManager.display.displayFrequency で60Hzに変更できます。が、Oculus のストア審査の項目 VRC.Quest.Performance.1 に「72fpsでグラフィックスを表示すること」とあるので、変更しないほうがいいでしょう。

現在のリフレッシュレートの数値は UnityEngine.XR.XRDevice.refreshRate で取得できます。ただし Awake や Start では0が返ってくる場合があり、1フレーム待つ必要があります。サンプルコードを示します。

using System.Collections;
using UnityEngine;
using UnityEngine.XR;

public class RefreshRateTest : MonoBehaviour
{
    IEnumerator Start()
    {
        // 1フレーム待たないと取得できない場合がある。
        yield return null;
        Debug.Log("XRDevice.refreshRate = " + XRDevice.refreshRate);
    }
}

展示ノウハウ

ガーディアンの表示を切るには

Quest の Settings > See All > Developer > Guardian でガーディアンの表示を切ることができます。安全のため警告メッセージが表示されます。一度スリープすると元に戻ってしまうので、イベント展示等ではスリープ時間を最長の15分にしておくといいでしょう。

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

scrcpy を使うのがおすすめです。なお、左右2画面の樽型表示になります。

困ったとき

Quest で起動すると画面が真っ暗のまま動かない

Android Logcat で「Unable to find OculusXRPlugin」という赤文字のエラーが出ている場合、Unity の Oculus XR Plugin パッケージを更新すると動くようになる場合があります。

Build and Run でビルド後に Quest で起動しない

Unity のコンソールに

DeploymentOperationFailedException: No activity in the manifest with action MAIN and category LAUNCHER. Try launching the application manually on the device.

というエラーがもし出ている場合は、Oculus > Tools > Remove AndroidManifest.xml で AndroidManifest.xml を削除してみてください。

その他のTips

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

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

QuestのIPアドレスを確認するには

$ adb shell ifconfig

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

コントローラーのトリガーを引くと位置トラッキングをリセットするサンプルスクリプトです。OVRInputを使っているので、OVRCameraRigが必要です。

using UnityEngine;

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

Oculus QuestではOculusボタンを長押しするとリセンターされるのでRiftと比べて使う機会は少ないかもしれません。

参考記事


参考リンク

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