ARDKフィーチャーマネージャーの使用

マネージャーコンポーネントを利用してUnity向けのシンプルな方法でARDK機能にアクセスする。

概要

ARDKのコアインターフェイスは、表現性と柔軟性を重視して設計されているため、そのほとんどがUnityに直結しないC#コードとして生きています。つまり、オブジェクトのライフタイムの管理、ARセッションの設定、ゲームコンポーネントへのデータの受け渡しなど、ゲームに機能を統合するために必要なC#コードが数多くあります。

マネージャーは、各コンポーネントがカバーするARDKの機能に対して、より合理的なインターフェイスを提供します。たとえば、ほとんどのAR機能には、Managerコンポーネントが付属しており、ARセッションでその機能を有効にして設定し、データやイベントをUnity向けのフォーマットで表示する処理を行います。

マネージャーで機能を設定する方法

マネージャーコンポーネントが有効な場合は、アクティブな ARSessionARConfiguration でその機能を有効にする方法が一般的です。設定が必要な値(水平面と垂直面のどちらを検出するかなど)はマネージャーのプロパティとして公開され、マネージャーによって、 ARConfiguration で必要な値の設定が適切に処理されます。

マネージャーの有効化や無効化、または設定値の変更は、次回のUnity Updateループの開始時に、更新された ARConfiguration によって ARSession セッションが自動的に再実行されます。つまり、1つのUnity Updateフレーム内で、複数の ARSession を再実行するという非効率なトリガーを引くことなく、マネージャーを通じて複数の変更を行うことができます。ARSessionが構築または実行されていない場合は、マネージャーを有効化または無効化しても、次にARSessionが実行されるまで、目に見えるような効果はありません。

マネージャーが破壊されると、それ自体も無効となるため、マネージャーで制御されている設定値も無効になります。

ARSessionを手動で実行する

各マネージャーで変更された設定は、いずれかのマネージャーの変更により自動的に実行されたか、ユーザーコードにより手動で実行されたかに関係なく、 ARSession が実行されるたびに自動的に収集されます。そのため、 ARSession オブジェクトに対して手動で Run を呼び出しても問題ありません。たとえば、この操作によって、独自の設定値を適用する場合があります。

マネージャーを使用してシーンにカスタム設定値を追加する

手動で ARSession セッションを実行すると、渡された ARConfiguration 設定が保存され、設定した変更はすべてのマネージャーに適用されます。

たとえば、 ARSession セッションが ARConfiguration で手動で実行されたとします。ここで PlaneDetection 値は PlaneDetection.Horizontal に設定されているとします。

// Completely compatible code with all feature managers in your scene,
// excluding the ARPlaneManager.
public void RunSession()
{
   var arSession = ARSessionFactory.Create();
   var config = ARWorldTrackingConfigurationFactory.Create();
   config.PlaneDetection = PlaneDetection.Horizontal;
   arSession.Run(config);
}

シーンにARMeshManagerがある場合、 ARConfigurationIsMeshingEnabled 値はオーバーライドされますが、 PlaneDetection 値は維持されます。後に ARMeshManagerを無効にしても、 ARSession を再実行すると PlaneDetection の値は PlaneDetection.Horizontal のまま変わりません。ただし、ARPlaneManagerがシーンに追加されると、それが無効になっていても、 PlaneDetection 値のオーバーライドが開始されます。

ライフサイクルを手動で制御する

デフォルトでは、インスペクターで作成されたマネージャーがある場合は、Unityコンポーネントのライフサイクルに基づいて動作が制御されます。 Awake 中に初期化ロジックを実行し、 OnEnable 中に機能を有効にし、 OnDisable 中に機能を無効にし、 OnDestroy 中に保持しているすべてのリソースを解放します。何らかの理由でマネージャーのライフサイクルを手動で制御する必要がある場合は、インスペクターで Manage Using Unity Lifecycle プロパティをfalseに設定します。その後、パブリックメソッド InitializeEnableFeaturesDisableFeaturesDeinitialize を呼び出して、マネージャーを制御することができます。マネージャーの初期化を一旦取り下げると、再度初期化することはできません。その時点で再度有効にする場合は、コンポーネントを破棄して再作成する必要があります。

GameObject.AddComponent を使用した場合など、プログラムで作成されたマネージャーがある場合、そのライフサイクルがUnityで管理されることは ありません 。Unityで制御されるマネージャーの実行時にインスタンス化する必要がある場合は、代わりにプレハブを作成しインスタンス化することをお勧めします。

マネージャーとその役割

マネージャーの一覧と、マネージャーによって制御または追加されている機能や特徴を紹介します。

名前

機能

詳細

ARSessionManager

ARセッションのライフサイクル

ARSessionのインスタンスを作成して実行し、参照します。

NetworkSessionManager

マルチプレイヤーのネットワークセッションのライフサイクル

MultipeerNetworkingインスタンスを作成して実行し、参照します。

ARNetworkingManager

マルチプレイヤーAR

ARSessionManagerとNetworkSessionManagerに付属するARSessionやMultipeerNetworkingインスタンスを使用するARNetworkingインスタンスを作成して実行し、参照します。

CapabilityChecker

デバイスのAR機能

デバイスがAR対応かどうかを確認し、イベントを作成して、他のコードで対応可能なデバイスを使用できるようにします。

ARPlaneManager

平面検出

平面検出を有効にし、必要に応じて、検出された平面に合うように位置とスケールが調整されたGameObject一式を維持します。

ARImageDetectionManager

画像検出

指定した画像の検出を有効にします。

ARDepthManager

深度

深度機能を有効にします。また、必要に応じて深度データを処理してから、リスナーに表示します。

ARSemanticSegmentationManager

セマンティック セグメンテーション

セマンティック セグメンテーションを有効にします。また、必要に応じてセマンティックデータを処理してから、リスナーに表示します。

DepthMeshOcclusionManager

深度ベースのオクルージョン

深度データを使用して、レンダリングされたすべてのオブジェクトに現実世界のオクルージョンを追加します。このマネージャーの設定であるARDepthManager.OcclusionModeは廃止され、ScreenSpaceMeshに変更されています。

ARMeshManager

環境のメッシング

現実世界の面に近似したメッシュを持つGameObject一式を管理します。

FeaturePreloadManager

環境のメッシング

現実世界の面に近似したメッシュを持つGameObject一式を管理します。