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)");目次





