Unity Input Systemで、ランタイムでアクションマップを切り替えるサンプル

本資料では、UnityのInputSystemにおいて、複数のアクションマップ(例:GameplayとUI)を実行中に切り替える方法について解説します。
以下のサンプルコードは、PlayerInputコンポーネントと入力アクションのコールバックを利用して、指定の入力(例:SwitchAction)でアクションマップを切り替える実装例です。


1. 概要

  • 目的:
    ゲームの状態に応じて、現在有効なアクションマップを切り替え、適切な入力セットを動的に管理する。
  • 使用する機能:
    • PlayerInputコンポーネントのSwitchCurrentActionMap()メソッド
    • InputSystemのイベント駆動型コールバック(OnSwitchActionMap)

2. サンプルコード

以下のコードは、GameplayとUIの2種類のアクションマップを切り替える例です。
PlayerInputコンポーネントにより、初期状態はGameplayマップを有効にし、SwitchActionという入力イベントで切り替えを行います。

using UnityEngine;
using UnityEngine.InputSystem;

[RequireComponent(typeof(PlayerInput))]
public class ActionMapSwitcher : MonoBehaviour
{
    // 切り替え対象のアクションマップ名をインスペクタから設定可能
    [SerializeField] private string gameplayActionMap = "Gameplay";
    [SerializeField] private string uiActionMap = "UI";

    private PlayerInput playerInput;

    private void Awake()
    {
        playerInput = GetComponent<PlayerInput>();
        // 初期状態としてGameplayアクションマップを有効にする
        playerInput.SwitchCurrentActionMap(gameplayActionMap);
    }

    // InputSystemのイベント用コールバック
    // 例えば、SwitchActionという入力アクションに紐付ける
    public void OnSwitchActionMap(InputValue value)
    {
        if (value.isPressed)
        {
            SwitchActionMap();
        }
    }

    // アクションマップの切り替え処理
    private void SwitchActionMap()
    {
        // 現在のアクションマップ名を取得
        string currentMap = playerInput.currentActionMap.name;

        if (currentMap == gameplayActionMap)
        {
            playerInput.SwitchCurrentActionMap(uiActionMap);
            Debug.Log("UIアクションマップに切り替えました");
        }
        else if (currentMap == uiActionMap)
        {
            playerInput.SwitchCurrentActionMap(gameplayActionMap);
            Debug.Log("Gameplayアクションマップに切り替えました");
        }
    }
}

3. 解説

  • PlayerInputの利用:
    [RequireComponent(typeof(PlayerInput))] により、必ずPlayerInputコンポーネントが付与されることを保証します。
    Awake()でPlayerInputをキャッシュし、初期状態としてGameplayアクションマップを有効にしています。
  • アクションマップの切り替え:
    OnSwitchActionMap()というコールバックは、SwitchActionという入力アクション(例:ボタン押下)に連動します。
    このコールバック内でSwitchActionMap()を呼び出し、現在有効なアクションマップに応じて、UIとGameplayの切り替えを行います。
  • 実行時の挙動:
    ゲーム中にSwitchActionの入力が検知されると、現在のアクションマップが確認され、反対側のマップに切り替わります。
    これにより、例えばゲームプレイ中とメニュー表示中で異なる入力設定を利用することが可能になります。

4. まとめ

このサンプルコードを利用することで、UnityのInputSystemにおけるアクションマップの動的な切り替えが実現できます。
ゲームの状態に応じた入力管理が容易になり、柔軟なユーザーインターフェースやゲームプレイの実装が可能です。
各プロジェクトの要件に合わせ、アクションマップの名称や切り替えタイミングを調整してご活用ください。


Input System,Unity

Posted by hidepon