Unity3D 中的碰撞检测

在游戏制作过程中,碰撞检测肯定是经常需要使用到的,例如子弹飞行之后与可攻击目标之间的碰撞,子弹飞行之后与环境中物体的碰撞等等,都需要用到碰撞检测。那么在 Unity3D 中 Collider 肿么使呢,又有啥需要注意的捏?

Unity3D 中用于碰撞检测的组件叫 Collider,由这个货派生出来的又有 Box Collider,Sphere Collider,Capsule Collider,Mesh Collider 和 Wheel Collider,这里我们主要说一下我自己用过的几个货啊,我目前就使用过 Box Collider,Capsule Collider 和 Mesh Collider,其实 Sphere Collider 应该也跟 Box Collider、Capsule Collider 没啥实质性的区别,只是适用于不同的物体罢了。不废话了,进正题。

Unity3D 中使用碰撞需要注意些什么呢?

  1. 确保物体所处的 Layer 之间存在碰撞。在 Unity3D 中,如果需要两个物体之间发生碰撞,首先要确认这两个物体所在的层(Layer)之间是会有物理碰撞的,这个可以通过 Edit->Project Settings->Physics 打开 PhysicsManager 进行查看和编辑,编辑面板最下方有一个跟 9×9 乘法表一样的 Mask(掩码)开关面板,如果想让 A 层和 B 层之间的物体有物理碰撞,那就找到 A 和 B 交叉的那个点,确认勾选上就可以了,如果想去除两个层之间的物理碰撞检测,那么就把勾选去掉就 OK 了,两个处于同一层的物体碰撞设置也同理哦。
  2. 确保用于碰撞检测的两个物体至少有一个物体上有 Rigidbody 组件,Unity3D 的物理引擎实际上使用的是 Nvidia 的 PhysX 系统,这个引擎的所有计算都是通过 Unity3D 中的 Rigidbody 来进行表现的,所以这个 Rigidbody 是碰撞检测的必要条件。
  3. OnTriggerEnter 和 OnCollisionEnter 的区别,理解这两个概念之前需要先了解 Collider 和 Trigger 的区别。在 Unity3D 中我们添加的组件都是 Collider 但是每种 Collider 组件都有一个属性『Is Trigger』,只要将这个属性设置为 True,那么这个 Collider 就成为了 Trigger,这两者的区别在于:
    • Collider 之间(两个都没有设置 Is Trigger 属性为 True)碰撞(接触)之后会回调 Collider 所在 GameObject 上绑定的脚本中的 OnCollisionEnter 方法,碰撞之后物理引擎会根据碰撞物体的质量,运动速度等等信息进行计算,计算碰撞之后物体的运动参数,会产生真实的物体碰撞效果。
    • Collider 和 Trigger 之间(任意一个 Collider 设置了 Is Trigger 属性为 True)碰撞(接触)之后回回调 Trigger 所在 GameObject 上绑定的脚本中的 OnTriggerEnter 方法,碰撞之后的物体依然会按照原有的运动状态继续在世界中运动,两者之间不会相互影响对方的状态。
    • Trigger 之间(两个 Collider 都设置了 Is Trigger 属性为 True)碰撞的情况同 Collider 和 Trigger 之间的碰撞。
    • OnTriggerEnter 和 OnCollisionEnter 不会同时回调,永远都只会调用这两个方法中的其中一个。