Collider(碰撞器)與IsTrigger(觸碰器)詳解

1、什么是碰撞器?

描述了物體可被碰撞的邊界,以及碰撞過程中相互影響效果。
碰撞效果:
兩個游戲對象碰在一起,通過物理引擎產生類似現實的效果
種類?:
盒碰撞器(Box Collider)
?橢圓碰撞器(Sphere Collider)
?膠囊碰撞器(Capsule Collider)?
車輪碰撞器(Wheel Collider):專用于車輛?
網格碰撞器(Mesh Collider)?
地形碰撞器(Terrain Collider)

(1)網格碰撞器(Mesh Collider)

通過獲取網格對象并在其基礎上構建碰撞碰撞。更加精細,但是會使用更多系統資源。開啟Convex參數的網格碰撞體才可以與其他網格碰撞體發生碰撞。


網格碰撞器

通常兩個網格碰撞體之間不會發生碰撞,但是它們都可以與基本碰撞體發生碰撞
如果要讓它發生碰撞:開啟Convex屬性


圖片1.png
(2)盒碰撞器(Box Collider)

盒子碰撞器是一個立方體外形的基本碰撞體,該碰撞體可以調整為不同大小的長方體,可以做門,墻等

盒碰撞器
(3)橢圓碰撞器(Sphere Collider)

橢圓碰撞器是一個基本球形的基本碰撞體,球形碰撞體的三維大小可以均勻的調節,適用于落石,球形障礙物。


橢圓碰撞器
(4)膠囊碰撞器(Capsule Collider)

是由一個圓柱體和與其相連的兩個半球體組成。


膠囊碰撞器
(5)車輪碰撞器(Wheel Collider):專用于車輛

是一種針對地面車輛的特殊碰撞體,有內置的碰撞檢測、車輪物理系統及有滑胎摩擦的參考體。


車輪碰撞器

2、碰撞方法

我們讓紅色小球去碰撞膠囊體。

碰撞方法
情形一
Paste_Image.png
當兩個游戲對象都擁有剛體和碰撞器,不管腳本掛載哪個游戲對象身上都可以進入OnCollision(碰撞)方法,兩者都掛在碰撞器腳本都會調用各自身腳本上的OnCollision(碰撞)方法。
下面是打印結果:
打印結果
情形二
Paste_Image.png
白色膠囊沒有剛體,但是有碰撞器,也有碰撞器腳本,一開始不會進入自身的碰撞器方法。
紅色的小球有剛體,有碰撞器,也有碰撞器腳本,一開始就會進入自身的碰撞器方法打印與地面的接觸。
當兩個物體發生碰撞,兩者腳本中的碰撞器方法都會被觸發打印
打印結果:
首先一開始發現只有有剛體的紅色小球打印了自己的碰撞器方法
游戲剛開始

小球與膠囊發生碰撞后,發現各自的腳本都能調用各自的碰撞方法了。
兩個游戲對象碰撞后
情形三
橢圓沒有碰撞器
紅色的小球有剛體,有碰撞器,也有碰撞器腳本,一開始就會進入自身的碰撞器方法打印與地面的接觸。而膠囊怎不會打印任何方法二者相碰,一擁有剛體與碰撞器并且身上掛載碰撞器方法的紅色小球遇到沒有碰撞器的膠囊(不管有沒有剛體)會穿透過去。
打印結果:
打印結果

情形
情形四
都沒有剛體只有碰撞器時
當碰撞兩方只有碰撞器沒有剛體會互相穿過
結果也是顯而易見:不會打印任何東西

總結:
1、只要有剛體有碰撞器,并且與其他碰撞器碰撞就會進入自身的碰撞器方法
2、沒有剛體,有碰撞器的物體被一個擁有剛體的碰撞器碰撞,都會調用自身的碰撞器方法。
3、沒有剛體的兩個碰撞器相撞不會調用任何碰撞器方法

最終結論:  
碰撞器(Collider)不需要剛體(Rigidbody)
剛體(Rigidbody)要發生碰撞,一定需要碰撞器(Collider)
碰撞器決定了碰撞發生時的邊界條件
剛體決定了碰撞發生后的物體的運動效果
沒有碰撞器的剛體,會在物理模擬中相互穿透。

3、觸發器方法

觸發器方法
情形一:
都沒有剛體時
當兩方沒有剛體,只有觸發器,不會打印觸發器方法。無打印:
情形二
有剛體有觸發器
當有剛體的觸發器,一開始就會與其相撞的物體產生交互,穿透,并打印觸發方法。打印結果:
打印其觸發方法
情形三
一方有剛體有觸發器而另一方都沒有
當紅色小球有觸發器有剛體而膠囊體沒有觸發器沒有剛體的時候,兩個游戲對象相互碰撞,兩個游戲對象會打印各自的觸發方法,打印結果如下:
打印結果
情形四
當兩方都有觸發器并且都擁有剛體,碰撞的時候會打印各自的觸發器方法
結果
只要一方是觸發器,另一方有碰撞體就會觸發各自的觸發器方法。

結論:
1、想要打印觸發器方法,必須有一方是觸發器,必須有一方帶有剛體。二者缺一不可。
2、雙方都是觸發器,或者其中一方是觸發器,另一方是碰撞器,都不會打印。
3、只要一方是觸發器,并且有剛體組件,不管另一方是碰撞體還是觸發器都會打印各自的觸發器方法。
4、一般我們將觸發器方法寫在角色碰到的物體上,角色一般不參與觸發方法。只寫碰撞方法。

4、碰撞器和觸發器的區別?

****1、****碰撞器是觸發器的載體,而觸發器只是碰撞器身上的一個屬性。
****2、****當IsTrigger=false時,碰撞器根據物理引擎引發碰撞,產生碰撞的效果,可以調用OnCollisionEnter/Stay/Exit函數;
****3、****當IsTrigger=true時,碰撞器被物理引擎所忽略,沒有碰撞效果,可以調用OnTriggerEnter/Stay/Exit函數。
****4、****如果既要檢測到物體的接觸又不想讓碰撞檢測影響物體移動或要檢測一個物件是否經過空間中的某個區域這時就可以用到觸發器。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容