在游戏制作过程中,碰撞检测肯定是经常需要使用到的,例如子弹飞行之后与可攻击目标之间的碰撞,子弹飞行之后与环境中物体的碰撞等等,都需要用到碰撞检测。那么在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中使用碰撞需要注意些什么呢?
- 确保物体所处的Layer之间存在碰撞。在Unity3D中,如果需要两个物体之间发生碰撞,首先要确认这两个物体所在的层(Layer)之间是会有物理碰撞的,这个可以通过Edit->Project Settings->Physics打开PhysicsManager进行查看和编辑,编辑面板最下方有一个跟9×9乘法表一样的Mask(掩码)开关面板,如果想让A层和B层之间的物体有物理碰撞,那就找到A和B交叉的那个点,确认勾选上就可以了,如果想去除两个层之间的物理碰撞检测,那么就把勾选去掉就OK了,两个处于同一层的物体碰撞设置也同理哦。
- 确保用于碰撞检测的两个物体至少有一个物体上有Rigidbody组件,Unity3D的物理引擎实际上使用的是Nvidia的PhysX系统,这个引擎的所有计算都是通过Unity3D中的Rigidbody来进行表现的,所以这个Rigidbody是碰撞检测的必要条件。
- 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不会同时回调,永远都只会调用这两个方法中的其中一个。