一、基本介绍
要进行碰撞检测有两个必须的组件,刚体(Rigidbody)和碰撞器(Collider)。
1、刚体是一个非常重要的组件。新创建的物体默认情况下是不具备物理效果的,而刚体组件可以给物体添加一些常见的物理属性,例如质量、力、速度等,这些属性可以使得该物体表现出实际中物体的一切行为。
官方定义:Rigidbody(刚体)组件可使游戏对象在物理系统的控制下来运动,刚体可接受外力与扭矩力用来保证游戏对象像在真实世界中那样进行运动。任何游戏对象只有添加了刚体组件才能受到重力的影响,通过脚本为游戏对象添加的作用力以及通过NVIDIA物理引擎与其他的游戏对象发生互动的运算都需要游戏对象添加了刚体组件。
2、碰撞器分为盒子碰撞器(Box Collider)、球体碰撞器(Sphere Collider)、胶囊碰撞器(Capsule Collider)、网格碰撞器(Mesh Collider)和车轮碰撞器(Wheel Collider),不同的碰撞器适用于不同形状的游戏体。
官方定义:碰撞体是物理组件的一类,它要与刚体一起添加到游戏对象上才能触发碰撞。如果两个刚体相互撞在一起,除非两个对象有碰撞体时物理引擎才会计算碰撞,在物理模拟中,没有碰撞体的刚体会彼此相互穿过。
二、碰撞检测
1、刚体具有以下几个碰撞检测的函数:
a.OnCollisionEnter(Collision other):碰撞刚发生的时候触发此方法,需要在这一时刻执行的指令可以写到这里面。
b.OnCollisionStay(Collision other):碰撞中触发的函数,在碰撞持续过程中,每一帧都会执行以下这个函数,需要在碰撞发生过程中执行的指令可以写到这里面。
c.OnCollisionExit(Collision other):碰撞退出触发的函数,需要在碰撞结束的时刻执行的指令可以写到这里面。
2、碰撞器具有以下几个碰撞检测的函数:
d.OnTriggerEnter(Collider other):同OnCollisionEnter(Collision other)
e.OnTriggerStay(Collider other):同OnCollisionStay(Collision other)
f.OnTriggerExit(Collider other):同OnCollisionExit(Collision other)
注意:Collider具有一个参数isTrigger,当设置为false时,发生碰撞会触发刚体相应的函数(a、b或c),当设置为true的时候,abc则不会被触发,相应的d、e、f会被触发。
也就是说abc和def之间只有一组函数会被触发。并且,当isTrigger设置为true的时候,刚体之间可以相互穿透,也就是说碰撞后的效果需要人为的在d、e、f中实现。
三、相关问题
1.有这样一种情形,物体A和B进行碰撞检测,A和B都有自己的OnTriggerEnter函数,当碰撞发生的时候,A和B的OnTriggerEnter函数触发顺序谁先谁后呢?
经过验证后发现,顺序是随机的。所以如果要执行一些有顺序的操作时最好将这些操作写到同一个物体的OnTriggerEnter函数中。
2.做实验的时候发现了一个很诡异的事情,就是发生碰撞的主体一定是要带刚体的,即只有带刚体的碰撞体去撞其他碰撞体时,双方才会收到碰撞事件,以下是我做的实验:
(1)、控制A(刚体加碰撞体)撞击 静止的B(碰撞体),双方能收到碰撞事件。
(2)、控制B(碰撞体)撞击 静止的A(刚体加碰撞体),双方收不到碰撞事件。
这种情况感觉也比较奇怪