0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Unity】いまさらColliderのisTriggerを結合して判定する方法を知ったのでメモ

Posted at

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);
		}

結論

つまりはそういうことです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?