在Unity里面,游戲物體的碰撞我們可以通過剛體組件(Rigidbody)和碰撞器組件(Collider)來進行檢測。首先在場景里面添加一個Plane面板作為地面,然后在Plane面板的上方一定高度處放一個Cube立方體。

然后給Cube立方體添加一個剛體組件(Rigidbody)。運行游戲,這時候我們可以看到立方體掉在了面板上面。

立方體和面板產生了碰撞,並且靜止在面板上,這時候我們可以可以通過腳本來進行檢測,比如立方體掉在面板上的時候我們可以將其銷毀。給立方體添加一個檢測碰撞的腳本組件CubeCollision,語言使用C#。代碼如下:
using UnityEngine;
using System.Collections;
public class CubeCollision : MonoBehaviour {
// Use this for initialization void Start () { }
// Update is called once per frame void Update () { }
// 碰撞開始 void OnCollisionEnter(Collision collision) {
// 銷毀當前游戲物體 Destroy(this.gameObject); }
// 碰撞結束 void OnCollisionExit(Collision collision) { }
// 碰撞持續中 void OnCollisionStay(Collision collision) { } }
在MonoBehaviour類中,OnCollisionEnter、OnCollisionExit和OnCollisionStay是碰撞時的回調方法,我們可以在CubeCollision類中重載它們。當綁定了CubeCollision腳本組件的游戲物體發生碰撞時,OnCollisionEnter便會被觸發調用一次。然后,在整個碰撞過程中會持續調用OnCollisionStay方法,直到碰撞接觸被解除時,OnCollisionExit被觸發一次。這是一個完整的碰撞接觸過程,這三個方法都有一個Collision類型的參數,用於保存碰撞信息。
如果我們想要在當前腳本中去操作被立方體碰撞到的對象(面板),那么我們可以通過這三個方法的參數collision來獲得被碰撞的游戲物體的碰撞器組件對象(collider)。然后通過collider對象可以得到碰撞器組件掛載的游戲物體的信息。
// 碰撞開始 void OnCollisionEnter(Collision collision) { var name = collision.collider.name; Debug.Log("Name is " + name); }
這樣子就可以得到被碰撞的游戲物體的名稱。

如果我們有很多游戲物體,名稱各不相同,如果要檢測某一類型的,我們可以通過給游戲對象設置Tag值來進行區分。我們給面板對象設置一個Tag值:

然后修改代碼為獲取Tag值:
// 碰撞開始 void OnCollisionEnter(Collision collision) { var tag = collision.collider.tag; Debug.Log("Tag is " + tag); }
重新運行游戲:

除了碰撞之外,Unity還支持接觸檢測。因為使用碰撞檢測,發生碰撞的游戲物體之間會有碰撞模擬,比如撞到東西會反彈或者停頓一下之類的。有時候我們只是想要檢測物體與物體之間是否發生接觸,但是不要產生碰撞的效果,這時候我們可以使用觸發器來進行接觸檢測。
首先,我們把立方體Cube的碰撞器設置為觸發類型:

像這樣,我們在Cube的檢查視圖中找到碰撞器組件,將該組件的IsTrigger屬性勾選上,這樣在游戲物體發生接觸的時候就不會有碰撞的效果了,而是會直接穿過去。Unity的碰撞器有很多類型,Cube的碰撞器類型是盒子碰撞器(BoxCollider),另外還有球形碰撞器、膠囊體碰撞器等。
然后,我們在CubeCollision腳本組件里面重載以下三個方法:
// 開始接觸 void OnTriggerEnter(Collider collider) { Debug.Log("開始接觸"); } // 接觸結束 void OnTriggerExit(Collider collider) { Debug.Log("接觸結束"); } // 接觸持續中 void OnTriggerStay(Collider collider) { Debug.Log("接觸持續中"); }
MonoBehaviour類的OnTriggerEnter、OnTriggerExit和OnTriggerStay是觸發檢測的三個回調方法,OnTriggerEnter在游戲物體發生接觸時調用一次,OnTriggerExit在游戲物體完全分離時調用一次,而OnTriggerStay在游戲物體接觸過程中持續調用。
【值得注意的是,觸發器回調的這三個方法的參數都是Collider類型,表示的就是被碰撞的游戲物體的觸發器組件對象。】
重新運行游戲,我們可以在控制台看到調試信息:

這時候Cube會直接從Plane中穿下去,不會停在面板上。