創作內容

78 GP

[Unity] 簡單瞭解「Collision碰撞」與「Trigger觸發」

作者:旭曜靈│2014-01-06 17:58:01│巴幣:1,558│人氣:85677
Unity是套非常好用的遊戲開發引擎,並且有提供免費版本給一般使用者,
內建的物理系統讓使用者不需寫長長的程式碼,
就能夠迅速設定好所有物件之間的碰撞關係,
做出讓角色走不過去的牆、或是可以射穿牆壁的子彈等等。

不過它的設定相當細,若是分不清其中差異,很容易就會陷入鬼打牆的窘境。
幸好這是個資訊發達的時代,網路上總有熱心人士分享資訊──


光看表格可能不夠直覺,也無法瞭解物件動靜的影響,
所以我以自己的實測心得解釋一下。

主要觀念──

1) 想要讓程式判斷兩個物件有接觸,則雙方都必需要有Collider(碰撞器),
並且正在動的一方一定要有Rigidbody(剛體)才有效,另一方有沒有剛體無所謂。
※也就是說,如果動的一方沒有剛體,它去撞的靜止一方即使有剛體,也是當作沒撞到。

2) 接下來有兩種方式判斷接觸,
一、Collision碰撞,造成物理碰撞,可以在碰撞時執行OnCollision函式。
二、Trigger觸發,取消所有物理碰撞,可以在觸發時執行OnTrigger函式。
所以兩個物件A跟B接觸時,不可能同時產生碰撞+觸發,最多產生其中一種,
但是可以辦到讓A跟B產生碰撞,A跟C產生觸發。

3) 產生接觸的設定方式如下──

一、Collision碰撞:雙方都有碰撞器,並且至少動的一方有剛體,
就會造成碰撞,可以執行OnCollision函式。
※但若雙方都勾了Kinematic運動學,或任一方勾了Trigger觸發器,則碰撞無效。

二、Trigger觸發:雙方都有碰撞器,並且至少動的一方有剛體,
並且至少其中一方的碰撞器有勾觸發器,就會造成觸發,可以執行OnTrigger函式。

4) 接觸後的函式又細分為Enter、Stay、Exit三種,
以Trigger為例,就是OnTriggerEnter、OnTriggerStay、OnTriggerExit
(Collision依此類推)。
Enter函式是當兩個物件接觸的瞬間,會執行一次這個函式;
Stay函式是當兩個物件持續接觸時,會不斷執行這個函式;
Exit函式是當兩個物件分開的瞬間,會執行一次這個函式。



細部解釋──

【Collider碰撞器】:
最重要的核心!只要有碰撞器就會對其他物件產生碰撞;
若自身要受到碰撞的話,則需要碰撞器+剛體,缺一不可。
若自身要受到程式Translate位移或Rotate旋轉,也至少需要碰撞器。

【IsTrigger觸發器】:
勾了就不允許自身受到/造成碰撞,也不會受到重力等物理作用力影響,
而是改為Trigger觸發,雙方碰到時會直接穿越並執行Trigger函式。
但自身還是可以受到程式位移或旋轉。

【Rigidbody剛體】:
允許自身受到碰撞,且動的一方要有剛體才允許產生Trigger觸發。
加了剛體的物件才會受到物理作用力,如受到重力而落下、被物理作用力推動/旋轉,
也無法主動穿越其他碰撞器,這都是受到剛體的影響。
而對方若是沒加剛體,對方就不會受到碰撞的作用力推擠,但仍然可以判斷雙方有碰撞。

【IsKinematic運動學】:
不允許自身受到碰撞,但還是會對其他物件造成碰撞。
也不會受到重力等物理作用力影響。
※雙方都勾運動學的話,雙方都不會受到碰撞,會直接穿越,
 因此會被視為沒有碰撞到,無法執行OnCollision函式。
※對自身而言,剛體+運動學的效果,就等同於不加剛體,
 唯一差異是「剛體+運動學」去撞「靜止的碰撞體」時,
 仍可以執行碰撞、觸發函式;
 但雙方都不加剛體的話,則無法執行碰撞、觸發函式。

【Constraints限制】:
自身受到碰撞時,勾選的位置(Position)、角度(Rotarion)不受力。
很類似把運動學拆成六個細項來設定,但唯一差別在於仍然算有碰撞
可以照常執行OnCollision函式。

【Drag空氣阻力】:提高數值可減少落下速度、被撞飛距離。

【Angular Drag角阻力】:提高數值可減少旋轉速度。



以上就是比較常用到的重要概念,只要照著實際操作一次就很容易明白了。

另外由於今天分享的是程式技術,
所以這個月預計還是會再寫一篇跟企劃有關的文章,請大家多多支持鼓勵唷!
引用網址:https://home.gamer.com.tw/TrackBack.php?sn=2300960
All rights reserved. 版權所有,保留一切權利

相關創作

同標籤作品搜尋:遊戲|程式|Unity

留言共 10 篇留言

Maghalia
不好意思想請問一下,我用了Cube去做BoxCollider隱形牆(未勾選IsTrigger),人物也有加RigidBody(未勾運動學(勾選也測試過) 但依然偶爾會"忽然"穿牆TT牆也確定沒有隙縫,不知道是哪方面的設定出問題...

09-09 17:37

旭曜靈
通常是因為牆太薄了,人物移動速度太快時就有可能穿牆,
可以把牆的厚度提升(XYZ軸都要注意)。09-09 18:04
Maghalia
請問厚度有大約的值嗎? 我從1設到3還是會穿牆@@" 設到3位置也要重調了 跑道內縮太多QQ

09-10 08:41

旭曜靈
簡單來說,穿牆的原因是人物移速太快,前一秒系統判斷人物還在牆前面,後一秒的座標已經越過去到了牆的另一邊,所以就穿牆了。只要牆的厚度設為每秒移動距離的數倍,穿牆機率就很低了。09-10 09:30
Maghalia
了解 非常感謝您的說明:) 我再試試

09-10 10:14

Maghalia
很抱歉一直打擾,我剛實測加厚也未加速依然會忽然穿牆QQ 是否就是車體本身程式設定的問題呢?

09-10 10:29

旭曜靈
可能的原因很多,建議把詳細設定拍圖貼上來,我比較容易看出問題在哪。
電腦Lag、或是切換全螢幕也都有可能造成碰撞判斷錯誤。09-10 18:10
Maghalia
好的 感謝您的耐心回覆 我會再多加測試檢查^^

09-11 12:03

旭曜靈
嗯嗯09-11 12:44
阿辰
感謝分享!!
這篇真的令我受益良多!!

04-22 21:36

旭曜靈
能幫上忙真是令人開心,也祝你開發遊戲順利!04-23 04:24
阿辰
謝謝^^囉!!

04-23 13:05

旭曜靈
不客氣!04-23 13:59
mid
食用

06-18 22:51

旭曜靈
謝謝06-19 13:26
暗黑炒蛋
優質好文,大推!
謝謝大大分享~

07-15 14:56

旭曜靈
不客氣,加油!07-15 23:54
蒲公英
請問我用Physics2D.IgnoreCollision寫在OnCollisionEnter2D
我要怎重新呼叫Collision

04-06 16:19

我要留言提醒:您尚未登入,請先登入再留言

78喜歡★YawLing 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:抄,還是不抄?... 後一篇:請、請不要來玩唷!── ...

追蹤私訊切換新版閱覽

作品資料夾

TsunYinBc台灣朋友
3/6/2024 好久沒上台灣巴哈了 因為香港開了所以回來看看~~~看更多我要大聲說昨天15:49


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】