学習記事一覧 · Unityクラス

【学習】Input System(入力の取得)

Unity 入門シリーズでは、

  • PlayerInput をアタッチした
  • OnMove と OnJump で入力を受け取った

という形で Input System を使いました。

しかし、Input System には他にも知っておくと便利な仕組みがあります。

Input System

の主な使い方をまとめて押さえましょう。

今回は PlayerInputInputValue、コールバックの仕組みを解説します。

今日学ぶこと

  • PlayerInput … 入力を受け取るコンポーネント
  • OnMove / OnJump / OnFire … コールバックの命名規則
  • InputValue … 入力値の取得
  • Send Messages … メソッド名で自動呼び出し
  • Mouse … マウス座標の取得

Input System とは

Input System は、Unity 6 のデフォルトの入力システムです。キーボード、マウス、ゲームパッド、タッチなどに対応しています。

新規プロジェクトには InputSystem_Actions が用意されており、Player(移動・ジャンプなど)がすでに定義されています。


PlayerInput の設定

  1. プレイヤーの GameObject を選択
  2. Add ComponentPlayer Input を追加
  3. ActionsInputSystem_Actions を指定
  4. Default MapPlayer に設定
  5. BehaviorSend Messages に(推奨)

これで、入力があったときにスクリプト内のメソッドが自動的に呼ばれます。


コールバックの命名規則

Send Messages では、メソッド名が On + アクション名 のときに自動的に呼ばれます。

アクション名 メソッド名 呼ばれるタイミング
Move OnMove 移動入力(WASD・十字キー)
Jump OnJump ジャンプボタン(スペースなど)
Fire OnFire 攻撃ボタン
void OnMove(InputValue value)
{
    moveInput = value.Get<Vector2>();
}

void OnJump(InputValue value)
{
    if (value.isPressed)
    {
        // ジャンプ処理
    }
}

InputValue の使い方

InputValue から、入力の値を取得します。

void OnMove(InputValue value)
{
    Vector2 move = value.Get<Vector2>();
    // 右: (1, 0)、左: (-1, 0)、上: (0, 1)、下: (0, -1)
}

void OnJump(InputValue value)
{
    bool pressed = value.isPressed;  // 押した瞬間 true、離した瞬間 false
}
メソッド・プロパティ 説明
value.Get<Vector2>() 移動入力の (x, y) を取得
value.isPressed 押した瞬間 true、離した瞬間 false

マウス座標の取得

Mouse.current でマウスの状態にアクセスできます。

using UnityEngine;
using UnityEngine.InputSystem;

Vector2 mousePos = Mouse.current.position.ReadValue();

// ワールド座標に変換(2D)
Vector3 worldPos = Camera.main.ScreenToWorldPoint(new Vector3(mousePos.x, mousePos.y, 0));

Behavior の種類

PlayerInput の Behavior で、入力の渡し方を変えられます。

Behavior 説明
Send Messages メソッド名で自動呼び出し。OnMove、OnJump など
Invoke Unity Events Inspector でイベントを登録
Broadcast Messages 子オブジェクトにも送信

Send Messages がシンプルで、コードだけで完結します。


完成コード例

using UnityEngine;
using UnityEngine.InputSystem;

public class InputSample : MonoBehaviour
{
    [SerializeField] private float speed = 5f;
    private Vector2 moveInput;

    void OnMove(InputValue value)
    {
        moveInput = value.Get<Vector2>();
    }

    void OnJump(InputValue value)
    {
        if (value.isPressed)
        {
            Debug.Log("ジャンプ!");
        }
    }

    void Update()
    {
        float moveX = moveInput.x * speed * Time.deltaTime;
        float moveY = moveInput.y * speed * Time.deltaTime;
        transform.Translate(moveX, moveY, 0);
    }
}

重要ポイント

Input System でキーやマウスの入力を取得できます。

  • PlayerInput … 入力を受け取るコンポーネント。Actions に InputSystem_Actions を指定
  • On + アクション名 … Send Messages で自動呼び出し(Move → OnMove、Jump → OnJump)
  • value.Get<Vector2>() … 移動入力の (x, y) を取得
  • value.isPressed … ボタンを押した瞬間を判定
  • Mouse.current.position … マウス座標

発展アイデア

  • Input Actions のカスタマイズ … キー割り当ての変更、リバインディング
  • InputAction … コードから直接アクションを参照する
  • InputManager(レガシー) … Input.GetKey など。非推奨だがシンプル

Input System は ゲーム操作の基本 です。Unity 6 ではデフォルトで使われます。