碰撞器:OnCollisionEnter
觸發器:OnTriggerEnter
條件:至少有一個物體有Rigidbody剛體組件,兩個物體都要有Collider碰撞器組件
一、簡單測試OnCollisionEnter和OnTriggerEnter
在場景創建Cube和Sphere,添加Rigidbody和Collider組件,並掛載腳本監聽“void OnCollisionEnter(Collision collision)”和“void OnTriggerEnter(Collider other)”
public class Test : MonoBehaviour
{
void OnCollisionEnter(Collision collision)
{
Debug.Log(gameObject.name + " - OnCollisionEnter - " + collision.gameObject.name);
}
void OnTriggerEnter(Collider other)
{
Debug.Log(gameObject.name + " - OnTriggerEnter - " + other.gameObject.name);
}
}
1. 兩個物體的Collider組件的IsTrigger選項都不勾選,兩個組件都是碰撞器,掛載的腳本都會觸發“OnCollisionEnter”函數;
2. 一個勾選IsTrigger選項,一個不勾選,一個作爲碰撞器,一個作爲觸發器,掛載的腳本都會觸發“OnTriggerEnter”函數;
3. 兩個都勾選IsTrigger選項,都作爲觸發器,掛載的腳本都會觸發“OnTriggerEnter”函數;
二、OnCollisionEnter、OnTriggerEnter與其子物體的聯繫
有些情況下,子物體的碰撞器/觸發器會觸發父物體的“OnCollisionEnter”、“OnTriggerEnter”函數
比如,父物體添加Rigidbody剛體,沒有碰撞器,子物體沒有Rigidbody,有碰撞器,父物體會觸發“OnCollisionEnter”,子物體不會。
如果,父物體添加Rigidbody剛體,有碰撞器,子物體沒有Rigidbody,有碰撞器,父物體會觸發“OnCollisionEnter”,子物體仍然不會。
所以:有Rigidbody組件的物體,當自身或子物體的碰撞器發生碰撞,會執行“OnCollisionEnter”;當自身或子物體的觸發器發生碰撞,會執行“OnTriggerEnter”。
不過,給父物體和子物體分別添加RigidBody組件,在碰撞器和觸發器執行時,會分別檢測,調用對應函數。
如果父物體要屏蔽子物體碰撞器/觸發器,可以給子物體添加Rigidbody。
是不是可以說:兩個物體都有Collider碰撞器組件,至少有一個物體或其父物體有Rigidbody剛體組件,就可以發生碰撞?