アーキテクチャ
このセクションでは、インタラクションシステムのコアコンポーネントと、インタラクションのライフサイクルを構成する各ステート (状態) との関係について説明します。
ステート
インタラクションシステムには、Hover (ホバー)、Select (選択)、Activate (アクティベート) という 3 つの一般ステートがあります。これらのステートが表す内容はオブジェクトによって異なります。Hover と Select は従来の GUI にあるマウスオーバーとマウスダウンの概念に少し関連しています。Activate は XR に特有で、コンテキスト依存のコマンドです。
これらのインタラクションステートは常に Interactor (能動側、インタラクター) と Interactable (受動側、インタラクタブル) の両者に関係し、両者ともそのステートになる、またはそのステートでなくなるときに通知を受けます。
ステート | 機能 |
---|---|
Hover | あるインタラクタブルがインタラクターの有効なターゲットになると、ステートは Hover になります。オブジェクトにホバーすることは、そのオブジェクトを操作しようという意図を示しますが、通常はオブジェクトの動作を変化させません。ただし、ホバーされたボタンの色が変化するというような、ステートの変化を表す視覚的なインジケーターが作られる場合があります。 |
Select | 選択には、ボタンやトリガーを押すなど、ユーザーから働きかけて Select ステートにするアクションが必要です。インタラクタブルが Select ステートになると、Unity は選択している側であるインタラクターが対象に作用していると認識します。選択すると、例えばつかめるオブジェクトを持つ、レバーを握る、ホバーでフォーカスしたドアを押す準備をするといった行動のシミュレーションを行うことができます。 |
Activate | アクティベーションは追加アクションであり、通常、選択中のオブジェクトに作用するボタンまたはトリガーにマップされます。これにより、ユーザーは選択しているオブジェクトをさらに操作することができます。Activate アクションはインタラクタブルに依存します。例えば、手に持った懐中電灯のオンオフを切り替えるとか、おもちゃのバズーカーでボールを撃つといった動作に Activate を適用することができます。追加のコードを書かずに、Activate を処理するコンポーネントをアクションに接続することができます。それには、Inspector ウィンドウを使用して、Interactable Events で既存のコールバックをつなぎ、UnityEvents を介して Activated に加えます。 |
コンポーネント
Interactor
インタラクターとなるコンポーネントは、ワールド内のインタラクタブルオブジェクトに対するホバーと選択のアクションを処理します。このコンポーネントは、フレームごとにホバーや選択の対象となり得る有効なターゲットのリストを作成する役割を担います。
Interactable
インタラクタブルはインタラクターがホバー、選択、アクティベートを実行できる、シーン内のオブジェクトです。このコンポーネントは、そうしたインタラクションステートの動作を定義する役割を担います。同じインタラクターがボールを持って投げる、銃を撃つ、キーパッドの 3D ボタンを押すといった動作も可能です。
Interaction Manager
Interaction Manager (インタラクションマネージャー) はインタラクターとインタラクタブルを仲介します。このコンポーネントは、登録されているインタラクターとインタラクタブルのグループ内で、インタラクションステートの変更を実際に引き起こす役割を担います。
典型的な設定は、単一のインタラクションマネージャーがあって、すべてのインタラクタブルがすべてのインタラクターによる影響を受ける可能性があるという状況です。複数のインタラクションマネージャーを相互補足的に使うこともできます。その場合、各インタラクションマネージャーは独自のインタラクターとインタラクタブルのセットを持ち、オンオフを切り替えてインタラクションのセットを有効または無効にします。ロードされたシーンのコレクションでインタラクションを成立させるには、少なくとも 1 つのインタラクションマネージャーが必要です。
有効時 (動作が OnEnable
の間) に、インタラクターとインタラクタブルはどちらも自動でインタラクションマネージャーに登録されます。Inspector ウィンドウでインタラクションマネージャーが未指定の場合は、インタラクターとインタラクタブルは最初に見つかったインタラクションマネージャーを使用します。無効時 (動作が OnDisable
の間) には、インタラクターとインタラクタブルは登録関係にあったインタラクションマネージャーから登録を解除されます。
インタラクションマネージャーがステートの変更をトリガーする詳細なメカニズムについては、更新ループ を参照してください。
Controller
XR Controller コンポーネントは、入力データを抽象化する手段を提供します。インタラクターはその手段を利用して、インタラクションステート (特に選択とアクティベーション) への変換を行います。入力アクションは追跡対象デバイスのコントロールに関連付けられており、フレームごとに読み取られます。インタラクターはそれに対するクエリを行い、選択またはアクティベートするかどうかを決定します。
手に関連付けられているインタラクターが複数ある場合は、通常は同じ手に XR Controller コンポーネントも複数、関連付けられています。つまり、1 つの XR Controller のコンポーネントだけで手のためのインタラクターをすべて表現しなくてもよいということです。例えば、レイをベースとした Teleportation のインタラクターと近距離で物をつかむ Direct のインタラクターとで入力を分けたいときに、それぞれのインタラクターのコンポーネントで異なる XR Controller のコンポーネントを参照して、追跡対象になっている 1 つのコントローラーデバイスから別々の入力を読み取ることができます。
このコンポーネントは、追跡対象デバイスの位置と回転を読み取り、Transform コンポーネントに適用する役割も担っています。
Controller Recorder
Controller Recorder コンポーネントを使用して、入力データを記録し再生することもできます。また、XR デバイスを装着せずにインタラクションを検証したりテストシーンを実行したりするためにも使用できます。
[!ノート] Controller Recorder は現在 Unity エディターでのみ機能します。
更新ループ
インタラクションマネージャーの更新ループはインタラクターとインタラクタブルにクエリを実行し、ホバーステートと選択ステートの処理を行います。まずインタラクターにターゲットの有効なリスト (ホバーと選択の両方に使用) を照会します。次に、インタラクターとインタラクタブルの両方に対して、既存のホバーオブジェクトと選択オブジェクトがまだ有効かどうかを確認します。無効になった古いステートを消去 (OnSelectExiting
と OnSelectExited
/OnHoverExiting
と OnHoverExited
で終了) した後、両方のオブジェクトに有効な選択とホバーのステートに関するクエリを実行します。そして、両オブジェクトが OnSelectEntering
と OnSelectEntered
/OnHoverEntering
と OnHoverEntered
によって新しいステートになります。
インタラクションステート変更の前後に、インタラクションマネージャーが明示的に PreprocessInteractor
、ProcessInteractor
、ProcessInteractable
を使用して、登録されているすべてのインタラクターとインタラクタブルを更新します。インタラクターは常にインタラクタブルより先に、処理とステート変更の通知を受けます。インタラクタブルとインタラクターは通常の MonoBehaviour
Update
呼び出しの使用を制限されませんが、一般にフレームごとのロジックは、その代わりにいずれかのプロセスメソッドで実行する必要があるため、インタラクターはインタラクタブルより早く更新されます。