MRが楽しい

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

MetaHorizonの開発ドキュメントを読む その27(Interactors)

本日はMetaQuestの学習枠です。
MetaHorizonの開発ドキュメントを読みながら実際に開発を行ってみました。

MetaHorizonの開発ドキュメント

MetaHorizonの開発ドキュメントを実際に手を動かしながら実行時のキャプチャをしていきます。
developers.meta.com

本記事は以下の「Interactors」の記事を試します。
developers.meta.com

Interactors

Interactorとは手やコントローラーにアタッチされたコンポーネントで掴む、テレポート、ポークなどのアクションを開始します。
アクションを開始するためにInteractorは入力データを使用してワールドスペースにおける位置を判断します。

次に独自のComputeCandidate()メソッドを使用して同じタイプの近くにあるInteractableコンポーネントを選択します。
(例: Ray Interactorは独自のRay Interactableを選択します)
IInteractorのDrive()メソッドはComputeCandidate()をいつ実行するか、いつ選択を行うか、選択中に何が起こるかなどを決定します。

全てのInteractorは同じInteractorベースクラスを共有しています。
このクラスはIInteractorを実装して拡張機能としてIInteractorViewも実装します。

IInteractor

IInteractorインターフェイスはインタラクションの状態を変更するためのメソッドを公開します。
例えば以下が含まれます。

void Enable();
void Disable();

void Preprocess();
void Process();
void Postprocess();

void ComputeCandidate();
bool HasCandidate { get; }
object Candidate { get; }

bool ShouldHover { get; }
void Hover();

bool ShouldUnhover { get; }
void Unhover();

bool ShouldSelect { get; }
void Select();

bool ShouldUnselect { get; }
void Unselect();

bool ComputeShouldSelect()
bool ComputeShouldUnselect()

bool HasInteractable { get; }
bool HasSelectedInteractable { get; }

Interactorはポイントまたは選択されたInteractableへの参照を取得するためのメソッドやInteractorStateの変更を取得しフォローするためのメソッドも公開します。
SDKの全てのInteractorはIUpdateDriverを実装し、デフォルトでUnity Updateで更新されます。

ライフサイクル全体を通じてInteractorの進行を開発者自身がコントロールする場合(Interactorを既存のプロジェクトや外部フレームワークに採用する場合など)はIsRootDriverプロパティをfalseに設定したうえでInteractorのIInteractorメソッドを直接呼び出すことができます。

他のInteractorとの間でライフサイクルを調整したり優先順位を設定したりする必要がある場合もデフォルトでInteractorが更新されないようにすることができます。
その場合InteractorGroupを使用してInteractorをグループとして動作させることを推奨します。
developers.meta.com

Selector

ISelectorによりインタラクション(ボタンを押す、人差し指でつまむなど)の選択メカニズムが定義されます。
Interactor自体で選択メカニズム(例: レイ、掴む)が定義されていない場合はISelectorの設定がそれらのInteractorに使用されます。
developers.meta.com