べにやまぶろぐ

技術寄りの話を書くつもり

Unity 2D でひたすら OnCollisionEnter2D が呼ばれ続ける

バージョン : Unity 4.3.4f1

https://play.google.com/store/apps/details?id=com.ymtstudio.gusokumushi&hl=ja では猫とグソクムシが衝突したのを契機に攻撃しあうようになっているのですが、そこで OnCollisionEnter2D がひたすら発火し続けるという事象に悩まされました。Rigidbody2D に BoxCollider2D または CircleCollider2D をアタッチしてるのですが、あれ OnCollisionEnter って衝突開始時にだけ呼ばれて後は OnCollisionStay じゃないのと思ったわけです。

そこで調べてみるとBoxCollider2D 同士だと一回しか呼ばれないけど CircleCollider2D だと複数回呼ばれるという報告があったのですが

OnCollisionEnter2D called several times when collision is circle - Unity Forum

自分の場合は Collider の種類に差異はなく、むしろこちらの

OnTriggerEnter2D behaving like OnTriggerStay2D. - Unity Forum

に現象が近かったです。ただしこちらは OnTriggerEnter2D のケース。

When an object is in motion (including rotation in my case), it continues to fire the OnTriggerEnter2D method since the transform is continually changing.

ということで動いてぶつかり続けているときに OnTriggerEnter2D コールバックが呼ばれ続けている雰囲気ですが、このスレッドではバグ認定されてチケットが上げられていました。

あとはちらほら OnCollisionStay2D にもバグ報告が上がっていたり。

rigidbody2D.isKinematic and OnCollisionEnter2D bug? - Unity Forum

つまるところ Unity2D のイベントシステムのバグなんでしょうか。結局、みなさん初回衝突時にぶつかった相手をリストなりに入れて二回目以降は処理をスキップして回避しているようでした。ちょっと毎フレームやりたくない処理ですが現状様子見ということでグソクムシも Hashtable に InstanceID でフラグ引ける形で入れて重複検出させることで問題回避しています。