触发器:OnTriggerEnter
条件:至少有一个物体有Rigidbody刚体组件,两个物体都要有Collider碰撞器组件
试验一、OnCollisionEnter和OnTriggerEnter触发条件
在场景创建Cube和Sphere,添加Rigidbody和Collider组件,并挂载脚本监听“void OnCollisionEnter(Collision collision)”和“void OnTriggerEnter(Collider other)”
public class Test : MonoBehaviour
void OnCollisionEnter(Collision collision)
Debug.Log(gameObject.name + " - OnCollisionEnter - " + collision.gameObject.name);
void OnTriggerEnter(Collider other)
Debug.Log(gameObject.name + " - OnTriggerEnter - " + other.gameObject.name);
两个物体的Collider组件的IsTrigger选项都不勾选,两个组件都是碰撞器,挂载的脚本都会触发“OnCollisionEnter”函数;
一个勾选IsTrigger选项,一个不勾选,一个作为碰撞器,一个作为触发器,挂载的脚本都会触发“OnTriggerEnter”函数,都不会触发“OnCollisionEnter”;
两个都勾选IsTrigger选项,都作为触发器,挂载的脚本都会触发“OnTriggerEnter”函数,都不会触发“OnCollisionEnter”;
试验二、OnCollisionEnter、OnTriggerEnter与其子物体的联系
有些情况下,子物体的碰撞器/触发器会触发父物体的“OnCollisionEnter”、“OnTriggerEnter”函数:
比如,父物体添加Rigidbody刚体,没有碰撞器,子物体没有Rigidbody,有碰撞器,父物体会触发“OnCollisionEnter”,子物体不会。
如果,父物体添加Rigidbody刚体,有碰撞器,子物体没有Rigidbody,有碰撞器,父物体会触发“OnCollisionEnter”(碰撞到父物体碰撞器或子物体碰撞器,都会触发父物体回调),子物体仍然不会。
以上测试OnTriggerEnter与OnCollisionEnter结果相同
所以:有Rigidbody组件的物体,当自身或子物体的碰撞器发生碰撞,会执行“OnCollisionEnter”;当自身或子物体的触发器发生碰撞,会执行“OnTriggerEnter”。
不过,给父物体和子物体分别添加RigidBody组件,在碰撞器和触发器执行时,会分别检测,调用对应函数,子物体只触发子物体回调,父物体只触发父物体回调。
如果父物体要屏蔽子物体碰撞器/触发器,可以给子物体添加Rigidbody。
是不是可以说:两个物体都有Collider碰撞器组件,至少有一个物体或其父物体有Rigidbody刚体组件,就可以发生碰撞?
试验三、OnCollisionEnter、OnTriggerEnter的参数
测试:物体A,父物体B,子物体C
A、B、C都添加碰撞器,A、B添加Rigidbody。
在A的"OnCollisionEnter(Collision collision)"回调中,无论A碰撞到B还是C,collision.gameObject都是B(即有Rigidbody的物体), collision.collider.gameObject才是B或C(即有碰撞盒的物体)。
A、B、C都添加触发器,A、B添加Rigidbody。
在A的"OnTriggerEnter(Collider other)"回调中,碰撞到B,other.gameObject == B;碰撞到C,other.gameObject == C。(即有触发器的物体)
在两个碰撞器/触发器已经相交后,关闭其中一个gameObject.activeSelf或collider.enabled,OnTriggerExit不会触发;重新开启后,OnTriggerEnter会触发。
- 1564
-
纯爱掌门人
WebAssembly
Unity3D
- 6.2w
-
HelloWorld杰少
Unreal Engine