Unityゲームエンジンの入力システム「 Input System」のInput Actionアセットをコード内から操作する方法を紹介します。
InputActionMapの操作
PlayerInput pInput = GetComponent<PlayerInput>();
//現在のアクションマップの取得
InputActionMap map = pInput.currentActionMap;
//任意のアクションマップの取得
InputActionMap map2 = pInput.actions.actionMaps[0];
//現在のアクションマップを変更
pInput.currentActionMap = pInput.actions.actionMaps[0];
InputActionの取得
//アクションマップからアクションの取得
InputAction moveAction = map["Move"];
普通はシーンの状態に合わせてcurrentActionMapを変更しつつ、実際の値の取得はcurrentActionMap[“Fire”]のような形でアクションを取得する方法を取ります。
InputAction
値の取得
//アクションから入力値の取得
Vector2 Value = action.ReadValue<Vector2>();
値の取得はReadValueで行います。値の型は、そのアクションのコントロールタイプによって決定されます。
ちなみにControlTypeはプログラムからは、以下の方法で取得できます。
コールバックなど
//アクション開始コールバック
action.started += context => Debug.Log("Start" + context.ReadValue<Vector2>());
//アクション実行中コールバック
action.performed += context => Debug.Log("Performe" + context.ReadValue<Vector2>());
//アクション終了コールバック
action.canceled += context => Debug.Log("Cancel" + context.ReadValue<Vector2>());
//アクションが前フレームから次フレームの間に入力を受け取った時
bool isTrigger = action.triggered;
//アクション開始から終了まで
bool isPressed = action.IsPressed();
//アクションが開始したフレームでtrue
bool isStarted = action.WasPressedThisFrame();
//アクションが実行開始したフレームでtrue
bool isPerformed = action.WasPerformedThisFrame();
//アクションが終了したフレームでtrue
bool isCanceled = action.WasReleasedThisFrame();
actionのコールバックはstarted、performed、canceledの3種類があります。コールバックの発生条件は、以下の次の通りです。
started | WasPressedThisFrame | ボタンを押した瞬間 |
performed | WasPerformedThisFrame | ボタンを押した瞬間 |
canceled | WasReleasedThisFrame | ボタンが離れた瞬間 |
基本は上記の通りですが、コールバックの発生条件はinteractionsの適用によって変更されます。
また、isPressedはボタンを押してから離すまで、つまりstarted~canceledまで常にtrueが返されます。
Phese
InputActionには5つのフェーズがあります。
Disabled | 入力を受け付けない状態 |
Waiting | 下記3条件を満たさず入力受付状態 |
Started | started~performedの間。通常はボタン押下後一瞬 |
Performed | performed~canceledの間。通常はボタン押下後からボタンが離れるまで |
Canceled | canceled以後。通常はボタンが離れた直後一瞬 |
Interactionを使用するとそれぞれの条件が変更されます。また、アクションタイプがPath Throwghの時は無条件でPerformedオンリーとなります。
//フェーズの取得
if (action.phase == InputActionPhase.Performed)
{
Debug.Log("performed" + action.ReadValue<Vector2>());
}
Pheseはあくまで内部処理です。Update、Fixed Updateよりも高速な一瞬のみで切り替える場合もあるため、外部での使用はあまり好ましくありません。Input Action関連の拡張では多用します。
バインディングによるキーの追加
キーは任意のタイミングで動的追加が可能です。ただし、追加しただけでは反応しないため、最後にEnable()を実行します。
//バインディングの追加
action.AddBinding("<Gamepad>/leftStick");
action.AddBinding("<Mouse>/delta");
action.Enable();
マスクの追加
すでにバインドしている項目に対し、特定の入力デバイスや特定のキー以外の入力を無効にすることができます。
例えば下記コードはスキーマがGamePadのバインド以外を無効化します。つまり、アクション「Move」はゲームパッドの方向キーのみ作用します。
//マスクの追加
action.bindingMask = InputBinding.MaskByGroup("Gamepad");
ちなみに注意点ですが、WASD以下のバインドはMoveの下では無く、WASD Compositeの下のため、Moveアクション下でマスクすると、逆に機能しなくなります。
action.bindingMask = new InputBinding()
{
// Select the keyboard binding based on its specific path.
path = "<Keyboard>/space"
};
スキーマごとではなく、スキーマ、ボタンの組み合わせでマスクすることも可能です。
Interactionの取得・追加
string interactions = action.interactions;
この場合、「Hold,Press」の文字列を取得します。
Interactionは、InputActionへの動的追加はできず、InputAction生成時に追加することができます。
var action = new InputAction(interactions: "press");
Processorの取得・追加
string processor = action.processors;
この場合、「InvertVector2,NormalizeVector2」の文字列を取得します。
Processorは、InputActionへの動的追加はできず、InputAction生成時に追加することができます。
var action = new InputAction(processors: "scaleVector2(x=2, y=2)");
目次