unity3d的碰撞檢測及trigger


A、基本概念 

 要產生碰撞必須為游戲對象添加剛體(Rigidbody)和碰撞器,剛體可以讓物體在物理影響下運動。碰撞體是物理組件的一類,它要與剛體一起添加到游戲對象上才能觸發碰撞。如果兩個剛體相互撞在一起,除非兩個對象有碰撞體時物理引擎才會計算碰撞,在物理模擬中,沒有碰撞體的剛體會彼此相互穿過。

物體發生碰撞的必要條件:
  兩個物體都必須帶有碰撞器(Collider),其中一個物體還必須帶有Rigidbody剛體。
 
在unity3d中,能檢測碰撞發生的方式有兩種,一種是利用碰撞器,另一種則是利用觸發器。
 
碰撞器:一群組件,它包含了很多種類,比如:Box Collider(盒碰撞體),Mesh Collider(網格碰撞體)等,這些碰撞器應用的場合不同,但都必須加到GameObjecet身上。
觸發器,只需要在檢視面板中的碰撞器組件中勾選IsTrigger屬性選擇框。
 
觸發信息檢測:
  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)  當逗留碰撞器
 
B、何時觸發?

下面就是我做的測試情況,都是A物體去撞B物體。

一、A(碰撞體),B(沒有碰撞體,無論有沒有剛體),沒有觸發事件。

二、A(碰撞體),B(碰撞體),沒有觸發事件。

二、A(碰撞體和剛體,開啟IsTrigger),B(碰撞體,關閉IsTrigger),雙方都能收到觸發事件。

三、A(碰撞體和剛體,關閉IsTrigger),B(碰撞體,開啟IsTrigger),雙方都能收到觸發事件。

四、A (碰撞體,關閉IsTrigger),B(碰撞體和剛體,開啟IsTrigger),沒有觸發事件。

五、A (碰撞體,開啟IsTrigger),B(碰撞體和剛體,關閉IsTrigger),沒有觸發事件。

 

額外實驗:

六、A(碰撞體和剛體,開啟IsTrigger)自由下落,B(碰撞體)撞擊A,雙方都能收到觸發事件。

 

根據上面的實驗得出,如果要收到觸發事件,必須滿足如下三個條件:

1、必須都要有碰撞器組件(Collider),其實上面的碰撞事件同樣也需要這個前提條件。

2、必須有一個物體帶剛體組件,並且處於運動狀體中(包括主動運動去撞擊別人和在運動過程中被別人撞擊)。

3、兩個碰撞器中至少有一個開啟了IsTrigger。

 

此外還有兩點:

一、產生觸發事件的兩個物體會相互穿越,准確的說是因為開啟IsTrigger那個物體會被物理引擎鎖忽略掉,所以會產生兩個物體穿越的情況。

二、兩個對象要么都收到碰撞事件,要么都收到觸發事件,不會出現一個收到觸發事件,一個收到碰撞事件的情況。

 

還有一個經驗點就是,在控制一個物體A去撞另一個物體B時,不要直接去修改物體A的Transform的position屬性,因為你會發現如果即使兩者發生了碰撞也還是會穿越的,原因就在於我們是直接設置的坐標,如果物體A有剛體組件的話,應該用AddForce,給物體添加一個力,然后讓物理引擎去讓物體動,此時如果發生了碰撞的話,就不會穿越了。

 

碰撞的效果:

移動的剛體碰撞器VS靜止的靜態碰撞器

有碰撞效果,具體為:對於移動的剛體碰撞器在遇到靜態碰撞器后會產生物理效果,如反彈、無法前進等;對於靜止的靜態碰撞器,會產生輕微的碰撞效果,如輕微的晃動,但是不會移動。
 
 

移動的剛體碰撞器VS靜止的剛體碰撞器

有碰撞效果,對於兩個物體都出現正常的物理效果,如反彈等。
 
 

移動的靜態碰撞器VS靜止的運動學剛體碰撞器

沒有任何碰撞效果。運動學剛體碰撞器是不受到任何外力作用的。
 
 

移動的運動學剛體碰撞器VS靜止的靜態碰撞器

沒有任何碰撞效果。運動學剛體碰撞器是不受到任何外力作用的。
 
 

移動的運動學剛體碰撞器VS靜止的剛體碰撞器

有碰撞效果,但僅剛體碰撞器有碰撞效果,如反彈等,運動學剛體碰撞器不受力的作用。
 
 

移動的剛體碰撞器VS靜止的運動學剛體碰撞器

有碰撞效果,但僅剛體碰撞器有碰撞效果,如反彈等,運動學剛體碰撞器就像一堵牆一樣一動不動。
 
 

移動的運動學剛體碰撞器VS靜止的運動學剛體碰撞器

兩個太上皇相見了會怎么樣呢?沒有任何反應……就像兩個靜態碰撞器一樣。

碰撞信息和觸發信息

 
對於碰撞時是否會發出碰撞函數(或觸發信息),可以見下表。碰撞信息是指OnCollisionEnter() OnCollisionStay()和 OnCollisionExit()這三個函數,而觸發信息指的是OnTriggerEnter() OnTriggerStay和OnTriggerExit()三個函數。
 
 
 
 
Collision detection occurs and messages are sent upon collision
碰撞后有碰撞檢測並有碰撞信息發出
  Static Collider
靜態碰撞器
Rigidbody Collider
剛體碰撞器
Kinematic 
Rigidbody Collider
運動學剛體碰撞器
Static 
Trigger Collider
靜態觸發碰撞器
Rigidbody 
Trigger Collider
剛體觸發碰撞器
Kinematic Rigidbody 
Trigger Collider
運動學剛體觸發碰撞器
Static Collider 靜態碰撞器   Y        
Rigidbody Collider 剛體碰撞器 Y Y Y      
Kinematic Rigidbody Collider 
運動學剛體碰撞器
  Y        
Static Trigger Collider
靜態觸發碰撞器
           
Rigidbody Trigger Collider
剛體觸發碰撞器
           
Kinematic Rigidbody Trigger Collider
運動學剛體觸發碰撞器
           
Trigger messages are sent upon collision
碰撞后有觸發信息
  Static Collider
靜態碰撞器
Rigidbody Collider
剛體碰撞器
Kinematic 
Rigidbody Collider
運動學剛體碰撞器
Static 
Trigger Collider
靜態觸發碰撞器
Rigidbody 
Trigger Collider
剛體觸發碰撞器
Kinematic Rigidbody 
Trigger Collider
運動學剛體觸發碰撞器
Static Collider 靜態碰撞器         Y Y
Rigidbody Collider 剛體碰撞器       Y Y Y
Kinematic Rigidbody Collider
運動學剛體碰撞器
      Y Y Y
Static Trigger Collider 靜態觸發碰撞器   Y Y   Y Y
Rigidbody Trigger Collider
剛體觸發碰撞器
Y Y Y Y Y Y
Kinematic Rigidbody Trigger Collider
運動學剛體觸發碰撞器
Y Y Y Y Y Y


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM