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