Unity碰撞器和触发器
一、碰撞器
一、需要条件
- 碰撞双方必须都要有碰撞器组件(
Collider
) - 碰撞双方至少有一个物体有刚体组件(
RigidBody
) - 碰撞双方若只有一个刚体,那么这个刚体一定要处于运动状态下才会有碰撞事件发生
二、用法
- 进入碰撞器执行的代码
void OnCollisionEnter(Collision col){}
- 持续碰撞器执行的代码
void OnCollisionStay(Collision col){}
- 离开碰撞器执行的代码
void OnCollisionExit(Collision col){}
- 使用例子:目标被撞飞、皮球落地后又弹起的效果
二、触发器
一、发生条件
- 碰撞双方必须都要有碰撞器组件(
Collider
) - 碰撞双方至少有一个物体有刚体组件(
RigidBody
) 碰撞双方至少有一个物体是运动状态(主动撞击方或者被撞击方)
(此条忽略掉,经测试,一开始就相撞,也会触发OnTriggerEnter)- 碰撞双方的碰撞器中至少有一个开启了
IsTrigger
TIPS
1. 产生触发事件的两个物体会相互穿越,准确的说是因为开启IsTrigger那个物体会被物理引擎锁忽略掉,所以会产生两个物体穿越的情况
2. 两个对象要么都收到碰撞事件,要么都收到触发事件,不会出现一个收到触发事件,一个收到碰撞事件的情况
二、用法
- 进入触发器执行的代码
void OnTriggerEnter(Collider col){}
- 持续在触发器执行的代码
void OnTriggerStay(Collider col){}
- 离开触发器执行的代码
void OnTriggerExit(Collider col){}
- 使用例子:人走到门旁边,门自动打开的效果
- 额外用法
在控制一个物体A去撞另一个物体B时,不要直接去修改物体A的Tranform的position属性,
因为你会发现如果即使两者发生了碰撞也还是会穿越的,原因就在于我们是直接设置的坐标,
如果物体A有刚体组件的话,应该用AddForce,给物体添加一个力,然后让物理引擎去让物体动,
此时如果发生了碰撞的话,就不会穿越了
三、两者关系
- 当IsTrigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/Stay/Exit函数
- 当IsTrigger=true时,碰撞器被物理引擎忽略,没有碰撞效果,可以调用OnTriggerEnter/Stay/Exit函数
- 碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性
- 如果既要检测到物体的接触又不想让碰撞器检测影响物体移动,或者要检测一个物件是否经过空间中的某个区域,这时就可以用到触发器
- 碰撞器(
Collider
)根据物理引擎引发碰撞,产生碰撞效果;
触发器(Trigger
)被物理引擎忽略,没有碰撞效果。
当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »