Composite Colliderについて
UnityにはComposite Colliderという仕組みがあります。
これはRigidbodyの下(自身と子オブジェクト)にColliderが複数ある時、Colliderを一つにまとめて処理してくれるというものです。
参考
【Unity】複数のColliderを結合するComposite Collider 2Dを使って少し遊ぶ
子にRigidBodyがついていれば、それ以下の階層がさらにグループとして扱われる仕様のようです。
物理挙動で言えばそれだけなのですが、OnTriggerEnterなどのイベントについてはかなりわかりにくく、今更ながら混乱してしまいました。
要はプリミティブ形状のColliderを組み合わせて1つで判定したいのに、何度もイベントが呼ばれるうえ間引くことが非常に難しいという問題にぶつかりました。
方法
isTriggerでも同様にRigidBody(isKinematic)をアタッチしてグループ化し、相手のRigidBodyがほしいならCollider.attachedRigidbody
で取得する。
これだけでした。
つまり
・GameObjectA(RigidBody isKinematic)(EventScript)
・ChildA_1(Collider isTrigger)
・ChildA_2(Collider isTrigger)
・ChildA_3(RigidBody isKinematic)(EventScript)
・ChildA_3_1(Collider isTrigger)
・ChildA_3_2(Collider isTrigger)
のような感じです。
Child1にほかのCollider(例:ChildB_1)が衝突すると、GameObjectAのEventScriptのOnTriggerEnterが呼び出されます。
ここでOnTriggerEnterの引数でわたってくるColliderはChildB_1のColliderですが、実際は大枠のGameObjectAとGameObjectBの衝突を見たいはずです。
そのようなときはCollider.attachedRigidbody
で相手側のRigidBodyが取得できるようです。
private void OnTriggerEnter(Collider other)
{
var triggerGroupParent = other.attachedRigidbody;
if (triggerGroupParent == null)
{
return;
}
Debug.Log(triggerGroupParent.name);
}
結論
つまりはそういうことです。