[Unity6] Input Systemを使ったキャラクター移動処理の実装
Unityの学習目的に下記の動画を参考に2Dシューティングゲームを制作しています。
動画内でInputSystemという機能が出てきたので、InputSystemが何なのか調べつつ、キャラクターの移動処理の実装方法を記載していきたいと思います。
バージョン情報
- Unity: 6.2(6000.2.10f1)
- inputSystem: 1.14.2
InputSystemとは
Input System は、キーボード・マウス・ゲームパッド・タッチ操作など、さまざまなデバイスからの入力を扱うための入力フレームワークです。
InputSystemが登場する前は様々なデバイスの入力に対して、処理を記載する必要があったのですが、inputSystemのおかげで処理を統一することができました。
InputSystemのメリット
InputSystemのメリットには下記があると思います。
- 複数デバイスに簡単に対応できる
- アクションベースで分かりやすい入力設計
- 入力設定の変更が容易
1については前述の通り、キーボード、マウス、パッドなど複数デバイスの入力を扱う際に、各々処理を書かなくて済むようになります。
2について、InputSystemは下図のようにMove, Lookなどの意味として入力を定義できます。
旧来の手法では、Input.GetKey(KeyCode.Space)のようにスペースキーが押されたらこういう行動をすると定義する必要がありました。
InputSystemでは、OnMoveのような関数でアクションが起きたらこういう処理をすると定義できるようになりました。

3について、キー配置や操作デバイスの変更を コードを書き換えずに行える 点が大きなメリットです。旧手法では、ジャンプをスペースキーからWに変更する場合、スクリプト内のInput.GetKey(KeyCode.Space)を修正する必要がありましたが、新InputSystemでは変更する必要がありません。
Input Actionsの設定
下図のInput Action Assetでキーボードやパッドの入力をどの操作に割り当てるか定義することができます。

Input Action Assetを開くと下図のような画面になっています。

例えば、キーボードの Wキーは「上に移動する操作」 として Move の中に設定されています。そのため、Wキーを押すと「移動(Move)」の入力が行われたと判断され、スクリプト内の移動処理が実行されます。
Inputコンポーネントの設定
次に、Inputコンポーネントをオブジェクトにアタッチすることで、そのオブジェクトはどの入力ルールで操作するかを決めます。
今回はPlayerにPlayer Inputをアタッチしています。

処理の流れはざっくり以下です。PlayerInputコンポーネントはInput Action Assetとスクリプトの橋渡しをしています。
キーボード/パッド等の入力
↓
Input Action Asset(Move など)
↓
PlayerInput コンポーネント
↓
Playerスクリプトの OnMoveなど
Inputコンポーネントの主な設定項目は以下の通り
-
Actions: Input Action Assetを指定
- Default Scheme: キーボードマウス、ゲームパッドなどを操作デバイスを指定
- Auto-Switch: 操作デバイスを自動で切り替えるかどうか。ONの場合はキーボードを触ったらキーボード操作、ゲームパッド触ったらゲームパッド操作に切り替わる
- Default Map: どの操作グループを使うか指定。Input Action Assetの中ではPlayer, UIなどグループが分かれているのでどれを使うか指定
- UI Input Module: UI(ボタンやメニュー)を操作するための入力設定。決定、キャンセルなどに使われる。キャラクター操作するだけならいったん空欄でOK
-
Camera: プレイヤーに関連付けられている個別のカメラ。画面分割設定を使用する場合にのみ必要
-
Behavior: 入力が来た時に、どうやってスクリプトを呼ぶか決めます。
-
Send Messages: Unityが名前の一致するメソッドを自動で呼ぶ(ex: Moveに対してOnMoveなどが自動で呼ばれる)
-
Invoke Unity Events: 入力が来た時に設定したメソッドが呼ばれる。Player InputコンポーネントのEventsでどのアクションに対してスクリプト内のどのメソッドを呼ぶか定義できる
-
C# Events: 入力イベントをコードで直接受け取り処理を書く方式
-
Broadcast Message: 入力が来ている時、アタッチしたオブジェクトだけでなく、その子オブジェクトにアタッチしているスクリプトの処理も発火する
-
Scriptの実装
PlayerInputからの入力は下記スクリプトで処理をしています。
void Update()
{
_Move();
}
private void _Move()
{
rb.linearVelocity = _inputVelocity * _speed;
}
public void OnMove(InputAction.CallbackContext context)
{
_inputVelocity = context.ReadValue<Vector2>();
}
例えば、キーボードのWを押された時、以下の流れで処理が実行されます
・OnMove メソッドが呼ばれる
・context.ReadValue<Vector2>()で上方向の入力(0,1)が取得され、_inputVelocityに格納
・毎フレームの処理で_Moveが発火しており、_inputVelocity * _speedが計算される
・オブジェクトのrb.linearVelocityが更新される
まとめ
今回はInputSystemを用いて移動処理を実装するまでの一連の流れを書きました。InputSystemを理解するまでは難しそうに見える機能ですが、一度理解すると使いやすいシステムだなと思いました。また、移動処理がスクリプトで数行で実装できるので、とても便利な機能だなと思いました。
Discussion