っしゃす。
なんか衝突でヒットする記事だいたい間違ってるので、自分のために検証して残しておきます。
検証内容・結果は最後に回します。暇な人は見てください。
結論
衝突検知にはRigidBodyが必要だが、どちらかについてれば良い。
誰ですか、「両方RigidBodyが必要」とか言ってる人は。
衝突検知の際には動いてるかに関わらず、両方のコールバックが呼び出される。
2つともisTriggerがfalseの場合はOnCollisionEnter、それ以外はOnTriggerEnterが呼び出される。
なるべく動く方にRigidBodyを付ける(結果の表の注参照)
ところで、Colliderは衝突を検知するためのコンポーネントだが、RigidBodyは動くためのコンポーネントであるため、ステージの「動かない壁」などに用いるのはお勧めしない。ただし衝突検知にはRigidBodyが必要となる。
検証環境
Unity2020.3.1f1
RigidBodyのCollisionDetectionはContinuousSpeculative。
コード
ColliderTest.cs
using UnityEngine;
public class ColliderTest : MonoBehaviour
{
private void OnTriggerEnter(Collider other)
{
Debug.Log("OnTriggerEnterが起きたよ", gameObject);
}
private void OnCollisionEnter(Collision collision)
{
Debug.Log("OnCollisionEnterが起きたよ", gameObject);
}
}
シーン
この表の前提
ここでは二つのオブジェクトA、Bとする。
動くオブジェクトは片方のみか、両方の場合がある。どちらも動かない場合衝突しない。
Colliderは当たり前だが、2つともついてるとする。
RigidBody列の〇はRididbodyあり、×はなし。
isTrigger列は〇はisTrigger=true、×はfalse。
コールバック列はOnTriggerEnterが呼び出される場合T、OnCollisionEnterが呼び出される場合C、いずれも呼び出されない場合×。
結果
動くオブジェクト
RigidBody(A)
RigidBody(B)
isTrigger(A)
isTrigger(B)
コールバック(A)
コールバック(B)
A
×
×
×
×
×
×
A
×
×
〇
×
×
×
A
×
×
×
〇
×
×
A
×
×
〇
〇
×
×
A
〇
×
×
×
C
C
A
〇
×
〇
×
T
T
A
〇
×
×
〇
T
T
A
〇
×
〇
〇
T
T
A
×
〇
×
×
C△
C△
A
×
〇
〇
×
T
T
A
×
〇
×
〇
T
T
A
×
〇
〇
〇
T
T
A
〇
〇
×
×
C
C
A
〇
〇
〇
×
T
T
A
〇
〇
×
〇
T
T
A
〇
〇
〇
〇
T
T
A、B
×
×
×
×
×
×
A、B
×
×
〇
×
×
×
A、B
×
×
×
〇
×
×
A、B
×
×
〇
〇
×
×
A、B
〇
×
×
×
C
C
A、B
〇
×
〇
×
T
T
A、B
〇
×
×
〇
T
T
A、B
〇
×
〇
〇
T
T
A、B
×
〇
×
×
C
C
A、B
×
〇
〇
×
T
T
A、B
×
〇
×
〇
T
T
A、B
×
〇
〇
〇
T
T
A、B
〇
〇
×
×
C
C
A、B
〇
〇
〇
×
T
T
A、B
〇
〇
×
〇
T
T
A、B
〇
〇
〇
〇
T
T
注)結果のうち△は非常に稀にコールバックが確認された。使うべきではない。
↧