MRが楽しい

MRやVRについて学習したことを書き残す

Mixed Reality Toolkit 3 パブリックプレビューのドキュメントを少しずつ読み解く MRTK3 input と MRTK サブシステム

本日は Mixed Reality Toolkit 3 の調査枠です。
Mixed Reality Toolkit 3 パブリックプレビューのドキュメントを少しずつ翻訳しつつ読み進めていきます。

Mixed Reality Toolkit 3 のドキュメント

以下のドキュメントを読み進めていきます。
docs.microsoft.com

今回は「MRTK3 input」と「MRTK サブシステム」のページを読み進めます。
docs.microsoft.com
docs.microsoft.com

MRTK3 input

MRTK3 の入力は主に Unity の入力システムと MRTK サブシステムの 2 つのパスでルーティングされます。
Unity の入力システムはコントローラーのボタンやスティック、コントローラーとハンドポインターのポーズまで全てのサポート対象に使用されます。
MRTK サブシステムは手の関節や音声など、幅広い対話式操作に必要なデータ用に存在します。

Unity の入力システムについては以下のドキュメントを参照ください。
docs.unity3d.com

MRTK サブシステム

MRTK3 は Unity XR サブシステムを活用して、音声やハンドトラッキングなどの機能のクロスプラットフォームサポートに役立つ拡張可能なモジュールを作成します。
これらのサブシステムは、XRMeshSubsystem や XRInputSubsystem などの既存の Unity サブシステムとともに Unity によって初期化およびロードされます。

Unity サブシステムの仕組みについては以下のドキュメントを参照してください。
docs.unity3d.com

理念

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

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

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

Unity のインフラストラクチャに含まれているサブシステム定義は[Start],[Stop],[Destroy]などの単純なライフサイクル方法を提供します。
MRTK はこれらの定義のほか[Update],[LateUpdate],[FixedUpdate]などの便利な定期メソッドを拡張します。

MRTK の[MRTKLifecycleManager]はライフサイクルインタフェースを実装するサブシステムを管理します。
これはサブシステムアーキテクチャに関与する唯一の MonoBehavior です。
シーン内のどこにでも配置できますが、通常はリグのどこかに残しておきます。

クエリ

サブシステム実装の照会は簡単でパフォーマンスに優れています。

// Gets the first valid implementation of T that is started and running.
// 開始および実行されている T の最初の有効な実装を取得します。
T mySubsystem = XRSubsystemHelpers.GetFirstRunningSubsystem<T>();

// Gets the first valid implementation of T, even if it hasn't been started.
// 開始されていないものでも T の最初の有効な実装を取得します。
T mySubsystem = XRSubsystemHelpers.GetFirstSubsystem<T>();

// If multiple implementations of T are loaded, get all of them.
// T の複数の実装がロードされている場合は、それらのすべてを取得します。
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;
}

プロファイル

MRTK3 サブシステムのプロファイルは作成および開始されるサブシステムを定義するプラットフォームごとの定義です。
MRTK 2.xのプロファイルとは異なります。

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

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

MRTK3 パッケージの一部として提供される既製の MRTKProfile があります。これは不変のアセットです。
実行するサブシステムのカスタムプロファイルを作成する場合は、プロジェクト内に MRTKProfile アセットを作成する必要があります。

MRTKProfile を作成する場合は MRTK3 をインポートしたプロジェクトのアセットフォルダで右クリックから[Create -> MRTK -> MRTKProfile]で作成できます。

構成

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

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

XRSubsystemHelpers.GetConfiguration<TConfig, TSubsystem>()

サブシステムは MRTKSubsystemAttribute でどの構成タイプがサブシステムに関連するかを定義します。加えてこの属性は実装されたプロバイダーの具象型と共に、いくつかのメタデータも定義します。
例えば、以下は MRTK Hands Aggregator サブシステムが使用する属性です。

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

プロファイルと同様に、MRTK3 ではデフォルトの構成アセットが提供されています。
これらは不変のアセットです。
構成を編集するにはプロジェクトにアセットを複製または新規作成する必要があります。

作成する場合は MRTK3 をインポートしたプロジェクトのアセットフォルダで右クリックから[Create -> MRTK -> Subsystems]から作成できます。