要產生(shēng)碰撞必須為(wéi)遊戲對象添加剛體(Rigidbody)和(hé)碰撞器,剛體可以讓物體在物理影響下運(yùn)動。碰撞體是物理組件的一類,它要與剛體一起添加到遊戲對象上才能(néng)觸發碰撞。如果兩(liǎng)個剛體相互(hù)撞在一起,除非兩個(gè)對象有碰撞體時物理引擎才會計算(suàn)碰撞,在物理模擬(nǐ)中,沒有碰撞體的剛體會彼此相互穿過。
物體發生碰撞的必要條件
兩個物體都必須(xū)帶有碰撞器(Collider),其中一個物體還必(bì)須帶有Rigidbody剛體。
在unity3d中,能檢測碰撞發生(shēng)的方式有兩種,一種是(shì)利用碰撞器,另一種則是利用觸發(fā)器。
碰撞器:一群組件,它包含了很多種類,比如:Box Collider(盒碰撞體),Mesh Collider(網格碰撞體)等,這些碰撞(zhuàng)器應用(yòng)的(de)場合不同,但都必須加到(dào)GameObjecet身上。
觸發器(qì),隻需要在檢視麵板中的碰撞器組件中勾選IsTrigger屬性選擇框。
兩(liǎng)個(gè)物體相接觸(chù)時到底執行OnTriggerEnter還是執行(háng)OnCollisionEnter方法,這兩個又有什麽區別呢?
為了驗證碰撞器與(yǔ)觸發器的區別,現設計一個簡單的遊戲,讓小汽車與小球發生碰撞。新建一個C#腳本文件,把它拖給(gěi)小汽車對象,雙擊該腳本文件進入腳本(běn)編輯器,在該腳本中加入如下兩個方法,並分別設置一個斷點:
觸發信息檢測:
1.MonoBehaviour.OnTriggerEnter(Collider collider)當進入觸發器
2.MonoBehaviour.OnTriggerExit(Collider collider)當退出觸發器
3.MonoBehaviour.OnTriggerStay(Collider collider)當逗留觸發器
碰撞信息檢測:
1.MonoBehaviour.OnCollisionEnter(Collision collision) 當進入碰撞器
2.MonoBehaviour.OnCollisionExit(Collision collision) 當退出碰撞器
3.MonoBehaviour.OnCollisionStay(Collision collision) 當逗留碰撞(zhuàng)器
// 開始接觸void OnTriggerEnter(Collider collider) {
Debug.Log("開始(shǐ)接觸:" + collider.gameObject.name);
//Debug.Log (collider.gameObject.name);
}
// 接觸持續中void OnTriggerStay(Collider collider) {
Debug.Log("接(jiē)觸持續(xù)中");
}
// 接觸結束void OnTriggerExit(Collider collider) {
Debug.Log("接觸結束");
}
// 碰撞開始void OnCollisionEnter(Collision collision) {
var name = collision.collider.name;Debug.Log("碰撞(zhuàng)物: " + name);
//var tag = collision.collider.tag;//Debug.Log("Tag is " + tag);
}
// 碰撞持續中(zhōng)void OnCollisionStay(Collision collision) {
//TODO:
}
// 碰撞結束void OnCollisionExit(Collision collision) {
//TODO:
}
當未勾選碰撞器的Is Trigger選項時汽車與球體發生碰撞,進入方法(fǎ)OnCollisionEnter,碰撞之後汽車(chē)產生被球體撞飛的效果:
如果(guǒ)將碰撞器的Is Trigger屬性選中,再次啟動遊戲讓球體與(yǔ)汽車產生接觸(chù),這時進入方法OnTriggerEnter。之後球體直接穿過汽車,但球體與汽車都沒有產生碰撞效果:
unity3d中(zhōng)的碰撞器和觸(chù)發器的區別?
碰撞器是(shì)觸發(fā)器的載體,而觸發器隻是碰撞器(qì)身上的一個屬(shǔ)性
當Is Trigger=false時,碰撞器根據(jù)物(wù)理引(yǐn)擎引發碰撞,產生碰(pèng)撞的效(xiào)果,可以調用OnCollisionEnter/Stay/Exit函數;
當(dāng)Is Trigger=true時,碰撞器被物(wù)理引擎所忽略,沒有碰撞(zhuàng)效果,可以調用OnTriggerEnter/Stay/Exit函數。
如果既要檢測到物體的接觸(chù)又不(bú)想讓碰撞檢測影響物體移動或(huò)要檢測一個物件是否經過(guò)空間中的某個區域(yù)這時就可以(yǐ)用到觸發器
例子:
碰撞器:有作用(yòng)力,如車被撞飛、皮球掉在地上又彈起效果
觸發器:沒有作(zuò)用力(lì),如人站在靠近門的位置,門自動打開