

Unityの新しいInput Systemを初めて使おうとしているんだけど、使い方が分からないの。


軽く動かしてみるところまで一緒にやっていくね。
Unity公式の新しい入力システムパッケージInput Systemの入門者向け記事です。
本記事では、Input Systemパッケージのインストール方法から、最低限使えるようにするところまでを解説します。
- Input Systemを初めて使う、または理解に不安がある方
- Unityの基本操作を理解している方
- 基本的なC#スクリプトが書ける方
- Unity 2021.2.3f1
- Input System1.1.1
Input Systemとは
従来の入力システムに代わる新しい入力システムです。
次のような特徴があります。
- あらゆる入力デバイスに対応している
- 旧来に比べてより強力で柔軟な設計
- キーコンフィグ機能が実現できる
- 入力状態の更新をFixedUpdateやその他任意のタイミングで実行できる
参考:Input System | Input System | 1.1.1
従来の入力システムは手軽に使えるメリットがありますが、新しい入力システムは従来の問題点を改善してくれているといったメリットがあります。
Input Systemのインストール
新しいInput Systemは、Unityパッケージとして配布されています。Package Managerよりインストールします。
UnityメニューのWindow > Package Managerを選択し、Package Managerウィンドウを開きます。

ウィンドウが開いたら、左上タブよりPackages: ~ボタンをクリックし、Unity Registryを選択します。

左のリストより、Input Systemを選択し、右下のInstallボタンをクリックします。

すると、Input Systemのインストールが開始されるので完了まで待機します。
インストールが完了すると、次のWarningウィンドウが表示されることがあります。これは、旧型式のInput Managerを無効化して新しいInput Systemを有効かするかどうかを尋ねる内容です。

ここからは、旧Input Managerを併用する場合としない場合で手順が異なります。該当する手順のどちらかを実施してください。
1.Input Managerを併用しない場合
そのままYesボタンをクリックしてInput Systemを有効化して再起動します。

Unityが再起動したらInput Systemパッケージのインストールは完了です。
2.Input Managerを併用する場合
Noボタンをクリックしてウィンドウを閉じます。

UnityメニューのEdit > Project Settings…を選択し、Project Settingsウィンドウを開きます。

左のリストからPlayerを選択し、Other Settings > Configuration > Active Input Handling*項目をBothに設定します。

すると、確認メッセージが表示されるため、ApplyボタンをクリックしてUnityを再起動します。

Unityが再起動したらInput Systemパッケージのインストールは完了です。
Input System Package (New)は、従来の入力システムを無効化し、新しい入力システムを有効化する設定です。Bothは従来と新しい入力システム両方を有効化して使えるようにする設定です。この設定は、Active Input Handling*項目からいつでも変更可能です。
キーボード入力を取得する最小限のコード
まず、Input Systemを使用してキーボード入力を取得する最小限のサンプルスクリプトを紹介します。
キーボードのAキーが押されているかどうかを判定する例です。
using UnityEngine;
using UnityEngine.InputSystem;
public class CheckKeyboard : MonoBehaviour
{
private void Update()
{
// 現在のキーボード情報
var current = Keyboard.current;
// キーボード接続チェック
if (current == null)
{
// キーボードが接続されていないと
// Keyboard.currentがnullになる
return;
}
// Aキーの入力状態取得
var aKey = current.aKey;
// Aキーが押された瞬間かどうか
if (aKey.wasPressedThisFrame)
{
Debug.Log("Aキーが押された!");
}
// Aキーが離された瞬間かどうか
if (aKey.wasReleasedThisFrame)
{
Debug.Log("Aキーが離された!");
}
// Aキーが押されているかどうか
if (aKey.isPressed)
{
Debug.Log("Aキーが押されている!");
}
}
}
上記スクリプトをCheckKeyboard.csとしてUnityプロジェクトに保存し、適当なゲームオブジェクトにアタッチします。
実行結果
ゲームを実行すると、Aキーの押下状態がログ出力されます。

