MRが楽しい

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

MetaQuestProでMRTKを使ってコントローラのボタン押下時のアクションを設定する

本日は MetaQuestPro の技術調査枠です。
MetaQuestProでMRTKを使ってコントローラのボタン押下時のアクションを設定する手順を記事にします。

前提条件

以下の記事と同様の手順でプロジェクトの基本設定を実施します。
bluebirdofoz.hatenablog.com

コントローラのボタンを利用する

コントローラのボタンを利用するには以下の作業が必要になります。
・Digital 属性の InputAction を作成する
・OculusTouchHandController のボタン設定に作成した InputAction を割り当てる
・InputActionHandler コンポーネントでイベントを検知してアクションを実行する

Digital属性のInputActionを作成する

Profile をクローンして編集可能な状態にします。
MRTK の Profile を開き、[Input -> Input Action]パネルの[InputActionProfile]まで[Clone]して編集可能な状態にします。

[Add a New Action]ボタンをクリックして新規 InputAction を作成します。

適当な名前を設定し、右側のプルダウンからアクションの属性を[Digital]に設定します。

これで新規 InputAction の作成は完了です。

OculusTouchHandController のボタン設定に作成した InputAction を割り当てる

次にコントローラのボタンに InputAction を割り当てます。
[Controllers]パネル内の[ControllerMappingProfile]を[Clone]して編集可能な状態にします。

[Oculus Touch Left/Right hand Controller]の設定が MetaQuestPro のコントローラのマッピング設定です。
今回は右手のコントローラの A ボタンを利用したいので[Oculus Touch Right hand Controller]を開きます。

A ボタンの Press のプルダウンを開き、先ほど作成した InputAction を選択します。
これで右手のコントローラの A ボタンを押下したときに InputAction のイベントが発生するようになります。

InputActionHandler コンポーネントでイベントを検知してアクションを実行する

最後に InputAction のイベントを検知して実際の処理を行う設定を作成します。
適当なゲームオブジェクトに[InputActionHandler]コンポーネントを設定します。

[IsFocusRequired]のチェックを外し、[InputAction]に作成した InputAction を選択します。
これで InputAction のイベントを本コンポーネントがいつでも検知するようになります。

イベント検知時に行う処理を[OnInputActionStarted]に定義します。
テキストの入力フィールドに文字列を設定するイベントを設定しました。

UnityEditorでのテスト

UnityEditor で InputAction の動作テストを行いたい場合は SpeechCommand のキーコードを利用すると指定のキーボード入力で InputAction を呼び出しできるので便利です。
[Speech]パネル内の[SpeechCommandsProfile]を[Clone]して編集可能な状態にします。

[Add a New Speech Command]で音声コマンドを追加します。
先ほど作成した InputAction を呼び出す音声コマンドを作成して[KeyCode]に任意のキーボードキーを割り当てます。今回は F1 キーに割り当てました。

シーンを再生して動作を確認します。
F1 キーを押下すると InputAction が発火し、これを受けとってテキストの入力フィールドに文字列を設定するイベントが処理されることを確認できました。

ビルドと動作確認

これで設定は完了です。
[File -> BuildSettings...]からビルドとデプロイを実行します。

自作アプリのデプロイと実行に関する手順は以下の記事を参照ください。
bluebirdofoz.hatenablog.com

MetaQuestPro でデプロイしたアプリを起動し、右手コントローラの A ボタンを押します。

以下の通り、テキストフィールドに文字列が入力されました。