Unity碰撞器和触发器


一、碰撞器

一、需要条件

  1. 碰撞双方必须都要有碰撞器组件(Collider)
  2. 碰撞双方至少有一个物体有刚体组件(RigidBody)
  3. 碰撞双方若只有一个刚体,那么这个刚体一定要处于运动状态下才会有碰撞事件发生

二、用法

  1. 进入碰撞器执行的代码void OnCollisionEnter(Collision col){}
  2. 持续碰撞器执行的代码void OnCollisionStay(Collision col){}
  3. 离开碰撞器执行的代码void OnCollisionExit(Collision col){}
  4. 使用例子:目标被撞飞、皮球落地后又弹起的效果

二、触发器

一、发生条件

  1. 碰撞双方必须都要有碰撞器组件(Collider)
  2. 碰撞双方至少有一个物体有刚体组件(RigidBody)
  3. 碰撞双方至少有一个物体是运动状态(主动撞击方或者被撞击方)
    (此条忽略掉,经测试,一开始就相撞,也会触发OnTriggerEnter)
  4. 碰撞双方的碰撞器中至少有一个开启了IsTrigger

TIPS

1. 产生触发事件的两个物体会相互穿越,准确的说是因为开启IsTrigger那个物体会被物理引擎锁忽略掉,所以会产生两个物体穿越的情况
2. 两个对象要么都收到碰撞事件,要么都收到触发事件,不会出现一个收到触发事件,一个收到碰撞事件的情况

二、用法

  1. 进入触发器执行的代码void OnTriggerEnter(Collider col){}
  2. 持续在触发器执行的代码void OnTriggerStay(Collider col){}
  3. 离开触发器执行的代码void OnTriggerExit(Collider col){}
  4. 使用例子:人走到门旁边,门自动打开的效果
  5. 额外用法

在控制一个物体A去撞另一个物体B时,不要直接去修改物体A的Tranform的position属性,
因为你会发现如果即使两者发生了碰撞也还是会穿越的,原因就在于我们是直接设置的坐标,
如果物体A有刚体组件的话,应该用AddForce,给物体添加一个力,然后让物理引擎去让物体动,
此时如果发生了碰撞的话,就不会穿越了

三、两者关系

  1. 当IsTrigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/Stay/Exit函数
  2. 当IsTrigger=true时,碰撞器被物理引擎忽略,没有碰撞效果,可以调用OnTriggerEnter/Stay/Exit函数
  3. 碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性
  4. 如果既要检测到物体的接触又不想让碰撞器检测影响物体移动,或者要检测一个物件是否经过空间中的某个区域,这时就可以用到触发器
  5. 碰撞器(Collider)根据物理引擎引发碰撞,产生碰撞效果;
    触发器(Trigger)被物理引擎忽略,没有碰撞效果。

声明:有无之境|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - Unity碰撞器和触发器


有无之境