【Unity3D入门教程】物理引擎之碰撞解析

Unity3D内置物理引擎,可以模拟物理效果。典型的一个物理效果就是碰撞。本文将会针对最简单的案例讲述Unity3D的碰撞规律。

 

1 碰撞规律

首先在场景中创建一个Sphere和一个Cube,它们都是默认带有碰撞器的。

【Unity3D入门教程】物理引擎之碰撞解析

【Unity3D入门教程】物理引擎之碰撞解析

【Unity3D入门教程】物理引擎之碰撞解析

【Unity3D入门教程】物理引擎之碰撞解析

如果要让物体受到物理控制,需要给它添加一个刚体组件。这时,物体将会受到重力影响,并且能够与其他物体碰撞。

 

  • 碰撞器的分类

碰撞器按外形可以分为BoxCollider、SphereCollider、CapsuleCollider、WheelCollider、MeshCollider等。这里我们以Box和Sphere 的Collider作为实例来展开叙述。

 

  • 刚体

只带有碰撞器而没有刚体的物体,自己是不能响应物体行为的。这类成为静态碰撞器,适合作为墙体、地面和其他不动的物体。当给物体添加了刚体后,物体就可以接受力和力矩,产生接近真实物体的表现。需要注意的是,如果要让两个物体发生碰撞,至少有一个物体要带有刚体组件。

【Unity3D入门教程】物理引擎之碰撞解析

刚体组件中的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,选择并添加即可,刚体参数可以保持默认。

【Unity3D入门教程】物理引擎之碰撞解析

(1)测试碰撞

不勾选Cube的BoxCollider的IsTrigger,运行游戏。用鼠标拖到Sphere去碰撞Cube,可以看到如下信息:

【Unity3D入门教程】物理引擎之碰撞解析

(2)测试物理开关

勾选Cube的BoxCollider的IsTrigger,运行游戏。用鼠标拖到Sphere去碰撞Cube,可以看到如下信息:

【Unity3D入门教程】物理引擎之碰撞解析