【Unity】当たり判定がうまくいかない場合のチェックすべき6点

2019年10月16日

Unityで当たり判定を作る際、毎回調べ直している気がしたので、自分の詰まりポイントをまとめました。早見表と補足を入れます。スクリプトだけでもっと簡単に当たり判定チェックできるようになりたいですが、それはまた別作業が必要。とりあえずあたったときのレスポンスを取るための最低限のチェックポイントです。

Unityの当たり判定でうまくいかない時にチェックすべき6点

自分がよくやられていたのはいかのような点。とりあえず以下の内容を見て、ピンと来るのであれば今すぐUnityエディタに戻るべし。

1.当たる方・当たられる方のいずれにもRigidbody(2D)がついてない
2.CollisionとTriggerを間違えている
3.受信関数のスペルチェック
4.2Dかどうかがそもそも間違っている
5.レイヤーとタグは合ってる?
6.RigidBodyのBodyタイプ(Dynamicとか)

そういえばそのあたりやらなきゃダメだったわー、一応確認しときたいわーという人は下記の各項目ごとに確認して下さい。

当たる方・当たられる方のいずれにもRigidbody(2D)がついてない

正直何度やっても毎回ここではまってる気がします。使ってても納得がいかないし、腑に落ちない部分です。

Unityの当たり判定を使う場合、Collider(2D)系とRigidbody(2D)の両方が必要になります。

当たる側・当たられる側のいずれかにRigidbodyが求められます。2つのものが当たる場合、Colliderが2つ、Rigidbodyが1つは最低でも必要になります。

Triggerで当たり判定のみを察知したい場合でも必要になるので注意が必要です。

CollisionとTriggerを間違えている

あたったら押しのけて欲しいのはCollision、あたっているかどうかだけが欲しいのはTrigger。

かなりざっくりな分け方ですが、物理演算などで箱が積み重なってほしいのがCollision系で、あたったけどスイーっとすり抜けて行くのがTriggerです

受信関数のスペルミス

コールバック関数はスペルミスの指摘がないので、合っているかどうかをしっかり把握しておいて下さい。
また、引数もCollision系とTrigger系で違うので注意。Trigger系の引数がTriggerじゃないのわかりにくいよ

関数名説明・引数
OnCollisionEnter
OnCollisionEnter2D
あたったタイミングで呼び出される
Collision / Collision2D
OnCollisionStay
OnCollisionStay2D
あたっている最中毎フレーム呼ばれる
Collision / Collision2D
OnCollisionExit
OnCollisionExit2D
あたっていた状態から離れたタイミングで呼ばれる
Collision / Collision2D
OnTriggerEnter
OnTriggerEnter2D
トリガー状態のものがあたったタイミングで呼ばれる
Collider / Collider2D
OnTriggerStay
OnTriggerStay2D
トリガー状態のものがあたっている最中毎フレーム呼ばれる
Collider / Collider2D
OnTriggerExit
OnTriggerExit2D
トリガー状態であたっていたものが離れたタイミングで呼ばれる
Collider / Collider2D

2Dかどうかが間違っている

基本的ですが、2D系かどうかが間違っていないかどうかを注意して下さい。

関数名・引数・アタッチするCollider/Rigidbodyそれぞれには2Dかどうかの選択が必要です。

どれかがバラけていると正しく反応しません。Collider系は設定の値を自分で打ちこんだりしていると気づきやすいですが、アタッチしてそのまま試したりしている場合には見落としがちです。

レイヤーとタグはあってる?

あとは、別のプログラムなどから持ってきて動かない場合にありがちですが、Layerの設定とTagの設定をしっかりできているか確認が必要です。

レイヤー側の設定は、プログラム側ではわかりにくいです。

Edit>Project Settings>Physics(2D)にある、LayerCollisionMatrixでどのような設定になっているかしっかりと把握してプログラムを見直しましょう。

Ignore Raycastのレイヤーを完全無視したい場合はこんな感じ。この設定も2Dとそうじゃないのとで2つ設定するところがあります。利用する場合にはしっかり注意して下さい。

RigidBodyのBodyタイプ(Dynamicとか)

こちらはそこまで意味がないかもしれません。ただ、物理的な動きをさせたくないなど設定を変更したい場合、Dynamicに変更しておかないと重力影響の値を変更出来なかったり、多少の操作知識が必要になります。タイプを変えると入力できるパラメータに制限がかかったりするので、必要な値がない場合はタイプ変更を行って確認してみて下さい。

(2019版で確認しています。)

まとめ

自分がUnityで当たり判定を入れる時、なんども確認しているところをまとめました。

関数名間違わないようにとかさせるより、インターフェース継承させるぐらい強要したほうが、みんなわかりやすいと思うんですけどね。まぁUnity様がおっしゃるので、この方法をしっかり覚えましょう。

Layer関係の設定あたりは、見たこともない人いるかもしれませんが、たまーにハマるので、確認する方法だけでも覚えておくと便利かもしれません。