Unityの入力の仕組みには、古い Input Manager と、新しい Input System パッケージの2つがあります。
どちらを使うかは、Player 設定の Active Input Handling で切り替えます。
- 場所:Edit → Project Settings → Player → Other Settings → Active Input Handling
- 選択肢:Input Manager (Old)/Input System Package (New)/Both
- 変えたらエディタの再起動が必要
- 新しい方だけにしたまま Input.GetKey などを使うと InvalidOperationException が出る
この記事は、Unity公式マニュアル(Unity 6.3)と Input System パッケージの公式ドキュメント(2026年9月29日に確認)にもとづいています。
設定の説明は公式資料を参照しています。
旧Input.GetKeyDownのエラーと、Bothへ変更したあとの動作は、Windows 11・Unity 6.6 (6000.6.5f1)・Input System 1.20.0 で確認しました。
新しいInput System APIへのコードの書き換えと、Androidでの動作は、この実機確認には含めていません。
画面の名前は英語版の表記です。
Active Input Handlingの3つの選択肢
| 選択肢 | 働き | 定義される記号 |
|---|---|---|
| Input Manager (Old) | 古い Input の設定を使う | ENABLE_LEGACY_INPUT_MANAGER |
| Input System Package (New) | 新しい Input System パッケージを使う | ENABLE_INPUT_SYSTEM |
| Both | 両方を使う | 両方 |
Unity 6.3 のマニュアルは、Input System パッケージを新しく柔軟でサポートも手厚いもの、Input Manager を古い(legacy)ものと呼んでいます。
Android の Player 設定のページには、「Both」は Android では使えないと書かれています。
切り替える手順
- 「Edit」→「Project Settings」を開く
- 左の「Player」を選ぶ
- 「Other Settings」の中の「Active Input Handling」を選び直す
- エディタの再起動をうながされたら再起動する
公式ドキュメントは、この設定を変えたら、反映させるにはエディタの再起動が必要だとしています。
パッケージを入れたときに出る確認
Package Manager で Input System パッケージを入れると、新しい入力の仕組みを有効にするかを尋ねる画面が出ます。
「Yes」を選ぶと、新しい方が有効になり、古い方は無効になって、エディタが再起動します。
InvalidOperationExceptionが出るとき
新しい方だけを有効にしたプロジェクトで、古い書き方(UnityEngine.Input)を使うと、次のエラーが出ます。
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.エラー文は Unity公式の不具合報告(Issue Tracker)の題名で確かめたもので、マニュアルには載っていません。
直し方は3つあります。
| 直し方 | 向いているとき |
|---|---|
| コードを Input System の書き方に直す | これからも使い続けるプロジェクト |
| Active Input Handling を Both にする | 古いアセットのコードをすぐには直せないとき(Android では使えない) |
| Active Input Handling を Input Manager (Old) に戻す | 新しい入力の仕組みを使わないとき |
コードの書き換えの例
次は既存のMonoBehaviourのUpdateメソッド内に置く比較用の断片です。
旧方式と新方式のうち、使用する方式のコードだけを残してください。
Jump()は自分で用意するジャンプ処理を表します。
新方式にはInput Systemパッケージの導入と有効化が必要です。
// 旧方式:Updateメソッド内
if (UnityEngine.Input.GetKeyDown(UnityEngine.KeyCode.Space)) { Jump(); }
// 新方式:上の旧方式と置き換えてUpdateメソッド内へ
var keyboard = UnityEngine.InputSystem.Keyboard.current;
if (keyboard != null && keyboard.spaceKey.wasPressedThisFrame) { Jump(); }キーボードがつながっていないと Keyboard.current が null になるので、先に確かめます。
両方のコードを残すとき
設定に合わせてコードを切り替える場合は、Updateメソッド内などで次のように分岐します。
Bothでは最初の分岐が選ばれ、新方式だけで判定します。
新方式を使う利用者にはInput Systemパッケージも必要で、配布時には対応するUnity・パッケージのバージョンを明示してください。
#if ENABLE_INPUT_SYSTEM
var keyboard = UnityEngine.InputSystem.Keyboard.current;
bool jump = keyboard != null && keyboard.spaceKey.wasPressedThisFrame;
#elif ENABLE_LEGACY_INPUT_MANAGER
bool jump = UnityEngine.Input.GetKeyDown(UnityEngine.KeyCode.Space);
#else
bool jump = false;
#endif
// jumpがtrueなら、自分のジャンプ処理を呼ぶ新方式の例でキーが反応しないとき
新方式へ変更した後に例外は消えても入力できない場合は、次の順に確認します。
まず再生中のGameビューをクリックしてから、Spaceキーを押してください。
Input Systemの既定の設定では、Gameビューにフォーカスがないとキーボードやポインターの入力はゲームへ渡りません。
次に、Edit > Project Settings > Input System Packageで、使用できるデバイスを制限していないか確認します。
supportedDevicesが空なら制限はなく、一覧を指定している場合は対象外のデバイスが無視されます。
キーボードを使うプロジェクトで一覧を制限する場合は、Keyboardが含まれるか確かめてください。
最後に、入力を処理するタイミングも確認します。
上のUpdate内の新方式の例は、既定の動的更新を前提としています。
updateModeを固定更新へ変えている場合や、手動更新を採用している場合は、その設計に合わせた入力処理が必要です。
手動更新ではInputSystem.Update()を呼ばないと入力が処理されません。
入力方式を選ぶActive Input Handlingと、これらのInput Systemの動作設定は別の項目です。
根拠:InputSettingsの公式API、Editorの入力フォーカス設定(Input System 1.20.1、2026年10月26日確認)。
この追加手順は公式資料との照合で、新方式へのコード移行や各設定の実機再現は行っていません。
Unity 6000.6.5f1で旧入力APIのエラーを確認
Input Systemを導入済みの検証用プロジェクトで、Cubeに旧入力APIのスクリプトを付けました。
Spaceを押すとY軸に30度回転し、Consoleに入力回数を出すコードです。
設定の変更前後でコードは変更していません。
Active Input HandlingがInput System Package (New)の状態では、Input.GetKeyDown(KeyCode.Space)の呼び出しでInvalidOperationExceptionが出ました。
Gameビューを選んでSpaceを押しても、CubeのRotation Yは0のままでした。


