本日はMRTKのボタンに関しての記事です。
MRTKではプレファブとしていくつかのUIが提供されています。
本ブログでは調査を兼ねオリジナルのUIの作成に挑戦しています。
今回はMRTKのボタンに関するドキュメントを読みながらさらなる理解を深めます。
昨日はMRTKで提供されているボタンの種類を見ました。今回は使い方を再度学んでいきます。
〇Interactableコンポーネント
ボタンには[Interactable.cs]がアタッチされています。
このコンポーネントはAirTapやHoloLens 2でのPushなどの入力に応答できるようにするオールインワンコンテナです。MRTKでアクションに対してのリアクションを行うためにはInteractableコンポーネントを使用します。
〇一般的な入力設定
・state
stateはInteractable Profiles や Visual Themes の Press や observed などのインタラクションのフェーズを定義する ScriptableObject(データを保持できるオブジェクト) パラメータです。
・Enabled
Bool型の変数でアクションによるリアクションの対話可能な状態を有効にするかどうかを切り替えます。これは、コード内のInteractable.IsEnabledに対応しています。
Unityではコンポーネントの有効、無効を.IsEnabledによって切り替えることができますが、これを行った場合component内のすべての状態が無効化されます。
ここでのEnabledのチェックボックスによってほとんどの入力処理が無効になり、関連する入力状態がリセットされますがクラスは、すべてのフレームを実行するので無視される入力イベントを受信します。(イベントは発火しないが受信はする状態)
・InputAction
Interactableコンポーネントが対応する入力構成またはプロファイルからInputアクションを選択します。
MixedRealityToolkitのprofile/Input/InputActionに設定したものと紐づいています。
このプロパティは、実行時にInteractable.InputActionを使用してコード内で構成できます。
・is Global
true の場合、選択した入力アクションのグローバル入力リスナーとしてコンポーネントがマークされます。デフォルトの動作は false で、入力はInteractable.cs/GameObjectのみに制限されます。
このプロパティは、コード内で実行時にInteractable.IsGlobalを介して構成できます。
・Speech command
音声コマンドを使用して対話を行います。MRTKprofileで設定した音声コマンド プロファイルから音声操作の OnClick イベントをトリガーします。
このプロパティは、実行時にInteractable.VoiceCommandを介してコードで構成できます。
・Requires Focus
true の場合は音声コマンドを使用する際にゲームオブジェクトに対してFocusが当たっている必要があります。つまりそのオブジェクトを見ながら音声コマンドを発音しなければ動作しないようになります。
false の場合、対話可能は選択した音声コマンドのグローバル リスナーとして機能します。この場合オブジェクトを見て音声コマンドを使用する必要がなくなります。デフォルトの動作は true です。
iPhoneを例に簡単に例えるとチェックが入っている場合『Hey Siri!』はiPhoneを見ている状態でないと機能しません。 チェックが入っていない場合iPhoneがポケットやカバンの中に入っている状態でも『Hey Siri!』のコマンドでiPhoneが使用できます。
このプロパティは、対話可能な.VoiceRequiresFocusを介してコード内で実行時に設定できます。
・Selection Mode
アクションのリアクションとしてどのような用途で機能するかの選択ロジックを定義します。切り替えの状態やボタンに関連付けられたその他のマルチランクの状態を定義する場合に便利です。Interactable.DimensionIndexで現在の状態を取得できます。
使用可能な選択モードは次のとおりです。
Button - 単純なクリックで操作可能
Toggle - オン/オフ状態を交互に切り替えます。
Multi-dimension - クリックするたびに現在の寸法レベル + 1 が増加します。リストなどにボタンの状態を定義するのに便利です
〇スクリプトでInteractableコンポーネントの状態を取得する
次のような簡単なスクリプトをからオブジェクトにアタッチして[PressableButtonHoloLens2Circular_48x48]プレファブをアタッチしました。
using System.Collections; using System.Collections.Generic; using UnityEngine; using Microsoft.MixedReality.Toolkit.UI; public class InteractableLogResiver : MonoBehaviour { public GameObject _InteractableObject; // Start is called before the first frame update void Start() { Interactable inter = _InteractableObject.GetComponent<Interactable>(); //Log Debug.Log("isEnabled ="+inter.IsEnabled); Debug.Log("InputAction ="+ inter.InputAction); Debug.Log("IsGlocal ="+ inter.IsGlobal); Debug.Log("VoiceCommand ="+inter.VoiceCommand); Debug.Log("Requires Focus =" + inter.VoiceRequiresFocus); } }
Unityを実行することで現在のInteractableコンポーネントの状態を取得できました。