【学習】入力の取得(キー入力、マウス入力)

広告

これまでの学習では、

  • スクリプトで Start と Update を書いた
  • Inspector から変数を編集できるようにした

という形でスクリプトを動かしてきました。

しかし、プレイヤーがキーを押したりマウスを動かしたりしたときに、それに反応する処理を学んでいません。

入力の取得

という仕組みが必要です。

今回は Input System を使って、キー入力とマウス入力を取得する方法を学びます。Unity 6 では Input System がデフォルトで、InputSystem_Actions に Player(移動・ジャンプなど)がすでに定義されています。追加の設定はほとんど不要です。

今日学ぶこと

  • PlayerInput … 入力を受け取るコンポーネント
  • OnMove … 移動入力(WASD・十字キー)のコールバック
  • OnJump … ジャンプなど「押した瞬間」のコールバック
  • マウス座標 … マウス位置の取得

事前準備:InputSystem_Actions の確認

Unity 6 の新規プロジェクトには、InputSystem_Actions.inputactions が最初から用意されています。

  1. Project ウィンドウで InputSystem_Actions を検索
  2. 見つからない場合は、Assets フォルダ内の Input System 関連ファイルを確認

Project Settings → Input System Package → Project-wide Actions に設定されていれば、そのまま使えます。


PlayerInput コンポーネントの設定

プレイヤーに PlayerInput コンポーネントを追加し、Input System とスクリプトを繋ぎます。

  1. プレイヤーの GameObject を選択
  2. Add Component → Player Input を追加
  3. Actions に InputSystem_Actions をドラッグして指定
  4. Default Map を Player に設定
  5. Behavior は Send Messages のまま(推奨)

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


OnMove(移動入力)

OnMove は、WASD や十字キーで移動入力があったときに自動的に呼ばれます。InputValue から Vector2 で値を受け取ります。

using UnityEngine;
using UnityEngine.InputSystem;

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

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

    void Update()
    {
        float moveX = moveInput.x * speed * Time.deltaTime;
        float moveY = moveInput.y * speed * Time.deltaTime;
        transform.Translate(moveX, moveY, 0);
    }
}
入力moveInput の値
右 / D(1, 0)
左 / A(-1, 0)
上 / W(0, 1)
下 / S(0, -1)
何も押していない(0, 0)

OnJump(押した瞬間だけ)

OnJump は、スペースキーなどを押した瞬間に呼ばれます。ジャンプなど、1回だけ反応させたいときに使います。

void OnJump(InputValue value)
{
    if (value.isPressed)
    {
        Debug.Log("ジャンプ!");
    }
}
コールバック呼ばれるタイミング
OnMove入力があるたびに(押している間も値が渡る)
OnJumpボタンを押した瞬間・離した瞬間
OnFire攻撃ボタンを押した瞬間・離した瞬間

value.isPressed が true のときが「押した瞬間」です。


Time.deltaTime でフレームレートに依存しない移動

Time.deltaTime は、前フレームからの経過秒数です。これを使うと、PC の性能に左右されずに一定の速度で動かせます。

float moveX = moveInput.x * speed * Time.deltaTime;
transform.Translate(moveX, 0, 0);

speed が 5 なら「秒速 5 単位」で移動します。


マウス座標の取得

Input System では、Mouse.current.position でマウスの画面座標を取得できます。

using UnityEngine.InputSystem;

Vector2 mousePos = Mouse.current.position.ReadValue();
// ワールド座標に変換するには Camera.ScreenToWorldPoint を使う

2D では、Camera.main.ScreenToWorldPoint でワールド座標に変換してから使うことが多いです。ScreenToWorldPoint は Vector3 を受け取るため、new Vector3(mousePos.x, mousePos.y, 0) のように渡します。


完成コード例

using UnityEngine;
using UnityEngine.InputSystem;

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

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

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

事前準備: プレイヤーに PlayerInput をアタッチし、Actions に InputSystem_Actions、Default Map を Player に設定してください。

十字キーまたは WASD でプレイヤーが動きます。


プログラムの流れ

PlayerInput が入力を検知
        ↓
OnMove が呼ばれ、moveInput に値が入る
        ↓
Update で moveInput × speed × Time.deltaTime を計算
        ↓
transform.Translate で移動

補足:InputManager(レガシー)

Unity には従来の InputManager(レガシー) もあります。Input.GetKeyInput.GetAxis など、コードが短く書けます。

名前今回学ぶもの特徴
Input SystemUnity 6 のデフォルト。VR・複数コントローラに対応
InputManager(レガシー)補足コードが短い。非推奨

InputManager を使う場合は、Edit → Project Settings → Player → Active Input Handling を Both に変更する必要があります。本記事では Input System で「コールバック」「押した瞬間」といった入力の考え方を学びます。


重要ポイント

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

  • PlayerInput … 入力を受け取るコンポーネント。Actions に InputSystem_Actions を指定
  • OnMove … 移動入力。value.Get() で (x, y) を取得
  • OnJump … ジャンプなど。value.isPressed で押した瞬間を判定
  • Time.deltaTime … フレームレートに依存しない移動に必要
  • メソッド名は On + アクション名(Move → OnMove、Jump → OnJump)

発展アイデア

入力の取得が分かったら、次のステップです。

  • 当たり判定 … 壁や敵との衝突を検知する
  • プレイヤーを動かす … Rigidbody2D で物理演算を使った移動
  • Sprite とアニメーション … 移動に合わせてアニメーションを再生する
  • Input Actions のカスタマイズ … キー割り当ての変更、リバインディング

入力の取得は ゲーム操作の基本 です。次は当たり判定を学びましょう。

訪問数 2 回, 今日の訪問数 2回

広告

Unity

Posted by hidepon