Collider(Trigger)が当たってないのに反応する・対処法【Unity】

問題:Collider(Trigger)が明らかに当たってないのにOnTriggerEnter2D()が呼ばれる。

追加情報:ChildコンポーネントにもColliderがついている。

 

結論:ChildコンポーネントのOnTriggerEnter2D()が呼ばれた際、Parentの方のOnTriggerEnter2D()も呼ばれている。

 

以下詳細:

キャラクターが敵の発射したロケットを攻撃することで、ダメージを受けずにそのロケットを破壊できるようにしたかった。しかしテストしてみるとダメージは受けない(=破壊には成功している)ものの、攻撃をくらった際ののけぞりアニメーションが再生された。

Debug.Logを使ったところ、どうやらChildコンポーネントのOnTriggerEnter2D()と同時にParentのOnTriggerEnter2D()も呼ばれている様子。

f:id:BeruruKH:20200105061215p:plain

親と子のCollider

画像にあるSword1HBは剣攻撃1のヒットボックスを担当している。

  • ロケットは「プレイヤー攻撃」に触れると壊れる
  • 剣攻撃は「エネミー」に触れるとダメージを与える
  • ロケットは「キャラクター」に触れるとダメージを与える
  • プレイヤーは「エネミーの攻撃」に触れるとのけぞる

「」内はタグ。タグでどのようなColliderなのかを判別している。

今回はこれら4つの処理の中、1つ目のCollisionが行われた際に4つ目のCollisionの処理が出てしまったのが原因だった。最初の設計時にこれらの知識がなかったため、これでも行けると勘違いしていた。

この問題の解決方法はいくつか考えられるが、Responsibility(責任)を見直すことにした。

 

以下、エクストラ:

ダメージの発生とのけぞりの判定が分かれている。これはあまりよろしくないのでは?と考えた。しかしロケットからダメージ与える責任をなくしてしまうと今回の想定外の挙動は直し辛い(今後のギミックの追加のためにも親子関係は崩したくない)。なのでダメージを受けるキャラクター側をいじるのがベストだろう。

のけぞるとダメージを受けるを同じ管轄で行うようにした。