私がChatGPTなどに質問したことを書いていくブログ

Chat GPTヘビーユーザーの管理人が、日常に役立つことからどうでもいいことまで様々な質問をまとめたブログです。

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. UnityEngine.Internal.InputUnsafeUtility.GetAxis (System.String axisName) (at

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. UnityEngine.Internal.InputUnsafeUtility.GetAxis (System.String axisName) (at <7392f0fe1c014b608788bdeecdaad64d>:0) UnityEngine.Input.GetAxis (System.String axisName) (at <7392f0fe1c014b608788bdeecdaad64d>:0) PaddleController.Update () (at Assets/scripts/PaddleController.cs:16) このエラーの意味は何ですか?
 
ChatGPT:

このエラーの意味を簡潔に説明すると:


⚠️ エラー内容

 
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 Systemを使う設定にしているのに、古いInputのコード(Input.GetAxis()など)を使おうとしているため、エラーが出ているという意味です。


🔍 原因の詳細

Unityでは、以下の2つの入力方式があります:

  1. 旧Input Manager(UnityEngine.Input
     例: Input.GetAxis("Horizontal")

  2. 新Input System(UnityEngine.InputSystem)
     例: Keyboard.current.aKey.isPressed

このエラーは、プロジェクト設定で「Input System」だけを有効にしているのに、コード内で旧式の Input.GetAxis を使っているため、Unityが処理できずクラッシュしているというわけです。


🛠 解決方法(2通り)

方法1:旧式のInputを使いたい場合

  1. Unityエディタのメニューから
     Edit > Project Settings > Player を開く

  2. Other Settings > Active Input Handling
     「Both」または「Input Manager (Old)」 に変更

  3. Unityを再起動

これで、Input.GetAxis()が使えるようになります。


方法2:新Input Systemに対応したコードに書き換える場合

例として、Horizontalの入力を新Input Systemで書くには:

 
using UnityEngine; using UnityEngine.InputSystem; // 新Input System用 public class PaddleController : MonoBehaviour { void Update() { float move = Keyboard.current.leftArrowKey.isPressed ? -1f : Keyboard.current.rightArrowKey.isPressed ? 1f : 0f; // ここで move を使って paddle を動かす } }

📌まとめ

  • エラーの意味: 新旧入力システムの不一致

  • 対処法:

    • 旧式を使う → Project Settingsで「Both」に変更

    • 新式を使う → InputSystemを使ってコードを書き換える


必要であれば、PaddleController.csの該当箇所を書き直すお手伝いもできますよ。

 
あなた:
using UnityEngine; public class PaddleController : MonoBehaviour { public float speed = 10f; private Rigidbody2D rb; void Start() { rb = GetComponent<Rigidbody2D>(); } void Update() { // 水平方向の入力を取得 float inputX = Input.GetAxis("Horizontal"); // パドルを左右に動かす rb.linearVelocity = new Vector2(inputX * speed, 0); } } この内容を入力したらエラーが出ました
 
ChatGPT:

ありがとうございます。あなたの提示されたコードは、Unityの旧Input SystemInput.GetAxis("Horizontal"))を使っていますが、おそらくプロジェクトの設定が「新Input System」になっているため、エラーになっています。


✅ 解決方法は2つあります


✅ 方法1:設定を「Both」にして、今のコードを使えるようにする(最も簡単)

  1. Unityのメニューから
     Edit > Project Settings > Player を開く

  2. Other Settings」タブにある
     Active Input Handling
     👉 Both(または Input Manager (Old))に変更

  3. Unityを再起動

これで、現在の Input.GetAxis("Horizontal") が動作します。


✅ 方法2:新Input System用にコードを書き換える

新Input Systemに完全対応させる場合は、以下のように変更します。

🔧 書き換えた PaddleController.cs

 
using UnityEngine; using UnityEngine.InputSystem; // 新Input System対応 [RequireComponent(typeof(Rigidbody2D))] public class PaddleController : MonoBehaviour { public float speed = 10f; private Rigidbody2D rb; void Start() { rb = GetComponent<Rigidbody2D>(); } void Update() { float inputX = 0f; if (Keyboard.current != null) { if (Keyboard.current.leftArrowKey.isPressed) inputX = -1f; else if (Keyboard.current.rightArrowKey.isPressed) inputX = 1f; } rb.velocity = new Vector2(inputX * speed, 0); } }

🔍 ちなみに注意点

  • rb.linearVelocity → 正しくは rb.velocity です(Unity公式)

  • 新Input Systemを使う場合は Keyboard.current のように入力デバイスを参照します


まとめ

方法 内容 難易度 おすすめ度
方法1 Player Settingsで「Both」に変更 ★☆☆ 簡単 👍 とりあえず動かしたいならこちら
方法2 新Input Systemでコードを修正 ★★★ 手間あり 新方式に慣れたいならこちら

どちらを選びますか?希望があれば、プロジェクト設定のスクリーンショット手順などもお伝えできます。

 
あなた:
using UnityEngine; public class BlockController : MonoBehaviour { void OnCollisionEnter2D(Collision2D collision) { // 衝突したオブジェクトがボールか確認 if (collision.gameObject.CompareTag("Ball")) { // ブロックを削除 Destroy(gameObject); } } } ボールが当たってもブロックが消えません、なぜでしょう
 
ChatGPT:

ボールが当たっても BlockControllerDestroy(gameObject) が動作しない主な原因はいくつかあります。以下を順にチェックしてみてください。


✅ チェックリスト(最も多い原因順)


① 【Ballタグが正しく設定されていない

最も多い原因です!

✅ 確認方法:

  1. Unityエディタでボールのオブジェクトを選択

  2. 上部の「Tag」欄を確認

  3. Ball」というタグが設定されているかチェック(※スペル完全一致)

🔧 設定手順:

  • Tagに「Ball」がなければ
     → 「Add Tag...」から「Ball」を作成し、ボールに設定します


② 【衝突判定のためのColliderが足りない/設定ミス

✅ 両方のオブジェクトに以下があるか確認:

オブジェクト 必須コンポーネント
ボール Rigidbody2D(動的) + Collider2D(例:CircleCollider2D)
ブロック Collider2D(例:BoxCollider2D)

Rigidbody2Dは必ず「動く側(ボール)」にだけ必要。ブロックに付ける必要はありません。


③ 【スクリプトがアタッチされていない

✅ 確認:

  • BlockController.cs がブロックのオブジェクトにアタッチされているか?


④ 【OnCollisionEnter2Dが呼ばれない設定になっている

条件を再確認:

  • 少なくともどちらか一方に Rigidbody2D がある必要があります(通常はボール側)

  • Is Trigger がオフになっている必要があります(Collider2D の「Is Trigger」チェックを外す)


⑤ 【レイヤーによって物理判定が無効になっている

✅ 確認:

Edit > Project Settings > Physics 2D > Layer Collision Matrix を開いて、

  • 「Ball」と「Block」などのレイヤー同士が「☑有効」になっているか?


🔍 補足:OnTriggerEnter2Dと混同していませんか?

もし Colliderの「Is Trigger」にチェックが入っているなら、OnCollisionEnter2D()は呼ばれません。

→ その場合は代わりに OnTriggerEnter2D(Collider2D collision) を使う必要があります。


✅ まとめ:まずはここをチェック!

チェック項目 対応内容
タグが "Ball" か CompareTag("Ball") に完全一致か?
Rigidbody2D ボールに付いているか?
Collider2D 両方のオブジェクトにあるか?
Is Trigger 無効(☑外れてる)か?
スクリプト ブロックにアタッチされているか?

もしそれでも解決しなければ、Unityエディタ上の設定スクリーンショットヒエラルキーの構成などを教えていただければ、より正確に原因を特定できます!