碰撞體(Collider)是遊戲物件的元件之一
它可以讓所依附的遊戲物件
對其它碰撞體產生碰撞行為
而那些遊戲物件必須有剛體(Rigidbody)元件
碰撞體有不同的形狀與類別
在場景視圖內它們會以綠色外框形狀顯示
它們有這些主要的形狀
球形, 柱形和方形
如果需要更複雜的形狀有兩個方法
你可以用多個幾何物件
將它們的碰撞體放入不同的物件
最後在階層裡結合成為新的碰撞結構
舉例來說, 這個工作檯由許多不同的
碰撞體放在各部位組成一個碰撞結構
另外一個方式是使用網格碰撞體
網格碰撞體會和網格的形狀相同
右邊的這個工作檯並沒有碰撞體
因為它使用了網格碰撞體
我們不建議使用網格碰撞體
因為網格碰撞體是依照網格形狀所產生
所以可能會造成太複雜的碰撞結構
進而影響遊戲的效能
這也是為甚麼通常
我們會使用組合式碰撞體的原因
此外還有第三種方式
來產生幾何形狀碰撞體
先簡化物件的模型
然後將模型製作成網格碰撞體即可
在這個範例裡我們所用的是
一個複雜的機器手臂
它擁有很複雜的網格
但我們並不希望它的網格碰撞體如此複雜
所以我們建立了第二組簡化的網格模型
然後用這些簡化的模型製作網格碰撞體
像是這個機器爪的網格
比我們為它產生的網格碰撞體還要複雜
這是用兩個FBX檔來完成
一個是原始的機器手臂
和簡化過的幾何模型
然後我們在每一個子物件裡
都加入了網格碰撞體
然後將簡化過的幾何模型
拖曳到對應的網格碰撞體的網格(Mesh)
這樣一來,我們就可以達到碰撞的需求
同時也避免效能的問題
當碰撞在遊戲引擎裡發生時
碰撞體會呼叫OnCollisionEnter事件
在這個場景我們的球體物件
附有一個球形碰撞體和剛體
剛體有重量(Mass)和重力(Gravity)屬性
當我播放時, 球體物件會掉落
並碰到其他物件
我們的方體物件附有一個方形碰撞體
而在掉落的球體上我們加入了這個程式腳本
這個程式腳本進行了三個碰撞事件的檢查
碰撞進入(OnCollisionEnter)
碰撞持續(OnCollisionStay)
和碰撞結束(OnCollisionExit)
當這些事件被呼叫時我用Debug.Log語法
在控制台(Console)寫入資訊
提示進入、停留和離開的訊息
所以當我們檢視控制台內容時
你會先看到碰撞進入
接下來碰撞持續了一陣子, 最後碰撞結束
如果我們將遊戲暫停
我們可以詳細的檢視這個範例
當我單步執行每一幀
你可以看到當碰撞開始時
控制台顯示了碰撞進入的訊息
代表OnCollisionEnter事件剛被呼叫
當我繼續後換OnCollisionStay被呼叫
控制台顯示了碰撞持續的訊息
因為兩個碰撞體還保持在碰撞的階段
直到兩個碰撞體不再有碰撞行為
OnCollisionExit事件就會被呼叫
要注意的是,如果要觸發碰撞(OnCollision)
兩個碰撞的物件之中一個必須有剛體元件