Unity Input System におけるアクション取得方法の比較

本資料では、UnityのInput Systemで入力アクションを取得する際に使用できる2つの方法
playerInput.actions["Move"]currentActionMap.FindAction("Move")
の違いと、それぞれの用途について解説します。


1. 背景

UnityのInput Systemは、従来のポーリング方式やイベント駆動型の入力処理をシンプルに扱えるようになっています。
プレイヤーの入力アクションを取得する方法として、以下の2つの記述方法が一般的です。

  • playerInput.actions[“Move"]
  • currentActionMap.FindAction(“Move")

これらは、基本的には同じ「Move」アクションを参照するためのものですが、使い方や用途に若干の違いがあります。


2. 各取得方法の解説

2.1 playerInput.actions[“Move"]

  • 概要:
    playerInput.actions は、プロジェクト内の全アクションをまとめたリストから「Move」アクションを直接参照します。
  • 利点:
    • シンプルで記述量が少なく、コードが読みやすい。
    • 単一のアクションマップしか使用しない場合、またはすべてのアクションが常に有効な場合に適している。
  • 注意点:
    • 複数のアクションマップを利用している場合、意図しないアクションが取得される可能性がある。

2.2 currentActionMap.FindAction(“Move")

  • 概要:
    currentActionMap は、現在有効になっているアクションマップを参照します。
    FindAction("Move") は、そのアクションマップ内で「Move」アクションを探します。
  • 利点:
    • 複数のアクションマップを切り替える場合、常に現在有効なマップ内のアクションを取得できるため、明確性が向上する。
    • 特定のシーンや状態に応じたアクションマップを管理している場合に有用。
  • 注意点:
    • 利用する前に、必ず対象のアクションマップが正しく有効になっていることを確認する必要がある。

3. 使用例

3.1 playerInput.actions[“Move"] を使用した例

using UnityEngine;
using UnityEngine.InputSystem;

[RequireComponent(typeof(PlayerInput))]
public class SimplePlayerController : MonoBehaviour
{
    public float moveSpeed = 5f;
    private InputAction moveAction;

    private void Awake()
    {
        var playerInput = GetComponent<PlayerInput>();
        moveAction = playerInput.actions["Move"];
    }

    void Update()
    {
        Vector2 moveInput = moveAction.ReadValue<Vector2>();
        Vector3 move = new Vector3(moveInput.x, 0, moveInput.y) * moveSpeed * Time.deltaTime;
        transform.Translate(move, Space.World);
    }
}

3.2 currentActionMap.FindAction(“Move") を使用した例

using UnityEngine;
using UnityEngine.InputSystem;

[RequireComponent(typeof(PlayerInput))]
public class SimplePlayerController : MonoBehaviour
{
    public float moveSpeed = 5f;
    private InputAction moveAction;

    private void Awake()
    {
        var playerInput = GetComponent<PlayerInput>();
        // 現在有効なアクションマップから "Move" アクションを取得
        moveAction = playerInput.currentActionMap.FindAction("Move");
    }

    void Update()
    {
        Vector2 moveInput = moveAction.ReadValue<Vector2>();
        Vector3 move = new Vector3(moveInput.x, 0, moveInput.y) * moveSpeed * Time.deltaTime;
        transform.Translate(move, Space.World);
    }
}

4. どちらを使用すべきか

  • プロジェクト全体で単一のアクションマップを利用している場合:
    playerInput.actions["Move"] で十分です。シンプルでコードが分かりやすいです。
  • 複数のアクションマップを切り替える必要がある場合:
    currentActionMap.FindAction("Move") を利用することで、常に現在有効なマップから正しいアクションを取得できるため、意図しない入力ミスを防げます。

5. まとめ

Unity Input Systemにおいて、入力アクションを取得する方法はプロジェクトの構造や要件により選択が変わります。

  • シンプルな実装: playerInput.actions["Move"]
  • 柔軟なアクションマップ管理: currentActionMap.FindAction("Move")

各方法の利点と注意点を理解し、プロジェクトに適した実装方法を選択してください。


Input System,Unity

Posted by hidepon