InputSystemのInputActionsとは?

Input Actionsは、Unity 2019.1以降に導入された新しい入力システム(Input System Package)の中核的な機能です。

アクション指向の設計で、

キーボード、マウス、ゲームパッド、画面タッチなどの異なる入力デバイスを統一的に扱うことができます。

入力をアクションとして抽象化できるので、例えば複数のデバイスのボタン操作に「ジャンプ」というアクションに割り当て、

「ジャンプ」アクションが発生したらゲーム内でプレイヤーをジャンプさせるように作ることができます。

Input Actionsを作成する

Input Systemが追加されていれば、Projectビューの右クリックメニューから

CreateInput Actions.inputactionsファイルを作成できます。

ファイルをダブルクリックすると以下の様なウィンドウが開きます。

Action Maps

Action Mapsはアクションをグループ化する最上位の概念です。

ゲームの状態によってどのAction Mapを有効にするかスクリプトから選択できますが、有効にできるのはどれか一つだけです。

例えばゲームコントーラで操作する場合、

  • バトルパート
  • UIの操作
  • 乗り物に乗った
  • 会話シーン

などでボタンやスティックの操作が変わってくるかもしれません。

そういったとき状況に応じてAction Mapを切り替えて対応できます。

Action

Actionは具体的な行動や入力の意図を設定できます。

Action Map内に含まれる個別の入力項目です。

プレイヤーにさせたい操作を抽象化して登録します。

例えば

  • 移動
  • 攻撃
  • ジャンプ
  • ポーズ

といったアクションを用意し、どのデバイスのどのボタンが押されたらそのアクションが発生するかを設定します。

Action Properties

各アクションの動作について詳細に設定できます。

例えば、

  • ボタン操作なのか、値を返すのか
  • 値を返すならfloat型?Vector2?
  • タップ、マルチタップ、ホールド、といった入力パターン
  • 入力値の加工

といった設定ができます。

Actionに入力を割り当てる

JumpPunchのアクションを追加しました。

アクションに入力を割り当てるには、アクション名の右にある+ボタンからBindingを選択します。

今回はAdd Bindingを選択します。

Pathのドロップダウンリストを選択すると入力を割り当てることができます。

キーボードの適当なキーに割り当てましょう。

Listenボタンを押すことで入力待ちになり、実際のキーやボタンを入力することで候補を絞り込むことができます。

今回はSpaceキーとVキーを割り当ててみました。

以下の様なスクリプトを用意します。

using UnityEngine;
using UnityEngine.InputSystem;

public class InputActionsTest : MonoBehaviour
{
    [SerializeField] private InputActionAsset _inputActionAsset;
    private InputAction _jumpAction;
    private InputAction _punchAction;

    private void Awake()
    {
        _inputActionAsset.Enable();
        _jumpAction = _inputActionAsset.FindAction("Jump");
        _punchAction = _inputActionAsset.FindAction("Punch");
        
        _jumpAction.performed += OnJumpPerformed;
        _punchAction.performed += OnPunchPerformed;
    }

    private void OnJumpPerformed(InputAction.CallbackContext obj)
    {
        Debug.Log("Jump!");
    }

    private void OnPunchPerformed(InputAction.CallbackContext obj)
    {
        Debug.Log("Punch!");
    }
}

これをGameObjectに追加し、作成したInputActionsを割り当てることで、

Spaceキーが押されるとJump!Vキーが押されるとPunch!と表示されるようになります。

スクリプト上には押されたキーについて何も書いてありません。

これで後からキーを変更したくなったり、マウスやゲームコントローラに対応したくなってもスクリプトを変更することなく、

InputActionsの設定を変えるだけで対応できるようになります。

InputActionAssetの有効化

作成したInputActionsをスクリプトから使用するには、InputActionAssetを有効化する必要があります。

Enable()について

InputActionAsset.Enable()を呼び出すことで、定義されたすべてのActionが入力を受け付けるようになります。

Enable()を呼び出す前は、キーやボタンが押されてもアクションは発生しません。

通常はAwake()Start()OnEnable()などで呼び出します。

Disable()について

InputActionAsset.Disable()を呼び出すことで、すべてのActionを無効化し、入力の監視を停止します。

これにより以下の効果があります:

  • 入力イベントの処理が停止される
  • メモリリークを防ぐ
  • CPUリソースの無駄遣いを防ぐ

通常はOnDisable()OnDestroy()で呼び出してリソースを適切に解放します。

使用例

public class InputActionsManager : MonoBehaviour
{
    [SerializeField] private InputActionAsset inputActions;

    private void OnEnable()
    {
        inputActions?.Enable();
    }

    private void OnDisable()
    {
        inputActions?.Disable();
    }
}

注意点:

  • Enable()Disable()は複数回呼び出しても安全です
  • GameObjectが非アクティブになった際は自動的にDisable()を呼ぶことを推奨します
  • ゲーム一時停止時など、一時的に入力を無効化したい場合にも活用できます

まとめ

今回はInputSystemの機能、InputActionsについて紹介しました。

InputActionsを使用することで様々なデバイスの入力をアクションとして抽象化できます。

またそれをグループ化して、ゲームの状況に応じて有効なグループを切り替えることもできます。

スクリプト中にキーやボタンについて記述する必要がなくなり、

後から変更したい場合もEditor上で簡単に変更できるようになります。

InputSystemに移行したらぜひ活用してみてください。

📣おしらせ!

Unity Asset Storeで NEW YEAR が開催中です。

1,500以上の人気アセットを50%オフで購入するチャンス。

セールは 2026年1月6日(日本時間)頃に終了予定。

🔗関連ページ