【学習】入力の取得(キー入力、マウス入力)
これまでの学習では、
- スクリプトで Start と Update を書いた
- Inspector から変数を編集できるようにした
という形でスクリプトを動かしてきました。
しかし、プレイヤーがキーを押したりマウスを動かしたりしたときに、それに反応する処理を学んでいません。
入力の取得
という仕組みが必要です。
今回は Input System を使って、キー入力とマウス入力を取得する方法を学びます。Unity 6 では Input System がデフォルトで、InputSystem_Actions に Player(移動・ジャンプなど)がすでに定義されています。追加の設定はほとんど不要です。
今日学ぶこと
- PlayerInput … 入力を受け取るコンポーネント
- OnMove … 移動入力(WASD・十字キー)のコールバック
- OnJump … ジャンプなど「押した瞬間」のコールバック
- マウス座標 … マウス位置の取得
事前準備:InputSystem_Actions の確認
Unity 6 の新規プロジェクトには、InputSystem_Actions.inputactions が最初から用意されています。
- Project ウィンドウで
InputSystem_Actionsを検索 - 見つからない場合は、Assets フォルダ内の Input System 関連ファイルを確認
Project Settings → Input System Package → Project-wide Actions に設定されていれば、そのまま使えます。
PlayerInput コンポーネントの設定
プレイヤーに PlayerInput コンポーネントを追加し、Input System とスクリプトを繋ぎます。
- プレイヤーの GameObject を選択
- Add Component → Player Input を追加
- Actions に
InputSystem_Actionsをドラッグして指定 - Default Map を Player に設定
- 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.GetKey、Input.GetAxis など、コードが短く書けます。
| 名前 | 今回学ぶもの | 特徴 |
|---|---|---|
| Input System | ✓ | Unity 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 のカスタマイズ … キー割り当ての変更、リバインディング
入力の取得は ゲーム操作の基本 です。次は当たり判定を学びましょう。



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