» VR開発メモトップへ

Unity + WebXR開発メモ(Meta Quest、Chrome対応)

最終更新日:2023年11月28日

Unityでブラウザで動作するVRアプリを開発する方法についてまとめています。

更新履歴

(2023年11月28日)Unityのロードマップの変更を反映
(2023年11月13日)GitHub最新版でXR Interaction Toolkitが動作するようになったのをとりあえず反映
(2023年2月23日)XR Plugin Management 4.3.1とUnity 2022.2について注記
(2022年12月12日)Unity 2022.1.24で動作確認、一部記述修正
(2022年7月24日)ホームボタンとメニューボタンについて追記


ブラウザのVR/AR対応について

WebXR Device APIをはじめとした一連のAPIがあり、ブラウザでVR/ARアプリケーションを動かすことができます。いわゆるWebXR全体の概況をつかむにはいっこうさんの記事がおすすめです。

Meta Quest

Meta Questの標準ブラウザ(Meta Quest Browser)はWebXRに対応しています。WebXR対応ページに設置されているボタンを押すとVRモードに入り、コントローラーのOculusボタンを押すとVRモードを抜けるようになっています。

Meta Quest BrowserはChromiumベースで、下記ページにアップデート情報があります。

Chrome(Windows)

WindowsのChromeおよびFirefoxは現在標準でWebXRに対応しています。別途OculusソフトウェアやSteam VRのインストールが必要です。ChromeとFirefoxはKhronosのOpenXR規格を利用しており、ページに設置されているVRモードのボタンを押すと、現在アクティブになっているOpenXRランタイムを使用してVRモードに入ります。ヘッドセットをはずすとVRモードを抜けます。OculusソフトウェアやSteam VRの設定で、使用するOpenXRランタイムを選択します(下記画像を参照)。

PICO 4

PICO 4に標準でインストールされているブラウザ(Picoブラウザ)はChromiumベースで、WebXR Device APIに対応しており、Quest同様VRモードに入れます。

UnityでWebXRアプリを作るには

De-Panther氏のWebXR Exportを使用すると、UnityのWebGLビルドを使用してブラウザで動作するVRアプリケーションを開発できます。

なお、Unity公式によるWebXRサポートは、ロードマップのPlatform > WebでUnder Consideration(検討中)になっています(2023年11月現在)。現在WebGLビルドのモバイル対応を優先している雰囲気で、だいぶ先になりそうです。

パフォーマンスは大丈夫?

ブラウザでVRアプリを動かす場合に気になるのは実用的に動くかどうかでしょう。

特にQuestにおいて、WebXR Exportを使用して出力したWebXRアプリは、以前(2020年4月頃)はフレームレートがとても低かったり、起動に数十秒かかったりと厳しかったのですが、2022年1月現在、簡単なコンテンツであれば起動後いくらか待つと90fps出るようになったり(想像ですが、V8のLiftoffとTurboFanの2段構えのコンパイラの挙動でしょうか)、起動時間も最短で数秒から済むようになったりと大幅に状況が改善しています。

今のところカメラを2つ使用してレンダリングしておりMultiviewレンダリングをしていないため、VRモードでは描画に倍のCPUコストがかかります。特にQuestではCPUが弱いためCPUバウンドになりがちなので、注意する必要があります。

あくまでウェブページなので、大容量のアセットのコンテンツはページ表示の待ち時間やサーバー料金で厳しいです。特にテクスチャは最小限に留めてインポート設定に注意し、場合によってはAssetBundleを利用する必要がありそうです。

また、アセットの多いコンテンツを再生すると(特にQuestで)メモリオーバーフローのエラーが出るので注意が必要です。

WebXR Exportを使用する

WebXR Exportの導入方法はこちらにあります。以下、サンプルシーンをビルドする手順のメモです。Unity 2022.2.17と2023.1.20で動作することを確認しています。

  • 新規プロジェクトを作成し、プラットフォームをWebGLにする
  • Project Settings > Package Managerを開いて、Scoped Registriesに以下を追加
  • Window > Package ManagerでMy Registriesに変更するとWebXR Export、WebXR Interactionsが出てくるのでインストール
  • WebXR InteractionsパッケージのSamplesからSample Sceneをインポート
  • Desertシーンを開く(Assets/Samples/WebXR Interactions/[version]-preview/Sample Scene/Scenes/Desertにあります)
  • Project Settings > XR Plug-in ManagementのWebGLタブでWebXR Exportにチェックを入れる
  • Window > WebXR > Copy WebGLTemplates を実行
  • Player Settings > Publishing SettingsのDecompression Fallbackをオンにしておく(サーバーがBrotli圧縮に対応していない場合に備えて)
  • Player Settings > Resolution and PresentationのWebGL TemplateでWebXR2020またはWebXRFullView2020あたりを選択してBuild and Run(WebXR、WebXRFullViewだと動きません)

