本日はMetaQuestの学習枠です。
MetaHorizonの開発ドキュメントを読みながら実際に開発を行ってみました。
MetaHorizonの開発ドキュメント
MetaHorizonの開発ドキュメントを実際に手を動かしながら実行時のキャプチャをしていきます。
developers.meta.com
本記事は以下の「カメラレスリグprefabの使用」の記事を試します。
developers.meta.com
カメラレスリグprefabの使用
本セクションでは推奨リグを使用するメリットを詳述します。
包括的なインタラクションリグ
包括的なインタラクションリグは今までのリグを大幅に改善したもので、主に以下のような変更点があります。
モジュール性
このリグは主にデータソース -> インタラクション -> ビジュアルという3つのセクションに分れています。
各モジュールを交換しても他のモジュールには影響がありません。
インタラクションがデータソースやビジュアルに縛られないようにすることで別のプラットフォームでも再利用できるようになります。

小規模な階層構造
必要なGameObjectsの数を減らすためにインプットとビジュアルを再利用しています。
例えば、別々のインプットをするために左手のビジュアルを2つ使う必要はありません。
また手、コントローラー、ControllerHandsをサポートするためにインタラクター階層全体を複製する必要もありません。
不要なものを削除する
階層があまり結合しておらず、不要なインタラクターを削除してprefabオーバーライドで後から復元することができます。
インタラクションのミラーリング
包括的なインタラクションリグは汎用性が高く利き手に左右されない上、左右のインタラクションに対応するprefabを備えているので簡単に開発できます。
そのため変更を左右のインタラクターにすぐにコピーできます。
完全なロコモーション
テレポートロコモーションとスムーズロコモーションをデフォルトでサポートしているほか快適性と物理演算のオプションも備えています。
データソース
データソースはインタラクションリグのインプットです。HMD、ハンドコントローラー、手といった様々なデバイスのデータをインプットします。
このデータを標準的なフォーマットに変換するとインタラクションリグの他の部分でも使えるようになります。
例えばOVRカメラからUnityXRカメラに切り替えるならデータソースを置換し、データソースを参照してインタラクションエントリーポイントを確認するだけです。
インタラクションゲームオブジェクトの根底にはデータソースで利用できるインプットソースがあります。
HMD、左手、左インタラクションとHMDに対応する左コントローラー、右手、右インタラクションとHMDに対応する右コントローラーです。

データソースを差し替える場合はLeftInteractors、RightInteractions、GameObjectsに必ず正しく接続し直してください。

インタラクション
インタラクションはインタラクションリグの中核を成します。バーチャル環境でどのようにやりとりするかはインタラクションによって決まります。
ほとんどのインタラクションはプラットフォームに依存しないので、どのデバイスやプラットフォームでも使用できます。

インタラクションリグの場合、インタラクターはデータソースからのユーザーインプットを処理してその環境に対してアクションを実行し、さらにビジュアルを変更するために使用されます。
インタラクターはInteractions / Interactors GameObjectに追加できます。
インタラクターを参照する場所はInteractions / Interactorsです。Interactor Groupを参照するのは優先順位を決めなければならない場合です。

アクティブな状態構造
インタラクターが手、コントローラー、コントローラー駆動の手のどれを使うかによって、参照先が手のみかコントローラーのみか、その両方かが決まります。
このリグはあらゆるインプットモダリティをデフォルトでサポートしているので、どのインプットが利用可能かによって、任意のGameObjectsの有効/無効を自動で切り替えることができます。
インタラクターを関連するInteractions / Interactorsのサブフォルダーに入れるか、この機能を使わない場合はインタラクターに直接置きます。

Hand(手)
手が使える場合は人差し指を優先的に使うので、Pokeする際に特に有用です。
Controller(コントローラー)
コントローラーが使える場合はコントローラーを優先的に使うので、レイとロコモーションを使う際に特に有用です。
Controller and No Hand(コントローラーと手なし)
グラブ(手のビジュアルなし)のように、純粋にコントローラーのインタラクションをします。
Controller and Hand(コントローラーと手)
コントローラーと手のグラブのようなハイブリッドなインタラクションをします。
トリガーを使って選択を進めますが、視覚的な手の形も重要になります。
ミラーリング
それぞれのインタラクション構造は利き手に依存せず、利き手はインプットで指定します。
必要に応じて左右の手でまったく同じ構造を構築し、UnityのPrefabオーバーライドツールを利用して片方の手の変更点をもう片方にコピーしたり、差分をハイライトしたりできます。
リグを[Quick Actions (クイックアクション)]で作成して[Generate as Editable Copy]を選択すると[Prefab path]にprefab変数が表示されます。

prefab変数は以下のように使用します。
片方の手の変更点をもう片方の手に適用する
片方の手のインタラクションに変更を加えます。
右クリックで[Apply as Override in Prefab “ComprehensiveInteractions" (Prefab “ComprehensiveInteractions"のオーバーライドとして適用する)]を選択します。


一般的なリグと比べた手の差分をハイライトする
インタラクションのゲームオブジェクトを選択して[Overrides (オーバーライド)]をクリックし、インタラクションの階層ともう片方との差分をハイライトします。

変更点を元のリグに戻す
ミスをしてさらにそれをPrefab変数のコピーに送信してしまった場合は
prefab変数の[Overrides (オーバーライド)]を選択すればいつでも元の値に復元できます。


合成手
合成手(とコントローラー)はデータスタックにおける手順であり、一部の情報はインタラクターに優先されます。
例えばHandGrabを使って指に変更を加えてバーチャルオブジェクトに巻きつけるようにしたり、PokeインタラクターをインプットHandDataに優先させて指がボタンからずれないようにしたりすることもできます。
順番に注意を払わなければならないこともあります。HandGrabをしてからPokeすることでPokeする際の人差し指のバーチャルな位置を把握できます。
チェーンされた3つの合成手が各インタラクションモジュールで提供されるので好きなレベルでインタラクターを接続できます。ビジュアルはチェーンの最後のステップを参照します。

