サブシステム — MRTK3

MRTK3 は、音声トラッキングやハンド トラッキングなどの機能のクロスプラットフォーム サポートを提供するのに役立つ拡張可能なモジュールを記述するために、Unity XR サブシステム管理インフラストラクチャを利用します。 これらのサブシステムは、XRMeshSubsystemXRInputSubsystem などの既存の Unity ネイティブ サブシステムと共に、Unity によって初期化され読み込まれます。 Unity サブシステムが動作するしくみについてのドキュメントを参照してください。

基本方針

MRTK v2 では、"サービス" がシーン自体の機能の多くを提供しました。 オブジェクトのインスタンス化、オブジェクトの移動、シーン階層の更新などが行われていましたが、MRTK3 では、サブシステムはシーンを明示的に変更しません。 MRTK3 サブシステムは、データ、情報、またはイベントのモジュール プロバイダーであり、エンドユーザー向けの計算を実行します。 シーン内の何かを変更したり、データ入力に基づいて処理したりする必要がある場合は、データに対して動作するシーンベースのビジュアライザー コンポーネントが個別に存在する必要があります。 この分離により、サブシステムはシーンの変更に関して非破壊的であり、シーン関連の副作用は発生しません。

MRTK v2 は入力処理にシステムとサービスを自由に使用していましたが、MRTK3 は通常、OpenXR と Unity 入力システムをクロスプラットフォーム入力に対して使用します。 ただし、一部の種類のデータはまだ入力システムによってラップされていません。 このような場合は、サブシステムを介してクロスプラットフォーム インターフェイスを提供します。

MRTK サブシステムのライフサイクル

Unity のインフラストラクチャに含まれているサブシステム定義では、簡単なライフサイクル メソッド (StartStopDestroy など) が提供されます。 この定義を拡張して、役に立つ "tick" メソッド (UpdateLateUpdateFixedUpdate など) を組み込んでいます。 MRTKLifecycleManager では、ライフサイクル インターフェイスを実装するサブシステムを管理します。 このライフサイクル マネージャーは、サブシステム アーキテクチャに関連する唯一の MonoBehaviour です。これはシーン内の任意の場所に配置できますが、通常はリグのどこかにそのまま配置しています。

クエリ実行

サブシステムの実装に対するクエリは簡単でパフォーマンスが良好です。

// Gets the first valid implementation of T that is started and running.
T mySubsystem = XRSubsystemHelpers.GetFirstRunningSubsystem<T>();

// Gets the first valid implementation of T, even if it hasn't been started.
T mySubsystem = XRSubsystemHelpers.GetFirstSubsystem<T>();

// If multiple implementations of T are loaded, get all of them.
List<T> allOfThem = new List<T>();
GetAllRunningSubsystemsNonAlloc<T>(allOfThem);

記述子

サブシステムの実装が異なると、機能が異なる場合があります。 たとえば、HandsSubsystem のさまざまな実装によって、物理データまたは合成データを報告する機能を指定できます。 この機能情報はサブシステム記述子に格納されており、特定の実装についてクエリが可能です。

// Get the first running hands subsystem.
var handsSubsystem = XRSubsystemHelpers.GetFirstRunningSubsystem<HandsSubsystem>();

// If we found one...
if (handsSubsystem != null)
{
    // Read the capability information off the implementation's descriptor.
    bool isPhysicalData = handsSubsystem.subsystemDescriptor.IsPhysicalData;
}

Profiles

MRTK 2.x のプロファイルと混同しないように、MRTK3 サブシステム プロファイルは、作成され開始されるサブシステムを定義するデプロイごとのプラットフォーム資産です。

MRTK プロジェクト設定ビューに示すように、サブシステム プロファイル。

対応するチェックボックスがオンになっているサブシステムは、MRTKLifecycleManager によって作成されて起動され、そのライフサイクル メソッドが呼び出されます。 異なるプロファイルを異なるデプロイ ターゲットに割り当てることができます。

ここに示すサブシステムは、インストールしたパッケージによって決まります。 あるパッケージがインストールされていない場合、そのパッケージに関連付けられているサブシステムはここに表示されず、リストは自動更新されます。

あらかじめ作成された MRTKProfile が、MRTK v3 パッケージの一部として提供されています。 これは不変の資産です。 ただし、実行するサブシステムのカスタム選択を作成する場合は、プロジェクト内に MRTKProfile 資産を作成する必要があります。

独自の MRTK サブシステムを作成する

構成

サブシステムには、動作をカスタマイズするための構成オブジェクトを割り当てることができます。

サブシステムの構成

これらの構成オブジェクトには XRSubsystemHelpers API を介してどこからでもアクセスできます。

XRSubsystemHelpers.GetConfiguration<TConfig, TSubsystem>()

サブシステムでは、自身の MRTKSubsystemAttribute の中でそのサブシステムに関連する構成の種類を定義します。 これに加えて、その属性でも、実装されたプロバイダーの具体的な種類と共に、さまざまなメタデータが定義されます。 たとえば、次に示すのは MRTK Hands Aggregator Subsystem が使用する属性です。

[MRTKSubsystem(
        Name = "com.microsoft.mixedreality.hands",
        DisplayName = "MRTK Hands Aggregator Subsystem",
        Author = "Microsoft",
        ProviderType = typeof(MRTKAggregator),
        SubsystemTypeOverride = typeof(MRTKHandsAggregatorSubsystem),
        ConfigType = typeof(MRTKHandsAggregatorConfig))]

プロファイルと同様に、既定の構成資産が提供されます。 これらは不変であり、編集するにはプロジェクトに複製する必要があります。 また、資産の作成メニューから新しい資産を作成することもできます。

新しいアセット作成メニュー