Bothへの変更後、同じSpace入力が動くことを確認
設定場所は「切り替える手順」のとおりです。
旧入力も使う場合の選択肢がBothです。
本検証では画面操作の接続の制約でドロップダウンの選択を確定できなかったため、Editorを閉じ、隔離したテストプロジェクトのProjectSettings.assetでactiveInputHandlerを1から2へ変更して開き直しました。
設定画面で選択を完了した事例ではありません。


再起動後、同じコードのままGameビューでSpaceを1回押すと、Rotation Yが30になり、ConsoleにSpace pressed: 1が出ました。
この入力による例外は0件でした。
シーンを保存してEditorを終了し、同じプロジェクトを開き直した後にも、同じ結果を確認しています。

| 条件 | Space1回の結果 | 例外 |
|---|---|---|
| New、旧Input.GetKeyDown | Rotation Y=0 | InvalidOperationException |
| Both、同じ旧コード | Rotation Y=30、入力ログ1件 | 0件 |
| Both、保存して再オープン | Rotation Y=30、入力ログ1件 | 0件 |
再生中の回転はランタイムの値です。
再生を止めると保存されたRotation Y=0に戻ります。
今回確認したのは、保存後もスクリプトと入力設定が残り、再生し直したときに同じ入力を処理できることです。
Bothで動くことと、新APIへの移行は別の確認
今回の実測はBothで旧APIが動くことを示します。
コードを新しいInput System APIへ書き換えた検証ではなく、旧・新APIを同時に実行した検証でもありません。
再オープン直後のConsoleには旧Input Managerの非推奨警告が1件出ました。
Bothの設定画面にもlegacy機能に関する警告があります。
旧コードの例外が解消したことと、新規プロジェクトで旧APIの採用が推奨されることを混同しないでください。
Android、Old単独、Playerビルドは今回未検証です。
新しいプロジェクトの初期状態
新規プロジェクトの入力設定やInputSystem_Actionsなどの初期アセットは、使用するテンプレートとUnityのバージョンを確認してください。
Input System 1.20の公式資料では、Unity 6.1以降の一部のテンプレートにパッケージが含まれると説明されています。
ただし、新しいプロジェクトで Active Input Handling の初期値がどれになるかは、マニュアルでは確かめられませんでした。
自分のプロジェクトの設定は、上の手順の場所で確かめます。
Unity のバージョンを上げたあとにこのエラーが出たときは、Unityのプロジェクトのバージョンを上げる手順もあわせて見てください。
まとめ
- 入力の仕組みは Player → Other Settings → Active Input Handling で切り替える
- 選択肢は Old・New・Both の3つで、Both は Android では使えない
- 変えたらエディタを再起動する
- New設定で旧入力APIを呼ぶことが原因の例外は、新APIへの移行か、対応環境で旧入力を有効にすることで対処する
参考:Unity 6.3 Android Player settings、Input System 1.20 Installation、Keyboard API(設定とAPIの説明を2026年10月24日に再照合。
実機の再検証は含みません)。
