1. 程式人生 > >碰撞器和觸發器

碰撞器和觸發器

知新樹 寧金峰


1、什麽是碰撞器

碰撞器是一群組件,它包含了很多種類,比如: Box Collider 盒碰撞器、Capsule Collider 膠囊碰撞器、Mesh Collider 網格碰撞器、Sphere Collider 球碰撞器 等等這一類組件,這些碰撞器應用的場合不同,但都必須加到GameObjecet身上。(如下圖):

技術分享

2、什麽是觸發器

技術分享

所謂觸發器,只需要在檢視面板中的碰撞器組件中勾選IsTrigger屬性選擇框。如下圖:

3、區別:
碰撞器
1)碰撞器有碰撞效果
2)IsTrigger=false
3)碰撞信息檢測回調函數

1.OnCollisionEnter( Collision other ) 當進入碰撞器(開始碰撞時)
2.OnCollisionStay( Collision other ) 當逗留碰撞器(一直碰撞時)
3.OnCollisionExit( Collision other) 當退出碰撞器(結束碰撞時)

觸發器
1)觸發器沒有碰撞效果
2)IsTrigger=true;
3)觸發信息檢測:

1.OnTriggerEnter( Collider other )當進入觸發器
2.OnTriggerExit( Collider other )當退出觸發器


3.OnTriggerStay( Collider other )當逗留觸發器
4、碰撞和觸發的必要條件

碰撞測試

1)兩個cube上面都添加了collider,遊戲運行發生了穿透

技術分享

2)我們為黃色cube添加rigidbody,取消rigidbody上面的重力選項

技術分享

技術分享

遊戲運行,我們發現黃色cube被彈飛,而紅色cube沒有發生改變

3)我們為紅色cube也加上rigidbody ,取消重力選項

技術分享

遊戲運行,兩個cube都被彈開了

碰撞總結

1、如果兩個物體,只要有一個沒有Collider,即使任意一個物體有rigidbody,都會發生穿越(即,沒Collider就穿越);

2、如果兩個物體都有Collider,有rigidbody的物體會發生碰撞,而沒有rigidbody的一方則不會受到影響(註意一下誰碰誰);

3、如果兩個物體都有Collider,無rigidbody的物體碰有rigidbody的物體,則並不會發生碰撞
(易忽略,單獨拿出來講。另外這種情況下,當高速移動無rigidbody的物體時,偶爾會出現發生碰撞的現象,不知道是不是unity的一個bug)
綜上,兩物體發生碰撞的必要條件是:
兩個物體都必須帶有碰撞器(Collider),其中至少一個物體帶有Rigidbody剛體。(只有帶Rigidbody剛體的一方會受到物理引擎的影響)
可能會有人想如果為物體都加上剛體不就不需要這麽糾結了嗎?
有兩方面原因:
一是遊戲場景物體很多,都加剛體,系統的開銷會很大;
二是有時候我就需要其中一個物體是不動的,比如地面。
註意:
1、在一次碰撞中,“剛接觸”和“接觸完”只被調用一次,而“碰撞中”則是在接觸時一直被調用。
2、函數的參數則是被撞的那個物體。我們可以通過此參數獲取被撞物體信息。

我們檢測一下回調函數:

我們首先創建一個這種場景

技術分享


我們給紅色小球添加rigidbody,勾選上重力選項,並添加腳本

技術分享

下圖為腳本內容:

技術分享

運行遊戲,輸出結果為:

技術分享

由此上面的測試我們可以清楚的看到三個方法的調用時機

其中other參數為碰撞到的物體

觸發測試

1、我們做碰撞測試的例子,我們創建一個下圖這樣的場景,把紅色cube的IsTrigger勾上(由於IsTrigger是觸發器身上的一個屬性,所以兩個物體都要加collider,我們暫且不加rigidbody,再紅色cube身上添加腳本)

技術分享

技術分享

運行遊戲我們發現紅色cube會穿過黃色cube但是沒有打印任何一句話。

所以觸發器的觸發條件是基於碰撞的基礎上的,我們分別給兩個cube加上rigidbody,取消重力選項

技術分享

技術分享紅色cube穿過黃色cube並且調用了觸發器的三個回調函數,其中

逗留函數調用了50次,說明紅色cube再穿過黃色cube的時候(重疊)期間,一直再重復調用逗留觸發器

觸發結論
1、和碰撞不同,觸發無論誰碰誰,結果都一樣;
2、觸發的必要條件:至少有一個碰撞器勾選了IsTrigger,至少有一個物體具有剛體,才會觸發;
3、碰撞和觸發的聯系和區別以及何時使用它們
由於碰撞是可以發生物理效果的同時觸發事件,而觸發是不發生物理效果的情況下觸發事件;
所以,還是具體情況具體對待,知道了原理就靈活運用吧。
舉個例子來說吧。
足球射到墻上會發生碰撞,而足球出界了並不會發生碰撞,而是裁判吹哨這個事件被觸發。
那麽你就可以在墻上加一個碰撞體不勾選IsTrigger,而出界線加一個Collider並勾上IsTrigger。

碰撞和檢測的相關的註意點
兩個註意
註意1:
兩個物體發生碰撞,如果要檢測到碰撞信息,那麽其中必有一個物體既帶有碰撞器,又帶有剛體,且檢測碰撞信息的腳本必須附著在帶有剛體的碰撞器上。

註意2:
兩個GameObject發生碰撞,要想檢測到觸發信息,最少要有一個剛體碰撞器並且勾選了IsTrigger復選框,另一個最少要有一個碰撞器組件,此時檢測碰撞的腳本必須附加在那個帶有剛體的觸發器上。


本文出自 “13233523” 博客,請務必保留此出處http://13243523.blog.51cto.com/13233523/1980669

碰撞器和觸發器