表示されたページをChromeで開いて右下のVRボタンを押せばオーケーです。

Meta Questでもローカルで試したい場合は、Unity内蔵のローカルHTTPサーバーでは動かないので、別途ローカルHTTPSサーバーを立ち上げる必要があります。Browsersyncをインストールして browser-sync start --server --https --no-open --port=1000 とかするのが簡単でしょう。Meta Questブラウザを開いて、アドレスバーに「https://192.168.*.*:1000/」とhttpsから全部入力すると開きます。

下記スライドも参照してください(古いので注意点くらいしか参考にならないかも……そのうちページのほうに移植します)。

コントローラーのグラフィックスを表示するには

さらにWebXR Input Profiles Loaderをインストールすると、WebXR Input Profilesを使用して、接続されているヘッドセットに応じてコントローラーのグラフィックスが変化します。なお、ビルド後のサイズが3MBほど大きくなります。

以下の容量でインストールできます。

  • Project Settings > Package ManagerのOpenUPMのScope(s)にcom.attenederを追加する
  • Package ManagerのMy RegistriesからWebXR Input Profiles Loaderパッケージをインストールする
  • Project Settings > Graphicsの下のほうにあるPreload Shadersに、ProjectウィンドウのPackages/WebXR Input Profiles Loader/Runtime/ShaderVariantsに入っているGLTFShaderVariantsを登録する

WebXRCameraSetについて

WebXR ExportのカメラリグはWebXRCameraSetプレハブを使用します。WebXRCameraSet/Camerasが通常時・VRモード・ARモードのカメラを子に持っており、WebXRCamera.csがモードによってカメラを切り替えています。

なお、カメラの子にゲームオブジェクトをアタッチしたい場合は、CameraMainではなくCameraFollowerの子にする必要があります(CameraMainだとビルドしたときに動かなくなります)。

トラッキング基準位置を変更するには

Project Settings > XR Plug-in Management > WebXR > VR Required Reference SpaceをLocalにするとWebXRCameraSetプレハブの位置が頭の位置に、Local_floorにすると床の位置になります。

コントローラーの入力を取得するには

WebXRCameraSetプレハブのhandL、handRオブジェクトにアタッチされているWebXRController.csのGetAxis2DやGetButtonメソッドでコントローラーの状態を取得できます。例えば、

using WebXR;
...
[SerializeField] WebXRController leftHandWebXRController;
...
leftHandWebXRController.GetAxis2D(WebXRController.Axis2DTypes.Thumbstick);

でOculus Questのサムスティックの入力値が取得できます。

なお、ホームボタンとメニューボタンはWebXR Gamepads Moduleの仕様でNot exposedとなっておりアクセスできないようです。

XR Interaction Toolkitは使える?

2023年11月最新のバージョンでXR Interaction Toolkitが動作するようになりました。WebXR Interactions 0.19.0-previewとあわせて、XR Interaction ToolkitとXR Handsをインストールする必要があります。その他、それぞれのパッケージのサンプルのインストールが求められます。

サンプルシーンとして、Assets/Samples/WebXR Interactions/0.19.0-preview/XR Interaction Toolkit SampleにWebXRInteractionToolkitシーンが入っていますのでこれをビルドしてみてください。

エディタでVRモードで再生するには

WebXRCameraSetはOculus XR Pluginでも動作しますので、エディタからQuest Linkで再生できます。Project Settings > XR Plugin ManagementでStandaloneタブのOculusのチェックを入れて、プラットフォームをWindowsに変更して再生してみてください。

また、そのままビルドしてQuest Linkで動作する実行ファイルを作ることも可能です。

ビルドサイズを小さくするには

Unityのビルドサイズを小さくするには」にWebGLビルドを省サイズ化する方法についてまとめてみました。

Meta Quest Browserでデベロッパーツールを使用するには

PCのChromeからリモートのデベロッパーツールを開くことができます。開発者モードにしたQuestをUSB接続している(adb devicesで表示される)状態で、PCのChromeで chrome://inspect/#devices を開いて少々待つとQuestが検索表示されますので、inspectをクリックしてください。

PCでQuestのブラウザのURLを入力するには

QuestのソフトウェアキーボードでURLを入力するのは大変です。

Questの開発支援ツールであるOculus Developer Hubをインストールすると、Device ManagerタブのDevice Actions > Oculus BrowserにURLを入力して簡単にページを開くことができます。

また、上記のChromeのデベロッパーツールでもURLを入力して開くことができます。

下記adbコマンドでも行けます。

$ adb shell am start -n "com.oculus.vrshell/.MainActivity" -d apk://com.oculus.browser -e uri https://framesynthesis.jp/
書いた人:こりん(@korinVR
» VR開発メモトップへ