Collider(Trigger)が当たってないのに反応する・対処法【Unity】
問題:Collider(Trigger)が明らかに当たってないのにOnTriggerEnter2D()が呼ばれる。
追加情報:ChildコンポーネントにもColliderがついている。
結論:ChildコンポーネントのOnTriggerEnter2D()が呼ばれた際、Parentの方のOnTriggerEnter2D()も呼ばれている。
以下詳細:
キャラクターが敵の発射したロケットを攻撃することで、ダメージを受けずにそのロケットを破壊できるようにしたかった。しかしテストしてみるとダメージは受けない(=破壊には成功している)ものの、攻撃をくらった際ののけぞりアニメーションが再生された。
Debug.Logを使ったところ、どうやらChildコンポーネントのOnTriggerEnter2D()と同時にParentのOnTriggerEnter2D()も呼ばれている様子。
画像にあるSword1HBは剣攻撃1のヒットボックスを担当している。
- ロケットは「プレイヤー攻撃」に触れると壊れる
- 剣攻撃は「エネミー」に触れるとダメージを与える
- ロケットは「キャラクター」に触れるとダメージを与える
- プレイヤーは「エネミーの攻撃」に触れるとのけぞる
「」内はタグ。タグでどのようなColliderなのかを判別している。
今回はこれら4つの処理の中、1つ目のCollisionが行われた際に4つ目のCollisionの処理が出てしまったのが原因だった。最初の設計時にこれらの知識がなかったため、これでも行けると勘違いしていた。
この問題の解決方法はいくつか考えられるが、Responsibility(責任)を見直すことにした。
以下、エクストラ:
ダメージの発生とのけぞりの判定が分かれている。これはあまりよろしくないのでは?と考えた。しかしロケットからダメージ与える責任をなくしてしまうと今回の想定外の挙動は直し辛い(今後のギミックの追加のためにも親子関係は崩したくない)。なのでダメージを受けるキャラクター側をいじるのがベストだろう。
のけぞるとダメージを受けるを同じ管轄で行うようにした。