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 Events | Inspectorで接続 | ★★ |
| C# Events | コードで統一管理 | ★★★ |
■ 最後に
今回のポイントはここです。
- 入力の取り方は1つではない
- 同じ動きでも仕組みが違う
- 「なぜ動くか」を理解することが重要
訪問数 11 回, 今日の訪問数 12回



ディスカッション
コメント一覧
まだ、コメントがありません