Input Managerとは?

Input Managerは、プレイヤーの入力を管理するシステムです。

キーボード、マウス、画面のタップ、ゲームコントローラの入力を判定できます。

例えば、Input.GetKey()、Input.GetMouseButtonDown()といったメソッドを使用して入力を判定できます。

現在も使用はできますが、Legacyという扱いになっており、次に紹介するInput Systemの使用が推奨されています。

Input Systemとは?

Input System(Input System Package)が、現在の新しい入力管理システムです。

これまで通り、キーボードやマウスの入力を判定することができますが、

入力を抽象化したレイヤーや関連するアクションをグループ化したりできるようになっています。

Input ManagerとInput Systemの比較

二つの入力システムを比較してみると以下の様になります。

項目Input ManagerInput System
学習コスト低い(簡単なAPI)高い(概念の理解が必要)
記述の簡潔さシンプルで分かりやすいやや複雑だが柔軟
入力精度フレーム依存高精度(フレーム非依存)
将来性Legacy扱い今後推奨される
デバイス対応基本的なデバイス幅広いデバイスに対応
カスタマイズ性限定的高い(アクション、バインディング)
パフォーマンス軽量やや重い(機能が豊富)
推奨用途小規模・プロトタイプ本格的な開発・精度重視

Input Systemのインストール

Unity Editorのメニューから、

Window→Package Managerを選択し、Package Managerを開きます。

Unity Registryを選択し、Input Systemを選択します。

Installボタンを押します。

Input Systemを有効にする

Project Settingsを開きます。

左側からPlayerを選択します。

いずれかのプラットフォームのOther Settingsの中にActive Input Handlingがあるので確認します。

ここで使用する入力管理システムを選択できます。

  • Input Manager(Old)
  • Input System Package(New)
  • Both

Bothの場合は両方を使用できます。

Input System Packageを選択するとEditorが再起動を求めるので再起動しましょう。

これで使用できるようになりました。

Active Input Handlingによる影響

Active Input Handlingの設定により、プロジェクトの動作が大きく変わります。

各設定による具体的な影響を確認しましょう。

Input Manager(Old)を選択した場合

  • 利用可能な機能:従来のInput Managerのみ
  • 既存コードへの影響:Input.GetKey()などの既存コードがそのまま動作
  • 制限事項:Input Systemの機能(Keyboard.currentなど)は利用不可
  • 推奨される場面:既存プロジェクトでInput Systemへの移行予定がない場合

Input System Package(New)を選択した場合

  • 利用可能な機能:新しいInput Systemのみ
  • 既存コードへの影響:Input.GetKey()などの既存コードはコンパイルエラーになる
  • Editor再起動:設定変更時に必ずEditor再起動が必要
  • 推奨される場面:新規プロジェクトや完全移行済みプロジェクト

Both を選択した場合

  • 利用可能な機能:両方のシステムが同時に利用可能
  • メリット:段階的な移行が可能、既存コードを残しながら新機能を試せる
  • デメリット:わずかなパフォーマンス低下、メモリ使用量の増加
  • 注意点:同じ入力に対して両システムが反応する可能性がある
  • 推奨される場面:移行期間中の一時的な設定

設定変更時の注意事項

  • コード修正の必要性:OldからNewへの変更時は、全ての入力関連コードの書き換えが必要
  • ビルド設定:各プラットフォームで個別に設定が必要
  • チーム開発:チームメンバー全員が同じ設定にする必要がある
  • バックアップ:設定変更前は必ずプロジェクトのバックアップを取る

キーボードの入力

キーが押された

押された瞬間を判定するには以下の様に記述します。

// 旧InputManager
if (Input.GetKeyDown(KeyCode.Space))
{
}

// 新InputSystem
if (Keyboard.current[Key.Space].wasPressedThisFrame)
{
}

Keyboard.currentで現在使用しているキーボードを取得し、特定のキーの状態を確認できます。

キーの状態は以下のプロパティで確認できます。

  • 押された wasPressedThisFrame
  • 押されている isPressed
  • 離された wasReleasedThisFrame

マウスの入力

ボタンが押された

マウスのボタンが押された瞬間を判定するには以下の様に記述します。

キーボード同様、押された、押されている、離された状態を判定できます。

// 旧InputManager
if (Input.GetMouseButtonDown(0))
{
}

// 新InputSystem
if (Mouse.current.leftButton.wasPressedThisFrame)
{
}

マウスカーソルの座標を取得する

マウスカーソルの座標を取得するには以下の様に記述します。

// 旧InputManager
var position = Input.mousePosition;

// 新InputSystem
var position = Mouse.current.position.ReadValue();

精度の違い

タイミング

Input Managerはフレーム単位でしか判定できません。

60FPSなら1秒間に60回しか判定できないことになります。

Input Systemはフレームレートに依存しない正確なタイミングで判定できます。

例えばUpdate()メソッドで入力判定をしている場合、処理落ちなどで取りこぼす可能性がありましたが、

Input Systemでは正確に判定できるようになります。

アナログ入力

Input Systemでは、より高精度なアナログ値が取得できます。

デッドゾーンを細かく調整したり、単純な線形補間にならないように補正することもできます。

あわせて読みたい

まとめ

今回は、Input ManagerとInput System、二つの入力管理システムを紹介しました。

Input Managerはシンプルな記述で入力を判定できました。

それに慣れているとInput Systemではちょっとだけ面倒に感じるかもしれません。

精度を求められないゲームならInput Managerのままでも大丈夫ですが、

精度が必要な場合は乗り換えるメリットは十分あります。

コマンド入力が必要な格闘ゲームや、タイミングがシビアなリズムゲームなどで役に立つでしょう。

自分のゲームにあった方を選択してください。

次は、Input Systemの機能であるInput Actionsなどについて解説したいと思います。