触发器的作用就是检测到两个物体碰撞的时候,触发执行脚本中的代码程序。
触发器系统的三个属性:Collider、IsTrigger、Rigibody
- Collider:GameObject 提供的基础模型才具有这个属性,表示该物体是否会和别的物体发生碰撞;拥有该属性的物体是一个碰撞器。
- Is Trigger:Collider 的子选项,表示该物体是否为一个触发器;只有碰撞器才有该选项,选中 Is Trigger,则该碰撞器成为一个触发器。
- Rigibody:刚体组件;当两个物体发生碰撞的时候,至少有一个物体具有 Rigibody 属性才会触发 Trigger() 函数。
触发基本规则
- 含有触发判断OnTriggerEnter() 函数的脚本和Rigibody 为同一物体的组件;
- 需要判断碰撞的两个物体中“至少”有一个物体的Is Trigger 属性为选中状态;
- OnTriggerEnter(Collider col) 中的参数 col 是与该脚本所挂载的物体相碰撞的另一个物体。
碰撞检测函数
-
进入时:OnCollisionEnter(Collider other) / OnCollisionEnter2D(Collider2D other)
-
退出时:OnCollisionExit(Collider other) / OnCollisionExit2D(Collider2D other)
-
逗留时:OnCollisionStay(Collider other) / OnCollisionStay2D(Collider2D other)
触发检测函数
-
进入时:OnTriggerEnter(Collider other) / OnTriggerEnter2D(Collider2D other)
-
退出时:OnTriggerExit(Collider other) / OnTriggerExit2D(Collider2D other)
-
逗留时:OnTriggerStay(Collider other) / OnTriggerStay2D(Collider2D other)
代码举例
- 以2D场景举例(3D场景下只需要把函数中 ‘2D’ 去掉即可。
- 新建一个脚本,在脚本中加入下面的触发判断函数 OnTriggerEnter2D(Collider2D other) 和 OnTriggerExit2D(Collider2D other),当发生碰撞和结束碰撞时会分别触发相应的函数。
- 通过函数中的参数 other 可以访问被碰撞物体的信息。
- 在函数中实现需要的功能即可。
private void OnTriggerEnter2D(Collider2D other)
{
Debug.Log("碰撞了!!!" + other.transform.name);
}
private void OnTriggerExit2D(Collider2D other)
{
Debug.Log("出去了!!!");
}
在实际使用过程中,会发现:当物体移动过快时,物体可能会与碰撞体发生穿透现象,这是由于Unity中帧刷新的速率问题,当在前一帧时物体还未与碰撞体发生碰撞,碰撞检测没有触发,而在下一帧中,由于移动速度过快,物体已经离开了碰撞体的检测范围,碰撞检测没有触发。原理大概是这个道理,可以通过调整帧刷新的速率、降低物体移动速度、沿物体移动方向发射射线判断前方是否有碰撞物…