最近久々に再開したUnityですがなかなか思い出し切らずにいろいろとつまずいています。
その中の1つになりますが、衝突判定がなかなか発生しないという問題がありました。
原因は非常に単純なことだったのですが、これも今後のため備忘録として書き残しておきます。
目次
1.発生内容
ボールが壁に当たるときの衝突判定のようなものをやろうとしてスクリプトを書いていたのですが、うまくいかずいろいろと試行錯誤を繰り返してもなかなか解決しなかったことがありました。
具体的には、衝突時に呼ばれるはずの
OnCollisionEnter、OnCollisionEnter2D
が何回やっても呼ばれなかったというものです。
2.原因と対処方法
Unity開発を久々に再開したこともあり、非常に初歩的なミスだったのですが、エラーが発生するわけでもなかったのでなかなかわかりませんでした。
経緯としては、2次元だったのでOnCollisionEnter2Dを使用しようとしたのですが、Colligion側の例が見当たらなかったので、OnTriggerEnter2Dの例を持ってきて違っているところを書き直すというやり方でやろうとしました。
OnTriggerEnter2D側の元の例がこういう内容でした。
void OnTriggerEnter2D(Collider2D other) { Debug.Log("コリジョンエンター"); }
それをもとにして間違えた時の記述が以下のようなものでした。
この中で初歩的なミスを2つもしています。
void OnColligionEnter2D(Collider2D other) { Debug.Log("コリジョンエンター"); }
おわかりだと思いますが、1つはスペルミスでもう1つは引数の指定のところのミスです。
正しくは、
OnColligionEnter2D → OnCollisionEnter2D
Collider2D → Collision2D
です。
1つめは書き換えた時の単純なスペルミスですが、2つ目は引数の指定がOnTriggerEnter2D側とOnCollisionEnter2D側で違っていてCollision2Dにしなければならなかったというものです。
結果、
void OnCollisionEnter2D(Collision2D collision) { Debug.Log("コリジョンエンター"); // SceneManager.LoadScene("ClearScene"); }
のように変更したところ正常に動作しました。
やはり使い方を正しく確認してからやらないとこういうことでむだに時間を使ってしまいますね(→自分)。
以上が、衝突判定(当たり判定)が発生しなかった時の原因と対処方法の一例になります。