这篇文章包含对常见问题的解答,例如:
- 它们的作用是什么以及它们是如何工作的:OnCollisionEnter、OnTriggerEnter、OnCollisionEnter2D、OnTriggerStay、OnCollisionExit 等;
- 如何正确调用它们/为什么它们不起作用;
- 他们接受和返回什么;
- 为什么 OnCollision Stay /OnTrigger Stay /... 功能在几帧后停止工作,如果它们最初工作,并且对象甚至没有移动。
重要提示:它还描述了触发器是什么、它的作用以及它与常规对撞机的不同之处。
功能列表:
首先,我们列出所有这些功能。总共有12个:
相同的功能,但适用于 2D 对象:
! Все ссылки рабочие и направляют на страницу своей функции关于 On Collision函数...及其 2D 版本
从文档:
论点:
它们都将其作为第一个也是唯一的论点 -
Collision(不要与 混淆Collider)。该类Collision包含有关接触点、冲击速度等的信息。要求:
isTrigger。isKinematic。重要的:
关于 On Trigger ... 触发函数及其 2D 版本
从文档:
参数:
它们都将其作为第一个也是唯一的参数-
Collider(不要与 混淆Collision),即对发生触发碰撞的对象组件的引用。要求:
重要的:
还请记住,如果您不使用函数中指定的参数(碰撞其他,碰撞碰撞...),您应该省略它们:在这种情况下,将不会执行不必要的计算。例如:
关于过渡到“睡眠”状态
很多人可能会遇到这样的情况:一个 Collider,Rigidbody 挂在对象上,一切都按应有的设置,带有 OnCollisionStay、OnTriggerStay 函数或其 2D 版本的脚本挂在对象上。然而,当一个物体在对撞机中时,这些功能突然停止工作!如果你把它们放进
Debug.Log去调试,结果是在几十帧之后,对象只是停止执行它的功能,到控制台的输出停止,甚至没有移动的对象似乎睡着了!为什么会这样?事实是刚体真的可以睡着了!
当刚体的移动速度低于某个速度时,就认为它已经停止了。之后,对象将进入“睡眠”模式。这样做是为了优化:在刚体“唤醒”(即再次开始移动)之前,不会将 CPU 资源用于更新刚体
在某些情况下(例如,当物理对象的移动是通过所谓的“隐形传态”进行时),该对象可能不会醒来,尽管它应该。在这种情况下,可以通过WakeUp功能强制唤醒。
来源:https ://docs.unity3d.com/Manual/RigidbodiesOverview.html
脚注:
1在这里和下面,一个组件
Collider是指任何类型的对撞机,任何它的后继者。也就是说,您可以使用BoxCollider、SphereCollider、CapsuleCollider、任何 2D 对撞机:BoxCollider2D、CircleCollider2D - 或任何其他适合您需要的对撞机。2 几乎
OnTriggerStay每帧调用一次,因为它依赖于物理定时器,不需要每帧调用一次。