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,可以看到如下信息: