質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

279閲覧

【Unity】特定のコライダーとの衝突を検知できない

babu4971

総合スコア1

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

1グッド

1クリップ

投稿2024/04/16 18:11

編集2024/04/17 09:53

実現したいこと

Unityで2Dアクションゲームを作成しています。
プレイヤーが持つCircleCollider2Dに敵が衝突した際に、敵を消すといった挙動を実装しようとしています。

発生している問題・分からないこと

ゲームビューで確認すると、プレイヤーのCircleCollider2Dと敵のCircleCollider2Dは衝突しているのですが、敵が消えません。

該当のソースコード

EnemyController.cs

1【該当箇所抜粋】 2public class EnemyController : MonoBehaviour 3{ 4 [SerializeField] GameObject player; 5 CircleCollider2D playerCircol; 6 7 void Start() 8 { 9 this.playerCircol = this.player.GetComponent<CircleCollider2D>(); 10 } 11 12 private void OnCollisionEnter2D(Collision2D collision) 13 { 14 Debug.Log(playerCircol); 15 if (collision.collider == playerCircol) 16 { 17 Destroy(gameObject); 18 } 19 } 20} 21

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

上記のDebug.Log(playerCircol)の結果はplayer(UnityEngine.CircleCollider2D)と表示されたので、CircleCollider2Dだけを取得できているはずです。
試しにDebug.Log(collision.collider)を確認すると、上記と同様の結果となりますが、そもそもif文が呼び出されていません。
ちなみにプレイヤー、敵ともにRigidbody2Dコンポーネントを与えています。
解決策が全く思いつかないので、お力添えいただければ幸いです。

補足

特になし

shinoharat👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shinoharat

2024/04/17 05:15

OnCollisionEnter2D に波カッコが無いのが気になります。 ↓みたいに書かないとそもそもコンパイルエラーになる気がしますがどうですか? private void OnCollisionEnter2D(Collision2D collision) { ... }
babu4971

2024/04/17 09:54

この質問サイトに記載する際に波カッコが抜けていたので修正いたしました。 大変失礼いたしました。 改めてご確認いただければ幸いです。
katsuko

2024/04/17 23:00

ソースコードに問題があるように思えません。それ以外に問題があるのではないですか。 例えば、playerにプレハブを指定している(Projectビューからアセットをドラッグ&ドロップして設定している)とか。
babu4971

2024/04/19 02:51

プレハブを指定していました。 追加で教えていただきたいのですが、シーンビューにプレイヤーのアセットをドラッグ&ドロップした後、コライダーとRigidbody2Dのコンポーネントを与えました。 その後、このオブジェクトをインスペクター内のplayer(上記スクリプトで記載した箇所)に割り当てたのですが、型が不一致とのエラーが表示されました。 playerの型を変更する必要があると思うのですが、何に変更すればよろしいでしょうか。 それとも今回行った操作自体が誤っているのでしょうか。 ご教示の程よろしくお願いいたします。
babu4971

2024/04/19 02:55

↑Projectビューにあるプレハブでないアセットを使用した上記の結果となりました。
katsuko

2024/04/19 04:11

Sceneビューにドラッグ&ドロップすれば、Hierarchyにオブジェクトが表示されるはずです。 そのHierarchy上のオブジェクトをドラッグして、スクリプトのplayerに設定してください。 それで問題なければ、ちゃんとした説明を含めて回答します。(夜になると思いますが) 問題があるのであれば、「型が不一致とのエラー」の内容を正確に、質問に追記なさったほうが良いかと思います。
babu4971

2024/04/20 00:28

ご教示いただいた通り行いましたところ、スクリプトのplayerに設定しようとすると、Inspector上のplayerに「Type mismatch」とだけ表示され設定できませんでした。 試しに他のHierarchy上のオブジェクトでも試してみましたが、同様に「Type mismatch」とだけ表示されました。 一つ気になったのですが、なぜかplayerにドラッグ&ドロップしても何も反応がなかったので、Inspector上のplayerにあるプラスボタンからオブジェクトを設定したところ、上記結果となりました。 ご教示の程よろしくお願いいたします。
katsuko

2024/04/21 23:06

普通ならばそのようなことは起きません。また書かれていないところで問題があるのではないですか。 まぁ、私もすでに回答があるとおり、タグで判別する方がいいと思います。 もし該当するものが複数あるのであれば、nameプロパティで判別するなど、他にも色々と判別する方法あると思いますので、検討してみてください。
guest

回答2

0

うろ覚えですが
collision.collider と playerCircol の
参照先は異なっていた気がします。
なので == で比較できないかもしれません。

試しに Player にタグ "Player" を設定して頂いて
Tag で判定して頂く事はできますか?

C♯

1if (collision.gameObject.tag == "Player") 2{ 3 Destroy(gameObject); 4}

C♯

1【該当箇所抜粋】 2public class EnemyController : MonoBehaviour 3{ 4 [SerializeField] GameObject player; 5 CircleCollider2D playerCircol; 6 7 void Start() 8 { 9 this.playerCircol = this.player.GetComponent<CircleCollider2D>(); 10 } 11 12 private void OnCollisionEnter2D(Collision2D collision) 13 { 14 Debug.Log(playerCircol); 15 if (collision.gameObject.tag == "Player") 16 { 17 Destroy(gameObject); 18 } 19 } 20}

参考サイト:

https://feynman.co.jp/unityforest/game-create-lesson/action-pazzle-game/tag-collision-judgement/

投稿2024/04/18 02:39

uni2

総合スコア256

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

babu4971

2024/04/19 02:57

タグでの判定は可能です。 ただ、割り当てている複数のコライダーの内、一部のコライダーを接触の判定基準にしたいので悩んでおります。
guest

0

自己解決

プレハブ内のplayerにドラッグ&ドロップしていたのですが、シーン上のオブジェクトそれぞれのplayerに行ったところ解決いたしました。
ありがとうございました。

投稿2024/04/25 05:49

babu4971

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問