インタラクター アーキテクチャ — MRTK3
MRTK は、Unity の XR インタラクション ツールキット が提供する一連のインタラクターの上に構築されています。 多関節ハンド トラッキング、視線、ピンチなどの Mixed Reality 機能では、XRI においてデ既定で提供されるセットよりも精巧なインタラクターが必要です。 MRTK は、一般に入力モダリティによって分類される新しいインタラクターインターフェイスと、対応する実装を定義します。
概要とレビュー
XRI を初めて使用する開発者は、まず Unity の XRI アーキテクチャに関するドキュメントを確認することをお勧めします。 MRTK インタラクターは、既存の XRI インタラクターのサブクラス、または XRI インタラクターインターフェイスの実装です。 MRTK にも適用されるインタラクターアーキテクチャに関する Unity のドキュメントを参照してください。
XRI の良き市民
カスタム MRTK インタラクターは、既定の XRI インタラクター インターフェイスにとともに適切に動作します。XRI システムの観点から見ると、それらは 「vanilla」 インタラクターと区別がつきません。 その逆もまた真実です。MRTK で高度なインタラクション可能なデバイスを構築する場合、既定の XRI インタラクターは基本的なホバーと選択に対して引き続き機能します。 これは、既存の XRI プロジェクトと完全に互換性を持たせるための MRTK の取り組みの一環です。 XRI アプリケーションがある場合、MRTK の対話式操作可能なコントロールと UI コントロールは、既存の "vanilla" XRI セットアップで動作します。
入力モダリティの抽象化
入力デバイス、インタラクションを実行するインタラクター、またそれらが生成するインタラクション イベントはすべて、XRI でアーキテクチャ的に分離されています。 この分離は、MRTK3 の入力抽象化戦略にとって重要であり、すべてのコンテキストで適切に機能するクロス プラットフォームとクロス デバイスの対話式操作を記述することができます。
MRTK v2 から、特定の入力タイプまたはデバイスに固有の対話式操作をコーディングするという共通の性質があります。 多くの開発者は、接近してつかむ、遠くへの光線、またはその他の特定の入力タイプに特に反応する対話式操作の作成に慣れています。
MRTK3 では個々の入力モードの曖昧さの解消と検出は引き続き可能ですが、特定の個々の入力タイプにインタラクションをハード コーディングすることは人為的に制限され、インタラクションの柔軟性が低下します。 これについての詳細は、インタラクション可能なアーキテクチャのドキュメントにありますが、インタラクターにとって重要なのは、一般的に入力デバイスと 1:1 にマップする必要がないことです。
アタッチ変換と制御の反転
MRTK v2 が ObjectManipulator
や Slider
などの一部として "移動のロジック" 内で行ったことの多くは、現在、インタラクター自体の責任です。 インタラクターは attachTransform を制御して、特定の種類における操作の動作を定義するようになりました。 入力モダリティ間で異なるインタラクタブルに複雑な対話式操作ロジックを記述する必要はなくなりました。代わりに、統一された操作ロジックにより、入力モダリティやそれを駆動するデバイスに関係なく、attachTransform
のポーズがリッスンできます。
たとえば、GrabInteractor
の attachTransform
は、ハンド/コントローラーのつかむポイントにあります。 XRRayInteractor
の attachTransform
は、レイの端にあるヒット ポイントにあります。 CanvasProxyInteractor
の attachTransform
は、マウスをクリックした場所にあります。 これらすべての異なるインタラクターについて、インタラクタブルは、操作に適切に応答するためにインタラクターの種類を気にする必要はありません。
インタラクタブルは attachTransform
を照会し、インタラクターの種類に関係なく、すべての attachTransform
を同じに扱うことができます。
このアプローチは、既存の XRI インタラクターとの互換性と、まだ開発されていない入力モダリティの対話式操作の将来性に不可欠です。 新しいインプット メソッドが導入された場合、新しいインタラクターが有効で適切に動作する attachTransform
を生成する場合、既存のインタラクション可能なものを変更する必要はありません。
したがって、哲学的には、attachTransform
相互作用ロジックです。 カスタムの対話式操作の場合は、新しい対話式操作用にカスタマイズするインタラクタブルを書き換えたり拡張したりするのではなく、新しい attachTransform
ロジックを使用して新しいインタラクターを記述することが常に優先されます。 このようにして、既存のすべてのインタラクション可能なものは、書き直したり拡張したりしたインタラクションだけでなく、新しいインタラクションのメリットを享受できます。
XRController と入力バインディング
ほとんどのインタラクターは、入力アクションに直接バインドしません。 ほとんどは XRBaseControllerInteractor
から派生しており、階層内のインタラクターより上の XRController
が必要です。 XRController
は入力アクションにバインドし、関連するアクション (選択など) をアタッチされたすべてのインタラクターに伝達します。
それにもかかわらず、一部のインタラクターは、XRController
が提供しない特別な入力バインディングまたは追加の入力を必要とする場合があります。 このような場合、インタラクターは、独自の一意の入力アクションに直接バインドするか、対話ロジックに他の非入力システムソースを使用することもできます。 XRI 基本クラスは、XRController
のバインディングをリッスンすることを好みますが、これらの動作は、外部または代替の入力ソースを使用するためにオーバーライドできます。
インターフェイス
XRI は、基本的なIXRInteractor
、IXRHoverInteractor
、IXRSelectInteractor
、IXRActivateInteractor
を定義します。 MRTK は、インタラクター用の追加のインターフェースを定義します。 MRTK 固有の対話式操作に関する追加情報を公開するものもあれば、単に分類と識別用のものもあります。 これらのインターフェイスはすべて Core パッケージ内にあり、実装は Input などの他のパッケージに存在します。
重要
これらのインターフェイスは、特定の種類の対話式操作をフィルター処理する必要がある場合に便利ですが、これらのインターフェイスを特にリッスンするように対話式操作をハード コーディング "しない" ことをお勧めします。 "どのような状況でも、対話式操作固有のインターフェイスではなく、常に汎用 XRI isSelected と isHovered を優先してください"。
絶対に必要な場合を除き、インタラクタブル内でこれらのインターフェイスの具体的な MRTK 実装を参照しないでください。 どのような場合も、インターフェイスを参照することをお勧めします。 具象の種類を明示的に参照すると、インタラクションが現在の既存の種類でのみ動作するように制限されます。 インターフェイスのみを参照することで、既存の実装をサブクラス化しない可能性のある将来の実装との互換性を確保できます。
IVariableSelectInteractor
このインターフェイスを実装するインタラクターは、インタラクション可能ものに変数 (つまり、アナログ) の選択性を発行できます。 変数の選択量は、SelectProgress
プロパティで照会できます。 このインターフェイスを実装する MRTK インタラクターには、MRTKRayInteractor
と GazePinchInteractor
が含まれます。 基本のインタラクタブル (既定の XRI インタラクタブルと MRTKBaseInteractable
) は、変数の選択量の影響を受けません。ただし、StatefulInteractable
は、この値をリッスンし、参加しているすべての変数インタラクターと非変数インタラクターの max()
に基づいてその Selectedness
を計算します。
IGazeInteractor
このインターフェイスを実装するインタラクターは、操作や意図とは別に、ユーザーの受動的な視線を表します。 MRTK 実装は FuzzyGazeInteractor
で、XRI XRRayInteractor
を継承し、ファジー コーン キャスト ロジックを追加します。 IGazeInteractor
がホバリングしているときに XRBaseInteractable
は、フラグ IsGazeHovered
を立て ます。
IGrabInteractor
このインターフェイスを実装するインタラクターは、物理的な近接フィールドのつかみインタラクションを示しています。 attachTransform
は、つかみポイントとして定義されます。 MRTK 実装は GrabInteractor
で、XRI の XRDirectInteractor
をサブクラス化します。
IPokeInteractor
このインターフェイスを実装するインタラクターは、突出しインタラクションを表します。 注意: これは必ずしも指を意味しないことに注意してください。 任意のインタラクターがこのインターフェイスを実装し、指以外のソースからの突出しインタラクションを提供できます。 インタラクター インターフェイスのチェックが良いアイデアである数少ない例の 1 つでは、PressableButton
のようなインタラクション可能なものは、特に容積測定プレスを駆動するために、IPokeInteractor
をリッスンします。 IPokeInteractor
を実装するインタラクターは、ボタンの 3D プレスを誘導します。
IPokeInteractor
は、突出しオブジェクトの特性を定義する PokeRadius
プロパティを公開します。 突出しは attachTransform
を中心としていると考えられ、attachTransform
によって PokeRadius
から外側に延びています。 PressableButton
のようなインタラクティブ動作は、3D プッシュ距離をこの半径だけオフセットすることができ、指ベースのプレスの場合、ユーザーの物理的な指の太さによって駆動できます。
このインターフェースの MRTK 実装は PokeInteractor
です。 テンプレートのプロジェクトでは、指駆動ではない IPokeInteractor
の別の例も提供します。PenInteractor
は、仮想 3D スタイラスの先端にある突出し対話式操作を提供します。
IRayInteractor
このインターフェイスを実装するインタラクターは、レイ ベースのポインティング操作を表します。 attachTransform
は、選択中にターゲット オブジェクト サーフェスにおけるレイのヒット位置を表します。
このインターフェイスの MRTK 実装は MRTKRayInteractor
で、XRI XRRayInteractor
から直接継承されます。
Note
XRI XRRayInteractor
は、この MRTK インターフェイスを実装していません。
ISpeechInteractor
このインターフェイスを実装するインタラクターは、音声駆動型のインタラクターを表します。 MRTK の実装は SpeechInteractor
です。
MRTK SpeechInteractor
は、内部的に PhraseRecognitionSubsystem
を使用し、XRI XRInteractionManager
からのインタラクタブル登録イベントをサブスクライブします。 ただし、インタラクタブルは、どのサブシステムが音声処理を実行しているかを気にする必要はありません。ISpeechInteractor
は、他のインタラクターが生成するものと同じ XRI イベント (選択など) を生成します。
IGazePinchInteractor
このインターフェイスは、単に IVariableSelectInteractor
インターフェイスの特殊化です。 このインターフェイスを実装するインタラクターは、暗黙的に変数選択インタラクターです。 IGazePinchInteractor
は、間接的にターゲットを絞ったリモート操作を明示的に表しています。 別の視線ベースのインタラクターがインタラクションのターゲットを駆動し、操作はハンドまたはコントローラによって行われます。 attachTransform
は、IRayInteractor
の attachTransform
と同じように動作します。選択が開始されると、ターゲット上のヒット ポイントにスナップします。
複数の IGazePinchInteractor
が 1 つのインタラクションに加わる場合、それらの attachTransform
は、加わるすべてのピンチ ポイント間の中央値点からの移動によってオフセットされます。 したがって、インタラクション可能なものは、つかみインタラクションやレイ インタラクションからの attachTransforms
など、他のマルチハンド インタラクションの場合と同じ方法でこれらの attachTransform
を実行できます。
MRTK の実装は GazePinchInteractor
です。
IHandedInteractor
一部のインタラクターは、IHandedInteractor
インターフェイスを実装することを選択して、ユーザーの特定の手に関連付けられていることを明示的に指定できます。 一部のインタラクターはハンドに関連付けられていないため、これを実装していません。 最も明白な例は、SpeechInteractor
や FuzzyGazeInteractor
のようなものでしょう。
このインターフェイスを実装する MRTK インタラクターは、任意のハンド ジョイント、HandJointInteractor
、と XRDirectInteractor
によって駆動される汎用的で抽象的な GazePinchInteractor
である MRTKRayInteractor
です。
インタラクタブルは現在、このインターフェイスを使用して、左手と右手の間の曖昧さを解消する必要がある特定の効果が選択されたときにそれを作動させます。 この最も顕著な例は、UX コンポーネント ライブラリのパルス効果です。