なぜUnityはInput ManagerからInput Systemへ移行したのか? ― 入力処理の進化から学ぶプログラム設計
Unity 6でゲームを制作していると、Input Systemという機能が登場します。
ところが、少し古いUnityの教材やインターネットの記事を調べると、次のようなコードが出てきます。
if (Input.GetKey(KeyCode.Space))
{
Debug.Log("スペースキーが押されています");
}
たった数行でキーボードの入力を調べられます。
一方、新しいInput Systemでは、Input Actionsアセットを作成したり、ActionやBindingを設定したりする必要があります。
ここで疑問が生まれます。
「昔の方法のほうが簡単なのに、なぜUnityは新しい仕組みに変えたのだろう?」
実は、この変更にはゲーム開発の進化と、プログラムの設計に関する重要な考え方が関係しています。
この記事では、その理由を順番に考えていきましょう。
- 対象読者:Unity 6・C#を学習している初心者
- 学習時間:約10〜15分
- 前提知識:Update()、if文、メソッドの基本
1. 昔のUnityは、入力の仕組みがシンプルだった
従来のUnityでは、Input Managerと呼ばれる仕組みが使われていました。
例えば、Wキーを押すとキャラクターが前進するプログラムは、次のように記述できます。
using UnityEngine;
public class PlayerMove : MonoBehaviour
{
public float speed = 5f;
void Update()
{
if (Input.GetKey(KeyCode.W))
{
transform.position +=
Vector3.forward * speed * Time.deltaTime;
}
}
}
このコードの意味は単純です。
- 毎フレーム、Wキーが押されているか調べる。
- 押されていたらキャラクターを前進させる。
初心者にとって理解しやすい方法です。
なお、旧Input ManagerにもInput.GetAxis(“Horizontal")など、キーと操作をある程度分離する機能はありました。旧方式が単純に「キーを直接指定するだけの仕組み」だったわけではありません。
それでも、デバイスの追加や入力設定の柔軟性には限界がありました。
2. ゲームを操作する機器が増えてきた
かつてPCゲームの主な操作機器は、キーボードとマウスでした。
しかし、現在のゲームはさまざまな機器で操作します。
- PC:キーボードとマウス
- 家庭用ゲーム機:ゲームパッド
- スマートフォン:タッチ操作
- VRゲーム:専用コントローラー
例えば、キャラクターをジャンプさせる操作を考えてみましょう。
PCならスペースキー、ゲームパッドなら特定のボタン、スマートフォンなら画面上のジャンプボタンを使うかもしれません。
ところが、どの機器を使っても、ゲーム内で起こることは同じです。
「キャラクターがジャンプする」
つまり、操作する機器は違っても、プレイヤーが実行したい行動は共通しています。この違いに注目してください。
3. 新しいInput Systemは「キー」より「行動」を重視する
新しいInput Systemの中心にある考え方が、Action(アクション)です。
Actionとは、プレイヤーがゲーム内で行いたい操作を表したものです。例えば次のようなActionを作成します。
| Action名 | 意味 |
|---|---|
| Move | キャラクターを移動する |
| Jump | ジャンプする |
| Fire | 弾を発射する |
| Look | 視点を動かす |
そして、それぞれのActionに対して、実際のキーやボタンを割り当てます。この割り当てをBinding(バインディング)と呼びます。
例えば、Jumpアクションに次のBindingを設定できます。
| 操作機器 | 割り当て |
|---|---|
| キーボード | Spaceキー |
| ゲームパッド | Southボタン |
| 別のキーボード設定 | Jキー |
どのボタンを押しても、同じJumpアクションとして処理する設計ができます。
ここで重要なのは、プログラム側が「どのキーが押されたか」を直接意識しなくてもよいことです。プログラムは「ジャンプの指示が来た」ということだけを受け取れます。
この考え方を、入力する機器とゲーム内の処理を分離する設計といいます。
4. 実際のプログラムで比較してみよう
今度はジャンプ処理を比較してみます。
旧Input Managerの場合
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
Jump();
}
}
void Jump()
{
Debug.Log("ジャンプ!");
}
このプログラムでは、Spaceキーが押された瞬間にJumpメソッドを呼び出しています。分かりやすい反面、この書き方ではSpaceキーという具体的な入力方法がコードに含まれています。
新Input Systemの場合
Input ActionsにJumpアクションを作成し、Player Inputからイベントを受け取る方式では、次のように書けます。
using UnityEngine;
using UnityEngine.InputSystem;
public class PlayerJump : MonoBehaviour
{
public void OnJump(InputAction.CallbackContext context)
{
if (context.performed)
{
Jump();
}
}
void Jump()
{
Debug.Log("ジャンプ!");
}
}
この例では、Player InputのBehaviorをInvoke Unity Eventsに設定し、JumpイベントにOnJumpメソッドを登録する必要があります。
注目してほしいのは、コードの中にKeyCode.Spaceが登場していないことです。どのボタンをジャンプに使うかは、Input ActionsのBindingで設定します。
そのため、キー割り当てを変えても、ジャンプする処理自体は変更せずに済みます。これは小さな違いに見えるかもしれませんが、大規模なゲームでは重要な設計です。
5. 新Input Systemにはほかにも利点がある
① キーの割り当てを変更しやすい
ゲームには、プレイヤーが操作キーを変更できるものがあります。例えば、ジャンプをSpaceキーからJキーに変えたい場合です。
Input SystemではBindingの変更機能を利用できるため、ゲームの設定画面からキーを変更する仕組みを作れます。
② 複数のプレイヤーに対応しやすい
2人で遊ぶゲームでは、プレイヤーごとに異なるコントローラーを使うことがあります。
Input SystemにはPlayerInputやPlayerInputManagerなど、プレイヤーと入力デバイスを管理する仕組みが用意されています。
③ 入力をイベントとして受け取れる
旧方式では、Update()の中で入力状態を確認する書き方がよく使われます。新方式では、Actionのstarted、performed、canceledといった通知を利用できます。
一方で、新Input Systemでも毎フレーム入力状態を調べることは可能です。つまり、入力処理の方法を目的に応じて選べます。
6. それなら、なぜ最初から新Input Systemを使わなかったのか?
技術は、その時代の要求に応じて発展します。
昔のUnityでは、現在ほど多様な入力デバイスや複雑な操作設定への対応が求められていたわけではありません。従来のInput Managerにも合理的な設計上の理由がありました。
しかし、Unityが利用される機器やゲームの種類が増えるにつれて、より柔軟な入力処理が必要になりました。そこでInput Systemパッケージが開発され、現在ではUnityが推奨する入力方式になっています。
これは、古い技術が最初から間違っていたという意味ではありません。ゲーム開発に求められるものが変化したため、設計も変化したということです。
7. なぜ新Input Systemは難しく感じるのか?
初心者にとって、新Input Systemは設定項目が多く、複雑に見えると思います。例えば、
- Input Actions
- Action Map
- Action
- Binding
- Player Input
- CallbackContext
といった新しい用語を理解する必要があります。しかし、これらはゲームの操作を柔軟に変更・拡張できるようにするための仕組みです。
特に最初は、次の3つの関係を覚えておきましょう。
| 用語 | 役割 | 例 |
|---|---|---|
| Action Map | Actionをまとめるグループ | Player |
| Action | 実行したい操作 | Move |
| Binding | 操作を発生させる入力 | WASD |
「Playerという操作グループの中にMoveという行動があり、その行動をWASDで実行する」
このように考えると、Input Actionsの設定画面が少し理解しやすくなります。
8. Input Systemから学べる大切なプログラム設計
ここまでの話で最も重要なのは、Input Systemの設定方法そのものではありません。
「変わりやすい部分と、変わりにくい部分を分ける」
というプログラム設計の考え方です。例えばジャンプ機能なら、
- 変わりやすい部分:どのキーやボタンでジャンプするか
- 変わりにくい部分:ジャンプしたときにキャラクターがどう動くか
という違いがあります。この2つを分離すると、操作方法を変更してもジャンプ処理はそのまま利用できます。
こうした設計は、Unityに限らず、さまざまなソフトウェア開発で役立ちます。
9. 確認問題
最後に、次の3つを考えてみてください。
問題1:JumpアクションをSpaceキーだけでなくゲームパッドのボタンでも実行したい場合、主に変更・追加するのはActionとBindingのどちらでしょうか?
問題2:なぜInput Systemでは、プログラム中に具体的なキーの名前を書かずに処理できるのでしょうか?
問題3:Input Systemの設計は、大きなゲームを作るときにどのようなメリットがあるでしょうか?
解答例
問題1:Binding。既存のJumpアクションに、ゲームパッドのボタンを割り当てます。
問題2:Actionが、物理的な入力機器とゲームの処理の間に入るためです。
問題3:操作機器の変更や追加がしやすく、入力の設定とゲームの処理を分けて管理できることです。
まとめ
UnityがInput ManagerからInput Systemへ移行したのは、単に新しい入力方式を作りたかったからではありません。ゲームを操作する機器が増え、さまざまな環境に対応するため、より柔軟な仕組みが必要になったからです。
そして、その中心にあるのがActionとBindingの分離です。
従来のInput Managerは、学習しやすくシンプルな仕組みでした。新Input Systemは、設定する内容が増える代わりに、操作方法の変更や複数の入力機器への対応がしやすくなっています。
Unityの学習では、機能の使い方を覚えることも大切です。しかし、もう一歩進んで、「なぜ、このような仕組みになっているのだろう?」と考えることが、プログラムの設計を理解する第一歩になります。
参考資料(Unity公式)
- Unity Manual — Legacy input
- Input System — Actions
- Input System — Input Binding
- Input System — クイックスタートガイド
※Input Systemの詳細な画面表記は、使用するパッケージのバージョンによって異なる場合があります。










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