Unity Input System完全整理

広告

PlayerInput 3モード+入力の取り方の違い(コード比較付き)

UnityのInput Systemは、同じ入力でも取り方が複数あります
その違いを「コードで比較」しながら理解していきます。


■ 基準コード(InputAction直接方式)

Behaviorの影響はありません

まずは今回の基準となるコードです。

using UnityEngine;
using UnityEngine.InputSystem;

[RequireComponent(typeof(PlayerInput))]
public class InputAction_Direct : MonoBehaviour
{
    private InputAction _move;
    private InputAction _jump;

    private void Start()
    {
        var input = GetComponent<PlayerInput>();
        input.currentActionMap.Enable();

        _move = input.currentActionMap.FindAction("Move");
        _jump = input.currentActionMap.FindAction("Jump");

        _move.performed += Move;
        _jump.performed += Jump;
    }

    private void OnDestroy()
    {
        _move.performed -= Move;
        _jump.performed -= Jump;
    }

    private void Move(InputAction.CallbackContext ctx)
    {
        var moveValue = _move.ReadValue<Vector2>();
        Debug.Log($"Move: {moveValue}");
    }

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

■ このコードのポイント

_move.performed += Move;

これは

👉 InputActionに直接イベント登録している

つまり

  • PlayerInputのモードに依存しない
  • どのモードでも動く

■ ① Send Messages方式

● 設定

PlayerInput → Behavior = Send Messages


● コード

using UnityEngine;
using UnityEngine.InputSystem;

public class Input_SendMessages : MonoBehaviour
{
    private void OnMove(InputValue value)
    {
        Vector2 move = value.Get<Vector2>();
        Debug.Log($"Move: {move}");
    }

    private void OnJump()
    {
        Debug.Log("Jump!");
    }
}

● ポイント

  • Action名「Move」→ OnMove
  • 自動で呼ばれる

■ ② Unity Events方式

● 設定

PlayerInput → Behavior = Invoke Unity Events

Inspectorで関数を登録

スクロールすると、Jumpのイベント登録の欄があります


● コード

using UnityEngine;
using UnityEngine.InputSystem;

public class Input_UnityEvents : MonoBehaviour
{
    public void Move(InputAction.CallbackContext ctx)
    {
        Vector2 move = ctx.ReadValue<Vector2>();
        Debug.Log($"Move: {move}");
    }

    public void Jump(InputAction.CallbackContext ctx)
    {
        Debug.Log("Jump!");
    }
}

● ポイント

  • Inspectorで紐付けが必要
  • publicメソッドである必要あり

■ ③ C# Events方式

● 設定

PlayerInput → Behavior = Invoke C# Events


● コード

using UnityEngine;
using UnityEngine.InputSystem;

[RequireComponent(typeof(PlayerInput))]
public class Input_CSharpEvents : MonoBehaviour
{
    private PlayerInput _input;

    private void Start()
    {
        _input = GetComponent<PlayerInput>();
        _input.onActionTriggered += OnAction;
    }

    private void OnDestroy()
    {
        _input.onActionTriggered -= OnAction;
    }

    private void OnAction(InputAction.CallbackContext ctx)
    {
        if (!ctx.performed) return;

        if (ctx.action.name == "Move")
        {
            Vector2 move = ctx.ReadValue<Vector2>();
            Debug.Log($"Move: {move}");
        }

        if (ctx.action.name == "Jump")
        {
            Debug.Log("Jump!");
        }
    }
}

■ ④ 押しっぱなしの処理(全方式共通)

重要です。
performed だけでは押しっぱなしは取れません。


● 正しい書き方

private void Update()
{
    Vector2 move = _move.ReadValue<Vector2>();

    if (move != Vector2.zero)
    {
        Debug.Log("押しっぱなし中");
    }
}

■ 比較まとめ

方式特徴難易度
直叩きシンプル・モード非依存★★
Send Messages名前一致で呼ばれる
Unity EventsInspectorで接続★★
C# Eventsコードで統一管理★★★

■ 最後に

今回のポイントはここです。

  • 入力の取り方は1つではない
  • 同じ動きでも仕組みが違う
  • 「なぜ動くか」を理解することが重要

訪問数 11 回, 今日の訪問数 12回

広告

Unity

Posted by hidepon