ARDKフィーチャーマネージャーの使用
マネージャーコンポーネントを利用してUnity向けのシンプルな方法でARDK機能にアクセスする。
概要
ARDKのコアインターフェイスは、表現性と柔軟性を重視して設計されているため、そのほとんどがUnityに直結しないC#コードとして生きています。つまり、オブジェクトのライフタイムの管理、ARセッションの設定、ゲームコンポーネントへのデータの受け渡しなど、ゲームに機能を統合するために必要なC#コードが数多くあります。
マネージャーは、各コンポーネントがカバーするARDKの機能に対して、より合理的なインターフェイスを提供します。たとえば、ほとんどのAR機能には、Managerコンポーネントが付属しており、ARセッションでその機能を有効にして設定し、データやイベントをUnity向けのフォーマットで表示する処理を行います。
マネージャーで機能を設定する方法
マネージャーコンポーネントが有効な場合は、アクティブな ARSession の ARConfiguration でその機能を有効にする方法が一般的です。設定が必要な値(水平面と垂直面のどちらを検出するかなど)はマネージャーのプロパティとして公開され、マネージャーによって、 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がある場合、 ARConfiguration の IsMeshingEnabled 値はオーバーライドされますが、 PlaneDetection 値は維持されます。後に ARMeshManagerを無効にしても、 ARSession を再実行すると PlaneDetection の値は PlaneDetection.Horizontal のまま変わりません。ただし、ARPlaneManagerがシーンに追加されると、それが無効になっていても、 PlaneDetection 値のオーバーライドが開始されます。
ライフサイクルを手動で制御する
デフォルトでは、インスペクターで作成されたマネージャーがある場合は、Unityコンポーネントのライフサイクルに基づいて動作が制御されます。 Awake
中に初期化ロジックを実行し、 OnEnable
中に機能を有効にし、 OnDisable
中に機能を無効にし、 OnDestroy
中に保持しているすべてのリソースを解放します。何らかの理由でマネージャーのライフサイクルを手動で制御する必要がある場合は、インスペクターで Manage Using Unity Lifecycle
プロパティをfalseに設定します。その後、パブリックメソッド Initialize
、 EnableFeatures
、 DisableFeatures
、 Deinitialize
を呼び出して、マネージャーを制御することができます。マネージャーの初期化を一旦取り下げると、再度初期化することはできません。その時点で再度有効にする場合は、コンポーネントを破棄して再作成する必要があります。
GameObject.AddComponent
を使用した場合など、プログラムで作成されたマネージャーがある場合、そのライフサイクルがUnityで管理されることは ありません 。Unityで制御されるマネージャーの実行時にインスタンス化する必要がある場合は、代わりにプレハブを作成しインスタンス化することをお勧めします。
マネージャーとその役割
マネージャーの一覧と、マネージャーによって制御または追加されている機能や特徴を紹介します。
名前 |
機能 |
詳細 |
---|---|---|
ARセッションのライフサイクル |
ARSessionのインスタンスを作成して実行し、参照します。 |
|
マルチプレイヤーのネットワークセッションのライフサイクル |
MultipeerNetworkingインスタンスを作成して実行し、参照します。 |
|
マルチプレイヤーAR |
ARSessionManagerとNetworkSessionManagerに付属するARSessionやMultipeerNetworkingインスタンスを使用するARNetworkingインスタンスを作成して実行し、参照します。 |
|
デバイスのAR機能 |
デバイスがAR対応かどうかを確認し、イベントを作成して、他のコードで対応可能なデバイスを使用できるようにします。 |
|
平面検出 |
平面検出を有効にし、必要に応じて、検出された平面に合うように位置とスケールが調整されたGameObject一式を維持します。 |
|
画像検出 |
指定した画像の検出を有効にします。 |
|
深度 |
深度機能を有効にします。また、必要に応じて深度データを処理してから、リスナーに表示します。 |
|
セマンティック セグメンテーション |
セマンティック セグメンテーションを有効にします。また、必要に応じてセマンティックデータを処理してから、リスナーに表示します。 |
|
深度ベースのオクルージョン |
深度データを使用して、レンダリングされたすべてのオブジェクトに現実世界のオクルージョンを追加します。このマネージャーの設定であるARDepthManager.OcclusionModeは廃止され、ScreenSpaceMeshに変更されています。 |
|
環境のメッシング |
現実世界の面に近似したメッシュを持つGameObject一式を管理します。 |
|
環境のメッシング |
現実世界の面に近似したメッシュを持つGameObject一式を管理します。 |