【Unity】InvalidOperationException: You are trying to read Input… の解決方法2選【新Input Systemエラー】

Unity

Unityでゲームを開発中、スクリプトを実行したら突然以下のようなエラーが出て動かなくなってしまったことはありませんか?

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の古い入力方式(Input Manager)と、新しい入力方式(Input System)の設定が衝突していることが原因です。

この記事では、エラーの原因と、「設定を変えて今すぐ直す方法(1分)」、「新しいInput Systemのコードに書き換える方法」の2つの解決策を分かりやすく解説します!

1. エラーが発生する原因とは?

Unityには、従来からある入力方式(Input.GetAxis などを使う Input Manager)と、新しく導入された高機能な入力方式(Input System パッケージ)の2種類が存在します。

プロジェクトの設定(Player Settings)で「新しい Input System を使う」となっているにもかかわらず、スクリプト内で Input.GetAxis("Horizontal") などの古いコードを呼び出すと、今回のような「古いInputは使えません!」というエラー(InvalidOperationException)が発生します。

解決策は、あなたのプロジェクト方針に合わせて以下の2つのどちらかを選べばOKです。

2. 【解決策A】設定を変更して古いコードのまま動かす(一番簡単!)

「新方式の勉強は後にして、とりあえず今のコード(Input.GetAxis等)のままエラーを消したい!」という場合は、Unityの設定を変更するのが一番早いです。

修正手順

  1. Unityエディタの上部メニューから Edit > Project Settings を開きます。
  2. 左側のメニューから Player を選択します。
  3. Other Settings(その他の設定)をクリックして展開します。
  4. 下へスクロールし、Configuration セクション内にある Active Input Handling という項目を探します。
  5. 設定値が Input System Package (New) になっていると思うので、これを Both(または Input Manager (Old))に変更します。
  6. Unityの再起動を促すポップアップが出るので、Apply(適用)を押してUnityを再起動します。

これだけで、古いコードがそのまま動くようになり、エラーは綺麗に消え去ります! ※ Both にしておくと、新・旧どちらの入力方式も同時に使えるようになるため一番おすすめです。

3. 【解決策B】スクリプトを「新Input System」のコードに書き換える

「せっかくだから、このまま最新の Input System パッケージを使って開発を進めたい!」という場合は、スクリプトの書き方を新しい方式に変更します。

コードの書き換え例

例えば、キーボードの左右入力やスペースキーでのジャンプ判定を行う場合、以下のように書き換えます。

❌ エラーが出る古い書き方(Input Manager)

C#

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    void Update()
    {
        // これらがエラーの原因になります
        float move = Input.GetAxis("Horizontal");
        if (Input.GetKeyDown(KeyCode.Space)) 
        {
            // ジャンプ処理
        }
    }
}

⭕ エラーが消える新しい書き方(Input System簡易版)

コードの最上部に using UnityEngine.InputSystem; を追加するのがポイントです。

C#

using UnityEngine;
using UnityEngine.InputSystem; // ← これを必ず追加!

public class PlayerController : MonoBehaviour
{
    void Update()
    {
        // 新しいInput Systemのキーボード判定に変える
        float move = 0f;
        if (Keyboard.current.dKey.isPressed) move = 1f;
        if (Keyboard.current.aKey.isPressed) move = -1f;

        // スペースキーが押された瞬間
        if (Keyboard.current.spaceKey.wasPressedThisFrame) 
        {
            // ジャンプ処理
            Debug.Log("ジャンプ!");
        }
    }
}

これで古いクラスを通さずに新しいパッケージから直接入力を取得するため、設定を変えなくてもエラーが解消されます。

4. さらに本格的なゲーム開発を目指すなら「Input Action」

今回は簡易的に Keyboard.current を使う方法を紹介しましたが、Input Systemパッケージの真価は「Input Action」アセット「Player Input」コンポーネントを組み合わせたデータ駆動型の設計にあります。

この方法を使うと:

  • キーボードだけでなく、SwitchやPS5などのコントローラー(ゲームパッド)に一瞬で両対応できる
  • キーコンフィグ(ボタン配置変更機能)の実装が劇的にラクになる

といった強力なメリットがあります。プロジェクトが大きくなってきたら、ぜひ「Input Action」を使った本格的な実装にもチャレンジしてみてください!

まとめ:エラーを消して開発を楽しもう!

Unityの InvalidOperationException: You are trying to read Input... エラーが出たときの対処法をまとめます。

  • 手っ取り早く直したいなら: Project Settings の Active Input HandlingBoth に変更する。
  • 最新環境に合わせたいなら: スクリプトに using UnityEngine.InputSystem; を追加し、新方式のコードに書き換える。

エラーは開発が前進している証拠です。サクッと解決して、続きのゲーム制作を楽しみましょう!

コメント

タイトルとURLをコピーしました