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でゲーム開発したいけど何から手を付ければ良いのか分からん…あっそうだ!youtubeに転がっている【初心者なら誰にでも作れそうなゲーム】から制作してみよう!的な動画を見て勉強しよう!」…そんな人ではないですか?
私がそうなので分かります。辛いですよねお互いに…がんばりましょうね…。いちもんじはこのやり方でエラーを免れたので大丈夫。

そもそもどういうエラーなの?

結論を要約して言うと「あなたがしようとしているそのプレイヤーを動かす命令文、今のあなたが使ってるバージョンの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.

もっと専門的な言葉で言うとInput SystemのAPIを使用する必要があります~って言ってるらしいんですが、なんだかよく分かりませんね。ひとまず関連してそうなUnity公式様のページを繋いでおきます

じゃあどうすれば良いの?

我々に迫られる選択はたったの2つ

古い命令文にも対応するようにする(非推奨)

1つはプレイヤーの設定を古い命令文のものでも対応するようにすること。しかしこれはこれで後々問題が発生する可能性もあるらしいです。一応AIさんは「両方の入力システムを同時に使用できますが、すべてのプラットフォームでサポートされているわけではないため通常は推奨されません。」と言ってます。ですがまあ一応やり方を書いておくと、

  1. 一番上のメニュー欄からEditを探す →その中からProjectSettingsを開く
  2. メニュー一覧からPlyaer欄を確認する
  3. 下の方に下がり、Active Input Handlingの設定をBothに変える

こうですね。ちなみに冒頭に載せた公式さんのページにもやり方載ってます。まあだけど時代と共に進化していかなければならないのが我々ですからね。なので命令文も進化させていこうじゃないかと奮い立ちました。

新バージョン命令文を使用する

古い命令文を使わず新しいバージョンのUnityに合わせて命令文をアップデートすることによってこのエラーに打ち勝つことができました!いえーい!

とは言っても一体どうやって命令すりゃいいんじゃい!!!って思い旧命令文をまるまるAIさんに放り投げて「(ここに書き換えたい命令文)を新しいAPIにするには?」って聞くだけで答えが貰えるんですねぇ…便利な世の中になったものだな。

①冒頭にusing UnityEngine.InputSystem;

AIさんにぶん投げて命令文を貰ったし完璧ふふんと思ったらまあエラー出ました。とりあえずどんな命令文であろうとも絶対に必要なコードがあるらしく、それをエディタ開いてプログラムを組むその一番上に書く必要があるらしいですよ奥様。こうです。

本当の本当にクラス名よりも上です。こうしないとエラーが出ちゃいました。もう真っ赤な文字がトラウマだ~。下はコピー用です。

using UnityEngine.InputSystem;

②新命令文を書いていく

例えば旧命令文がこれです。↓

if (Input.GetKey(KeyCode.LeftArrow))
         {
                  tikara = new Vector2(Playerspeed * -1, 0);
         }

2Dでゲームを制作しているのですが、内容的には左キーが押されたら左に向かって指定したプレイヤースピードで移動しますよ~ってことです。これを今風に書くとこうなるみたいです。↓

if (Keyboard.current != null && Keyboard.current.leftArrowKey.isPressed)
        {
            tikara = new Vector2(Playerspeed * -1, 0);
        }
命令文の解説
if (Keyboard.current != null && Keyboard.current.leftArrowKey.isPressed)
        {
            tikara = new Vector2(Playerspeed * -1, 0);
        }

まずKeyboard.current != nullですが、これはAIによると

パソコンにキーボードが接続されており、プログラムがそれを正しく認識しているかを確認しています。これがないと、キーボードが未接続の場合にエラー(NullReferenceException)が発生してゲームが止まってしまいます。

とのこと。!=nullというのはnullではないというのが条件なので、もし繋がってなかったらKeyboard.currentの値がnullになるんでしょうね。(想像でしかないけど)

Keyboard.current.leftArrowKey.isPressedについてですが、Keyboard.currentというのが現在PCに接続され、アクティブになっているキーボードのことを指すそうで、leftArrowKey.isPressedはご想像通り左キーが押されている間ずっと、という意味のようです。

以上のことを全部まとめると、if文の内容的にはパソコンにキーボードが接続されており、尚且つ今アクティブになっているキーボードの左キーが押されている間はずっとこの処理を行いますよ、と言う意味になりますね。

tikara = new Vector2(Playerspeed * -1, 0);という内容までは変化がないので、要はInput.GetKeyという命令自体がもう駄目だったんでしょうね…。

というわけで。Unityが時代と共に進化していくなら命令文も進化していきなさいよ、ってわけでございました。フーン…。

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