对于碰撞器和触发器经常忘记用法,这次主要记录下以便于能够复习用
1.碰撞器
发生条件:
1.碰撞的双方中一定至少要有一个Rigidbody存在,并且碰撞双方必须都要有碰撞体组件。
2.碰撞双方若只有一个有刚体,那么那个刚体一定要处于运动的状态下才会有碰撞事件发生。
用法:
void OnCollisionEnter(Collision col)
{
//进入碰撞器执行的代码
}
void OnCollisionStay(Collision col)
{
//持续碰撞器执行的代码
}
void OnCollisionExit(Collision col)
{
//离开碰撞器执行的代码
}
2.触发器
发生条件:
1、必须都要有碰撞器组件(Collider),其实上面的碰撞事件同样也需要这个前提条件。
2、必须有一个物体带刚体组件,并且处于运动状体中(包括主动运动去撞击别人和在运动过程中被别人撞击)。
3、两个碰撞器中至少有一个开启了IsTrigger。
注意:
一、产生触发事件的两个物体会相互穿越,准确的说是因为开启IsTrigger那个物体会被物理引擎锁忽略掉,所以会产生两个物体穿越的情况。
二、两个对象要么都收到碰撞事件,要么都收到触发事件,不会出现一个收到触发事件,一个收到碰撞事件的情况。
用法:
void OnTriggerEnter(Collider col)
{
//进入触发器执行的代码
}
void OnTriggerStay(Collider col)
{
//持续在触发器执行的代码
}
void OnTriggerExit(Collider col)
{
//离开触发器执行的代码
}
额外用法:在控制一个物体A去撞另一个物体B时,不要直接去修改物体A的Transform的position属性,因为你会发现如果即使两者发生了碰撞也还是会穿越的,原因就在于我们是直接设置的坐标,如果物体A有刚体组件的话,应该用AddForce,给物体添加一个力,然后让物理引擎去让物体动,此时如果发生了碰撞的话,就不会穿越了。
3.关系
当Is Trigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/Stay/Exit函数;
当Is Trigger=true时,碰撞器被物理引擎所忽略,没有碰撞效果,可以调用OnTriggerEnter/Stay/Exit函数。
碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性
如果既要检测到物体的接触又不想让碰撞检测影响物体移动或要检测一个物件是否经过空间中的某个区域这时就可以用到触发器