【Unity3D入门教程】物理引擎之碰撞解析
Unity3D内置物理引擎,可以模拟物理效果。典型的一个物理效果就是碰撞。本文将会针对最简单的案例讲述Unity3D的碰撞规律。
1 碰撞规律
首先在场景中创建一个Sphere和一个Cube,它们都是默认带有碰撞器的。
如果要让物体受到物理控制,需要给它添加一个刚体组件。这时,物体将会受到重力影响,并且能够与其他物体碰撞。
- 碰撞器的分类
碰撞器按外形可以分为BoxCollider、SphereCollider、CapsuleCollider、WheelCollider、MeshCollider等。这里我们以Box和Sphere 的Collider作为实例来展开叙述。
- 刚体
只带有碰撞器而没有刚体的物体,自己是不能响应物体行为的。这类成为静态碰撞器,适合作为墙体、地面和其他不动的物体。当给物体添加了刚体后,物体就可以接受力和力矩,产生接近真实物体的表现。需要注意的是,如果要让两个物体发生碰撞,至少有一个物体要带有刚体组件。
刚体组件中的Mass是质量,Drag和Angular Drag是阻力和角阻力,这些数值都是可以影响碰撞效果的。UseGravity是重力开关,打开就会响应重力,关闭则不响应。IsKinematic是运动学开关,如果启用,物体将不受物理引擎驱动,只能通过Transform来操作。下面的CollisionDetection默认是Discrete(不连续检测)。最下面是Constraints,可以设置限制刚体的运动。
2 碰撞实例
为了检测碰撞和物体开关,需要把下面的collider.cs脚本绑定到Cube上。
using UnityEngine; using System.Collections; public class collider : MonoBehaviour { // Use this for initialization void Start () { } // Update is called once per frame void Update () { } //碰撞检测 void OnCollisionEnter(Collision colliderInfo) { Debug.Log(colliderInfo.collider.name+"撞过来了!"); } void OnCollisionExit(Collision colliderInfo) { Debug.Log(colliderInfo.collider.name + "结束碰撞!"); } void OnCollisionStay(Collision colliderInfo) { Debug.Log(colliderInfo.collider.name + "处于碰撞中!"); } //物理开关 void OnTriggerEnter(Collider collider) { Debug.Log("Trigger: "+collider.name +"进入!"); } void OnTriggerExit(Collider collider) { Debug.Log("Trigger: " + collider.name + "离开!"); } void OnTriggerStay(Collider collider) { Debug.Log("Trigger: " + collider.name + "触发中!"); } }
对于已经创建好的Cube和Sphere,它们自身就是带有碰撞器的,我们给这两个物体加上刚体。点击对象的AddComponent,在下拉的菜单搜索中输入Rigidbody,选择并添加即可,刚体参数可以保持默认。
(1)测试碰撞
不勾选Cube的BoxCollider的IsTrigger,运行游戏。用鼠标拖到Sphere去碰撞Cube,可以看到如下信息:
(2)测试物理开关
勾选Cube的BoxCollider的IsTrigger,运行游戏。用鼠标拖到Sphere去碰撞Cube,可以看到如下信息: