MRTKでXboxControllerの入力を扱うためのメモです。
MRTKのプロファイルのInputからInputSystemProfileをcloneして、Input Actionを編集できるようにします。
「+Add a New Action」ボタンで、Input Actionを幾つか追加します。
今回は、左右トリガー用と左右スティック用に用意しました。
Axis Constraintは、トリガーはSingle Axis、スティックはDual Axisにしました。
ControllerMappingProfileをcloneして編集できるようにします。
Xbox Controllerの部分を編集して、先ほど作成したIntput Actionを割り当てます。
通常、InputActionを取得するにはIMixedRealityInputActionHandlerを実装しますが、そこからスティックの値は取れなそうだったので、IMixedRealityInputHandlerを実装してみました。
Single AxisとDual Axisでデータ型が異なるため、IMixedRealityInputHandler<T>に型を指定して、複数のインターフェイスに対して実装を行っています。
また、ボタンに割り当てたInputActionが、eventData.MixedRealityInputAction.Descriptionに入ってくるため、そこで判別を行っています。
using UnityEngine; using Microsoft.MixedReality.Toolkit; using Microsoft.MixedReality.Toolkit.Input; using System; public class XboxController : MonoBehaviour, IMixedRealityInputHandler, IMixedRealityInputHandler<Vector2>, IMixedRealityInputHandler<float> { public Action<Vector2> RightStickAction; public Action<Vector2> LeftStickAction; public Action<float> RightTriggerAction; public Action<float> LeftTriggerAction; void OnEnable() { CoreServices.InputSystem?.RegisterHandler<IMixedRealityInputHandler<Vector2>>(this); CoreServices.InputSystem?.RegisterHandler<IMixedRealityInputHandler<float>>(this); CoreServices.InputSystem?.RegisterHandler<IMixedRealityInputHandler>(this); } void IMixedRealityInputHandler<Vector2>.OnInputChanged(InputEventData<Vector2> eventData) { if ("XboxController Controller" != eventData.InputSource.SourceName) return; var inputActionName = eventData.MixedRealityInputAction.Description; var inputData = eventData.InputData; if (inputActionName == "Right Stick") { RightStickAction?.Invoke(inputData) } if (inputActionName == "Left Stick") { LeftStickAction?.Invoke(inputData) } } void IMixedRealityInputHandler<float>.OnInputChanged(InputEventData<float> eventData) { if ("XboxController Controller" != eventData.InputSource.SourceName) return; var inputActionName = eventData.MixedRealityInputAction.Description; var inputData = eventData.InputData; if (inputActionName == "Left Trigger") { LeftTriggerAction?.Invoke(inputData); } if (inputActionName == "Right Trigger") { RightTriggerAction?.Invoke(inputData); } } void IMixedRealityInputHandler.OnInputDown(InputEventData eventData) { // Aボタン等のアクションはここに記載する } void IMixedRealityInputHandler.OnInputUp(InputEventData eventData) { } }
※このスクリプトはお作法が足りていないので、InputActionHandlerなどを参考に処理を追加する必要があります。
ただ、ここまで作っておいてアレですが、スティックを倒しっぱなしにしたときの処理を書く方法がわからなかったので、結局別の方法を用いました。
このブログにて供養しておきます。