【Input System】Input Actionのコードでの操作【Unity】

Input System サムネ

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で行います。値の型は、そのアクションのコントロールタイプによって決定されます。

Unity InputSystemインプットアクション1

ちなみに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種類があります。コールバックの発生条件は、以下の次の通りです。

startedWasPressedThisFrameボタンを押した瞬間
performedWasPerformedThisFrameボタンを押した瞬間
canceledWasReleasedThisFrameボタンが離れた瞬間

基本は上記の通りですが、コールバックの発生条件はinteractionsの適用によって変更されます。

また、isPressedはボタンを押してから離すまで、つまりstarted~canceledまで常にtrueが返されます。

Phese

InputActionには5つのフェーズがあります。

Disabled入力を受け付けない状態
Waiting下記3条件を満たさず入力受付状態
Startedstarted~performedの間。通常はボタン押下後一瞬
Performedperformed~canceledの間。通常はボタン押下後からボタンが離れるまで
Canceledcanceled以後。通常はボタンが離れた直後一瞬

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");
Unity InputSystemインプットアクション3

ちなみに注意点ですが、WASD以下のバインドはMoveの下では無く、WASD Compositeの下のため、Moveアクション下でマスクすると、逆に機能しなくなります。

        action.bindingMask = new InputBinding()
        {
            // Select the keyboard binding based on its specific path.
            path = "<Keyboard>/space"
        };

スキーマごとではなく、スキーマ、ボタンの組み合わせでマスクすることも可能です。

Interactionの取得・追加

Unity InputSystemインプットアクション4
string interactions = action.interactions;

この場合、「Hold,Press」の文字列を取得します。

Interactionは、InputActionへの動的追加はできず、InputAction生成時に追加することができます。

var action = new InputAction(interactions: "press");

Processorの取得・追加

Unity InputSystemインプットアクション5
string processor = action.processors;

この場合、「InvertVector2,NormalizeVector2」の文字列を取得します。

Processorは、InputActionへの動的追加はできず、InputAction生成時に追加することができます。

var action = new InputAction(processors: "scaleVector2(x=2, y=2)");

関連リンク

参考 【Unity】Input Systemの紹介と解説 トップページゲーム開発65535 Ver2 参考 【Unity】Input Systemの紹介ゲーム開発65535 Ver2 参考 【Unity】Input Systemの基本的な使い方ゲーム開発65535 Ver2

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です