スクリプトの解説
Input System関連のAPIはUnityEngine.InputSystem名前空間に定義されています。
using UnityEngine.InputSystem;
キーボード情報はKeyboard.currentプロパティから参照します。
// 現在のキーボード情報
var current = Keyboard.current;
参考:Class Keyboard | Input System | 1.2.0
ただし、キーボードが接続されていない場合は上記がnullになるため、以下でnullチェックを行っています。
// キーボード接続チェック
if (current == null)
{
// キーボードが接続されていないと
// Keyboard.currentがnullになる
return;
}
キーボードのAキーの情報は次のコードで取得します。
// Aキーの入力状態取得
var aKey = current.aKey;
次のコードでも取得可能です。
var aKey = current[Key.A];
変数aKeyはKeyControl型のインスタンスで、ここからキー入力状態を取得できます。
参考:Class KeyControl | Input System | 1.2.0
その他のキーの取得も同じような流れで行えます。詳細は公式リファレンスをご確認ください。
参考:Class Keyboard | Input System | 1.2.0
キーが押された瞬間かどうかはwasPressedThisFrame、離された瞬間かどうかはwasReleasedThisFrame、単に押されているかどうかの状態はisPressedプロパティから取得できます。
// Aキーが押された瞬間かどうか
if (aKey.wasPressedThisFrame)
{
Debug.Log("Aキーが押された!");
}
// Aキーが離された瞬間かどうか
if (aKey.wasReleasedThisFrame)
{
Debug.Log("Aキーが離された!");
}
// Aキーが押されているかどうか
if (aKey.isPressed)
{
Debug.Log("Aキーが押されている!");
}
これらのプロパティは、従来の入力システム(Inputクラス)の以下メソッドと対応しています。
従来の入力システム(Inputクラス) | 新しい入力システム(Input System) |
Input.GetKeyDown() | wasPressedThisFrame |
Input.GetKeyUp() | wasReleasedThisFrame |
Input.GetKey() | isPressed |
マウス入力を取得する最小限のコード
マウスのボタンとカーソル位置を取得してログ出力する例です。
using UnityEngine;
using UnityEngine.InputSystem;
public class CheckMouse : MonoBehaviour
{
private void Update()
{
// 現在のマウス情報
var current = Mouse.current;
// マウス接続チェック
if (current == null)
{
// マウスが接続されていないと
// Mouse.currentがnullになる
return;
}
// マウスカーソル位置取得
var cursorPosition = current.position.ReadValue();
// 左ボタンの入力状態取得
var leftButton = current.leftButton;
// 左ボタンが押された瞬間かどうか
if (leftButton.wasPressedThisFrame)
{
Debug.Log($"左ボタンが押された! {cursorPosition}");
}
// 左ボタンが離された瞬間かどうか
if (leftButton.wasReleasedThisFrame)
{
Debug.Log($"左ボタンが離された!{cursorPosition}");
}
// 左ボタンが押されているかどうか
if (leftButton.isPressed)
{
Debug.Log($"左ボタンが押されている!{cursorPosition}");
}
}
}
上記スクリプトをCheckMouse.csという名前でUnityプロジェクトに保存し、適当なゲームオブジェクトにアタッチすると動作するようになります。
実行結果
左ボタンがクリックされたら、カーソル座標と共にメッセージ出力されます。
スクリプトの解説
マウス情報は、Mouse.currentプロパティから参照します。
// 現在のマウス情報
var current = Mouse.current;
参考:Class Mouse | Input System | 1.2.0
マウス情報もキーボード同様、接続されていないとnullになるため、nullチェックを行います。
// マウス接続チェック
if (current == null)
{
// マウスが接続されていないと
// Mouse.currentがnullになる
return;
}
マウスカーソルの位置は、以下のReadValue()メソッドからスクリーン座標として取得できます。戻り値はVector2型です。
// マウスカーソル位置取得
var cursorPosition = current.position.ReadValue();
参考:Class Pointer | Input System | 1.2.0
マウスのボタンクリックの取得方法は、キーボードと同じです。以下はマウスの左ボタンの入力状態を取得する処理です。
// 左ボタンが押された瞬間かどうか
if (leftButton.wasPressedThisFrame)
{
Debug.Log($"左ボタンが押された! {cursorPosition}");
}
// 左ボタンが離された瞬間かどうか
if (leftButton.wasReleasedThisFrame)
{
Debug.Log($"左ボタンが離された!{cursorPosition}");
}
// 左ボタンが押されているかどうか
if (leftButton.isPressed)
{
Debug.Log($"左ボタンが押されている!{cursorPosition}");
}
ほかのボタン入力も同様に取得できます。詳細を知りたい方は以下リファレンスをご覧ください。
参考:Class Mouse | Input System | 1.2.0
さいごに
新しいInput Systemのインストールから最低限使えるようにするところまでを解説しました。
本記事で解説した方法は、直接キーボードやマウスの入力デバイスAPIを参照する方法のため、手軽に使える反面、様々な入力に対応できないといった問題があります。
この問題はInput Actionを用いることで解決できます。Input Actionの使い方については以下記事をご覧ください。