Subsystem
Subsystem (SubsystemWithProvider の略称、サブシステム) は、Unity エンジンの機能のライフサイクルやスクリプトインターフェースを定義します。サブシステムのライフサイクルはすべてのサブシステムで共通ですが、機能の実装はプラットフォームごとに異なる場合があります。それにより、アプリケーションのコードと Google ARCore や Apple ARKit などのプラットフォーム固有の SDK との間に抽象レイヤーが提供されます。
AR Foundation は、サブシステムを使用してその AR (拡張現実) 機能を定義します。例えば、XRPlaneSubsystem は平面検出用のインターフェースを定義します。同じアプリケーションコードを使用して、iOS や Android (または平面サブシステムを実装する他のプラットフォーム) 上で検出された平面を操作できますが、AR Foundation 自体にこれらのプラットフォーム用のサブシステム実装は含まれていません。
サブシステムの実装は プロバイダー と呼ばれ、通常は プロバイダープラグイン と呼ばれる個別のパッケージで提供されます。例えば、Google ARCore XR Plug-in は Android プラットフォーム用のサブシステム実装を提供し、Apple ARKit XR Plug-in は iOS 用の実装を提供します。
デバイストラッキング を除く AR Foundation の各 AR 機能と、対応するサブシステムの一覧を次の表に示します (デバイストラッキングは Input System を使用し、サブシステムベースではありません)。
サブシステムのライフサイクル
すべてのサブシステムでライフサイクルは同じであり、作成、開始、停止、除去という流れになります。通常は、サブシステムのインスタンスを自分で作成したり除去したりする必要はなく、これは Unity のアクティブな XRLoader
によって行われます。各プロバイダープラグインに XRLoader
の実装 (単にローダーと呼ばれます) が含まれています。一般的には、ローダーはアプリケーションの初期化時にすべての必要なサブシステムのインスタンスを作成し、アプリケーションの終了時にそれらを除去しますが、この動作は設定で変更可能です。トラッカブルマネージャーがサブシステムの Start
に到達すると、Project Settings > XR Plug-in Management の設定に基づいてプロジェクトのアクティブなローダーからサブシステムのインスタンスを取得します。ローダーとその設定の詳細については、XR Plug-in Management のエンドユーザー向けドキュメント を参照してください。
AR Foundation の一般的なシーンでは、シーン内に存在する マネージャー が有効になると、その管理対象のサブシステムが開始 (Start
) され、マネージャーが無効になるとサブシステムが停止 (Stop
) されます。Start
と Stop
の厳密な動作はサブシステムごとに異なりますが、通常はそれぞれ "作業の実行開始" と "作業の実行停止" に相当します。アプリケーションのニーズに基づいて、サブシステムはいつでも開始または停止できます。
サブシステム記述子
各サブシステムには対応する SubsystemDescriptor があり、そのプロパティによってサブシステムの機能の範囲が記述されます。プロバイダーは、プラットフォームまたはデバイスごとに異なる制限に基づいて、ランタイムにこれらのプロパティに異なる値を割り当てることができます。
サブシステム記述子に記述されている機能を使用する際には、以下の例のように、ランタイムにまずそのプロパティの値をチェックして、その機能がターゲットデバイスでサポートされているかどうかを確認する必要があります。
var trackedImageManager = FindObjectOfType(typeof(ARTrackedImageManager));
var imageTrackingSubystem = trackedImageManager.subsystem;
// 画像トラッキングプロバイダーが参照画像ライブラリのランタイム変更を
// サポートするかどうかを照会
if (imageTrackingSubsystem.subsystemDescriptor.supportsMutableLibrary)
{
// 何らかのアクションを実行
}
// 以下も同等:
if (trackedImageManager.descriptor.supportsMutableLibrary)
{
// 何らかのアクションを実行
}
トラッキングサブシステム
トラッキングサブシステム は、物理環境内にある 1 つ以上のオブジェクト (トラッカブルと呼ばれます) を検出および追跡するサブシステムです。
トラッカブル は、トラッキングサブシステムが検出および追跡できる要素を表します。例えば、XRPlaneSubsystem は、トラッカブルとして BoundedPlane を検出および追跡します。各トラッカブルには TrackableId
という 128 ビットの GUID (グローバル一意識別子) があり、これを使用することで、トラッカブルが追加、更新、または削除されるときに複数のフレーム間でそれらを一意に識別できます。
コードでは、トラッカブルは ITrackable を実装する任意のクラスとして定義されます。UnityEngine.XR.ARSubsystems
名前空間では、トラッカブルの実装 (BoundedPlane など) はすべて構造体です。UnityEngine.XR.ARFoundation
名前空間では、トラッカブルの実装 (ARPlane など) はすべて、これらの構造体をラップするコンポーネントです。