Unity 基础 之 物体系统 -- 碰撞触发条件

1,455 阅读2分钟

这是我参与8月更文挑战的第22天,活动详情查看:8月更文挑战

上一篇文章《Unity 基础 之 物体系统 -- 碰撞体属性介绍》,对各种常用碰撞体的属性面板进行了介绍,这篇文章我么一起来看看如何使用这碰撞体吧。

碰撞体概念

碰撞体 (Collider) 组件定义对象的形状以便用于物理碰撞。碰撞体是不可见的,其形状不需要与对象的网格完全相同,事实上,粗略近似方法通常更有效,在游戏运行过程中难以察觉。


碰撞与触发

本质区别:碰撞体组件是否勾选Is Trigger属性:

也就是两个都不勾选Is Trigger属性的碰撞体距离较近时(生活中的接触,挨着),那么此时两个物体将会发生碰撞。举例:球掉到地上,会被弹起来,这就是两个碰撞体进行了碰撞体产生了相互作用力,在Unity中也是这样的,两个向装的物体会产生相互作用力,而分开

若有一个勾选了Is Trigger属性,那么此时两个物体将不会产生碰撞,常见的穿模。举例:绝地求生游戏中的汽车撞到小树会直接过去,像没有这棵树一样。


代码触发条件

Unity 为我们提供了检测触发和碰撞的代码,他们分别是:

  • 触发信息检测:
    • OnTriggerEnter(Collider other) 当进入触发器
    • OnTriggerExit(Collider other) 当退出触发器
    • OnTriggerStay(Collider other) 当逗留触发器
  • 碰撞信息检测:
    • OnCollisionEnter(Collision collisionInfo) 当进入碰撞器
    • OnCollisionExit(Collision collisionInfo) 当退出碰撞器
    • OnCollisionStay(Collision collisionInfo) 当逗留碰撞器

以上六个函数,还有与其一一对应的2D碰撞体函数,在函数名后加上2D,则可监听2D碰撞体触发。

碰撞函数自动执行条件:

  • 两个物体都有Collider
  • 至少有一个物体身上挂载Rigidbody
  • 两个物体都没有勾选Is Trigger

触发函数自动执行条件:

  • 两个物体都有Collider
  • 至少有一个物体身上挂载Rigidbody
  • 至少有一个Is Trigger

代码示例:

public class ColliderTest : MonoBehaviour 
{
 
    // --------------碰撞器--------------
    private void OnCollisionEnter(Collision collision)
    {   
       Debug.Log("碰撞器 OnCollisionEnter ");
    }
 
    private void OnCollisionStay(Collision collision)
    {
       Debug.Log("碰撞器 OnCollisionStay ");    
    }
 
    private void OnCollisionExit(Collision collision)
    {       
       Debug.Log("碰撞器 OnCollisionExit ");
    }
    
    // --------------触发器--------------
    // 勾选isTrgger  
    private void OnTriggerEnter(Collider other)
    {       
       Debug.Log("触发器 OnTriggerEnter ");
    }
 
    private void OnTriggerStay(Collider other)
    {
       Debug.Log("触发器 OnTriggerStay ");
    }
 
    private void OnTriggerExit(Collider other)
    {
       Debug.Log("触发器 OnTriggerExit ");
    } 
}