ゲームといえば、キーボードやゲームパッドで操作できてこそ!Unity6では、入力はInput Systemという仕組みで受け取ります。ネットの古い記事でよく見るInput.GetKey()は、Unity6の新しいプロジェクトではそのままだとエラーになるので注意。今回はInput Systemで、移動やジャンプの入力を受け取る方法をご紹介します!
この記事で学べること
- Input Systemとは何か、古い
Input.GetKey()との違い - 最初から入っている入力の設定(InputSystem_Actions)の見方
- 入力を扱うスクリプトを自動で作る方法(Generate C# Class)
- 移動・ボタンの入力をスクリプトで受け取る方法
前提知識
Input Systemとは?
入力をまとめて扱う仕組み
Input Systemは、キーボード・マウス・ゲームパッド・タッチなどの入力を、まとめて扱える仕組みです。
- 「移動」「ジャンプ」のようなアクションに、キーやボタンを割り当てておく
- スクリプトでは「ジャンプが押されたか」だけを見ればよい
- キーボードでもゲームパッドでも、同じスクリプトで動く
古いInput.GetKey()は使えない?
以前のUnityでは、Input.GetKey(KeyCode.Space)のように書いて入力を受け取っていました(Input Manager)。Unity6の新しいプロジェクトは、初期設定でInput Systemだけを使うようになっているので、古い書き方をすると再生したときに次のようなエラーが出ます。
InvalidOperationException: You are trying to read Input using the UnityEngine.Input class, but you have switched active Input handling to Input System package in Player Settings.
ネットの記事を参考にするときは、Input.GetKeyやInput.GetAxisが出てきたら「古い書き方だな」と思ってください。
スライムEdit>Project Settings>Player>Other SettingsのActive Input Handlingで、古い方式も使えるように切り替えることは出来ます。でもこの講座ではInput Systemで統一していきます
最初から入っている入力の設定
InputSystem_Actionsを開いてみよう
Unity6のテンプレートで作ったプロジェクトには、Assetsの中にInputSystem_Actionsというファイルが最初から入っています。これが入力の設定ファイルです。
- ProjectウィンドウでAssets>InputSystem_Actionsをダブルクリック
- 入力の設定ウィンドウが開く
- Action Maps:場面ごとのまとまり(Player:ゲーム中の操作、UI:メニュー操作)
- Actions:「移動」「ジャンプ」などの操作の名前
- Bindings:そのアクションに割り当てたキーやボタン
Playerに最初から入っている主なアクション
| アクション | 内容 | キーボードの割り当ての例 |
|---|---|---|
| Move | 移動(上下左右) | WASD、矢印キー |
| Look | 視点を動かす | マウスの動き |
| Attack | 攻撃 | マウスの左クリック |
| Jump | ジャンプ | Space |
| Sprint | ダッシュ | 左Shift |
| Interact | 調べる・話しかける | E(長押し) |
ゲームパッドのボタンも一緒に割り当てられています。細かい割り当ては、上の設定ウィンドウで確認・変更出来ます。
スクリプトで使えるようにする(Generate C# Class)
InputSystem_Actionsの設定を、スクリプトから簡単に使えるようにします。
- ProjectウィンドウでInputSystem_Actionsを1回クリックして選択
- InspectorのGenerate C# Classにチェックを入れる
- Applyを押す
- Assetsの中にInputSystem_Actions.csというスクリプトが自動で作られる
これで、スクリプトからInputSystem_Actionsという名前で入力を扱えるようになりました。
入力を受け取るスクリプト
基本の形
using UnityEngine;
public class InputExample : MonoBehaviour
{
private InputSystem_Actions inputActions;
void Awake()
{
// 入力の設定を使う準備
inputActions = new InputSystem_Actions();
}
void OnEnable()
{
// 入力の受付を開始
inputActions.Enable();
}
void OnDisable()
{
// 入力の受付を終了
inputActions.Disable();
}
void Update()
{
// 移動の入力(-1〜1の2つの数字)
Vector2 move = inputActions.Player.Move.ReadValue<Vector2>();
if (move != Vector2.zero)
{
Debug.Log("移動の入力: " + move);
}
// ジャンプのボタンが押された瞬間
if (inputActions.Player.Jump.WasPressedThisFrame())
{
Debug.Log("ジャンプ!");
}
// ダッシュのボタンが押されている間
if (inputActions.Player.Sprint.IsPressed())
{
Debug.Log("ダッシュ中");
}
}
}
空のゲームオブジェクトにアタッチして再生し、WASDやSpace、左Shiftを押してConsoleを確認してみましょう。
書き方のポイント
- Awake
new InputSystem_Actions()で、入力の設定を使う準備をする- AwakeはStartよりも前に1回呼ばれるメソッドです(6-9の記事で説明します)
- OnEnable / OnDisable
- オブジェクトが有効になったとき・無効になったときにUnityが呼んでくれるメソッド
Enable()で入力の受付を始め、Disable()で終わる。Enableを忘れると入力が一切来ません
- 移動の入力:
ReadValue<Vector2>()- 横(x)と縦(y)の2つの数字で返ってくる
- 右を押すと(1, 0)、上を押すと(0, 1)、何も押していないと(0, 0)
- ボタンの入力
| 書き方 | trueになるとき |
|---|---|
WasPressedThisFrame() | 押した瞬間(1回だけ) |
IsPressed() | 押している間ずっと |
WasReleasedThisFrame() | 離した瞬間(1回だけ) |



ジャンプのように「1回だけ」反応してほしいものはWasPressedThisFrame、ダッシュのように「押している間」はIsPressedを使い分けてね
実際に動かしてみる
移動の入力を使って、オブジェクトを動かしてみましょう。Updateの最後に次の2行を足します。
// 入力の方向に動かす(詳しくは6-8の記事で説明します)
Vector3 direction = new Vector3(move.x, move.y, 0f);
transform.position += direction * 5f * Time.deltaTime;
Cubeにアタッチして再生すると、WASDでCubeが上下左右に動きます。
もっと手軽に:キーを直接調べる
アクションを作るほどでもない、ちょっとしたテストをしたいときは、キーボードを直接調べる方法もあります。
using UnityEngine;
using UnityEngine.InputSystem;
public class KeyboardCheck : MonoBehaviour
{
void Update()
{
// キーボードがつながっていないときはnullになるので確認する
if (Keyboard.current == null)
{
return;
}
if (Keyboard.current.rKey.wasPressedThisFrame)
{
Debug.Log("Rキーが押された!");
}
}
}
using UnityEngine.InputSystem;が必要です- ゲームパッドやキー設定の変更には対応しにくいので、ゲームの操作にはInputSystem_Actionsを使うのがオススメです
注意点やヒント
Generate C# Classは最初に1回だけ
一度作れば、あとはInputSystem_Actionsの設定を変えてSaveするたびに、InputSystem_Actions.csも自動で更新されます。
アクションの設定を変えたらSave Asset
設定ウィンドウでキーの割り当てを変えたら、ウィンドウ上部のSave Assetを押して保存します(Auto-SaveにチェックがあるとSave不要)。
よくあるエラーと対処法
エラー:The type or namespace name ‘InputSystem_Actions’ could not be found
- 原因:Generate C# Classをしていない
- 対処法:InputSystem_Actionsを選んで、Generate C# Classにチェックを入れてApplyする
エラー:InvalidOperationException: You are trying to read Input using the UnityEngine.Input class…
- 原因:古い
Input.GetKey()やInput.GetAxis()を使っている - 対処法:この記事の書き方(InputSystem_Actions)に書き換える
エラー:入力しても何も反応しない
- 原因:
inputActions.Enable()を呼んでいない。またはゲームビューにフォーカスが当たっていない - 対処法:OnEnableでEnable()しているか確認する。再生したら一度ゲームビューをクリックしてからキーを押す
エラー:Keyboard.currentでNullReferenceException
- 原因:キーボードがつながっていない環境で、nullのまま使った
- 対処法:
if (Keyboard.current == null) return;のように、先に確認する
まとめ
- Unity6の入力はInput System。古い
Input.GetKey()はエラーになる - 入力の設定はInputSystem_Actions。Move・Jump・Sprintなどが最初から入っている
- Generate C# Classで、スクリプトから
InputSystem_Actionsとして使える new→Enable()→ReadValue/WasPressedThisFrame/IsPressedの流れで入力を受け取る



最初の準備が多くて、覚えられない・・・



この形はこれからずっと使うから、コピーして使い回せばOK!何回も書いているうちに覚えちゃうよ
次のステップ
入力が受け取れるようになったので、次はその入力でオブジェクトを思い通りに動かす方法を学びましょう:
コメント
コメント一覧 (2件)
[…] Input Systemで入力を受け取ろう […]
[…] Input Systemで入力を受け取ろう […]