Unity3D Collider类的信息传输Ontrigger*与OnCollision*
来源:https://www.cnblogs.com/zyn95186/p/8868508.html
最近在做毕设,遇到了一些关于Collider类下关于Ontrigger*与OnCollision*的一些迷茫,所以自己子这里整理一下。
在Untiy脚本手册中,我们可以看到这样的区分:
点进OnCollisionEnter 进入碰撞的详情界面,脚本手册给出了Ontrigger*与OnCollision*的区别:
In contrast to OnTrigger*, OnCollision* is passed the Collision class and not a Collider. The Collision class contains information about contact points, impact velocity etc.
If you don't use collisionInfo in the function, leave out the collisionInfo parameter as this avoids unneccessary calculations.
Note that collision events are only sent if one of the colliders also has a non-kinematic rigidbody attached.
相比OnTrigger*,OnCollision*传递Collision类而不是Collider。Collision类包含接触点,碰撞速度等信息。
在这个函数如果你不使用collisionInfo,删去collisionInfo参数以避免不必要的计算。
注意,当其中至少一个碰撞盒附加非动力学刚体时碰撞事件才会发送。
1)如果想实现两个刚体物理的实际碰撞效果时候用OnCollisionEnter,Unity引擎会自动处理刚体碰撞的效果。OnCollisionEnter方法必须是在两个碰撞物体都不勾选isTrigger的前提下才能进入。
2)如果想在两个物体碰撞后自己处理碰撞事件用OnTriggerEnter。只要勾选一个isTrigger那么就能进入OnTriggerEnter方法。
OnCollisionEnter和OnTriggerEnter是冲突的不能同时存在。
其实从中文解释也可以大致区分出来,碰撞消息(OnCollision*)和触发消息(OnTrigger*),在问度娘资料的时候,看到有个大佬做了一个全面的测试http://www.cnblogs.com/muxiaomo/p/4518545.html
这里就直接搬运了——
绿色字体表示:物体A在仅有Collider组件的情况下,使用transfrom.Translate方法位移运动,在某个数值范围内可以发生碰撞和触发消息,而超出这个范围外(速度过慢或过快)都不会发生。
一个物体:碰撞体+刚体,另一个物体:碰撞体,两个物体都不要勾选IsTrigger。此时最好用带有刚体的物体为运动体,仅带有碰撞体的物体为静态体(避免绿色字体情况发生)。
两个物体均为碰撞体+刚体,两个碰撞体都不要勾选IsTrigger。
一个物体:碰撞体+刚体,另一个物体:碰撞体,两个物体中至少有一个碰撞体勾选IsTrigger。此时最好用带有刚体的物体为运动体,仅带有碰撞体的物体为静态体(避免绿色字体情况发生)。
两个物体均为碰撞体+刚体,两个物体中至少有一个碰撞体勾选IsTrigger。
所以,从上述总结来说,
Ontrigger*与OnCollision*的前置条件基本相似,只要某个碰撞体勾选了IsTrigger属性,与其发生的所有碰撞都将变为触发;
碰撞体勾选IsTrigger后,该物体将会与其他物体发生穿越,该方法比较适合用于做一些区域检测传递消息等;
消息的传递都是双向的,两个物体发生碰撞,则两个物体都会获得碰撞消息;两个物体发生触发,则两个物体都会获得触发消息。