1 00:00:00,000 --> 00:00:02,084 碰撞體(Collider)是遊戲物件的元件之一 2 00:00:02,084 --> 00:00:05,585 它可以讓所依附的遊戲物件 對其它碰撞體產生碰撞行為 3 00:00:05,585 --> 00:00:09,585 而那些遊戲物件必須有剛體(Rigidbody)元件 4 00:00:10,209 --> 00:00:12,828 碰撞體有不同的形狀與類別 5 00:00:12,828 --> 00:00:16,235 在場景視圖內它們會以綠色外框形狀顯示 6 00:00:16,459 --> 00:00:31,062 它們有這些主要的形狀 球形, 柱形和方形 7 00:00:32,663 --> 00:00:35,273 如果需要更複雜的形狀有兩個方法 8 00:00:35,474 --> 00:00:39,708 你可以用多個幾何物件 將它們的碰撞體放入不同的物件 9 00:00:39,708 --> 00:00:42,852 最後在階層裡結合成為新的碰撞結構 10 00:00:42,852 --> 00:00:50,682 舉例來說, 這個工作檯由許多不同的 碰撞體放在各部位組成一個碰撞結構 11 00:00:50,782 --> 00:00:54,156 另外一個方式是使用網格碰撞體 12 00:00:54,156 --> 00:00:57,686 網格碰撞體會和網格的形狀相同 13 00:00:58,186 --> 00:01:02,620 右邊的這個工作檯並沒有碰撞體 因為它使用了網格碰撞體 14 00:01:02,620 --> 00:01:08,620 我們不建議使用網格碰撞體 因為網格碰撞體是依照網格形狀所產生 15 00:01:08,620 --> 00:01:15,611 所以可能會造成太複雜的碰撞結構 進而影響遊戲的效能 16 00:01:15,794 --> 00:01:19,693 這也是為甚麼通常 我們會使用組合式碰撞體的原因 17 00:01:20,076 --> 00:01:24,463 此外還有第三種方式 來產生幾何形狀碰撞體 18 00:01:24,463 --> 00:01:29,664 先簡化物件的模型 然後將模型製作成網格碰撞體即可 19 00:01:29,997 --> 00:01:33,997 在這個範例裡我們所用的是 一個複雜的機器手臂 20 00:01:34,331 --> 00:01:39,929 它擁有很複雜的網格 但我們並不希望它的網格碰撞體如此複雜 21 00:01:40,162 --> 00:01:48,279 所以我們建立了第二組簡化的網格模型 然後用這些簡化的模型製作網格碰撞體 22 00:01:48,279 --> 00:01:53,275 像是這個機器爪的網格 比我們為它產生的網格碰撞體還要複雜 23 00:01:53,625 --> 00:01:55,547 這是用兩個FBX檔來完成 24 00:01:55,547 --> 00:02:01,557 一個是原始的機器手臂 和簡化過的幾何模型 25 00:02:01,742 --> 00:02:05,591 然後我們在每一個子物件裡 都加入了網格碰撞體 26 00:02:05,591 --> 00:02:09,121 然後將簡化過的幾何模型 拖曳到對應的網格碰撞體的網格(Mesh) 27 00:02:09,206 --> 00:02:14,935 這樣一來,我們就可以達到碰撞的需求 同時也避免效能的問題 28 00:02:15,602 --> 00:02:22,024 當碰撞在遊戲引擎裡發生時 碰撞體會呼叫OnCollisionEnter事件 29 00:02:22,307 --> 00:02:28,928 在這個場景我們的球體物件 附有一個球形碰撞體和剛體 30 00:02:29,061 --> 00:02:31,695 剛體有重量(Mass)和重力(Gravity)屬性 31 00:02:31,961 --> 00:02:36,108 當我播放時, 球體物件會掉落 並碰到其他物件 32 00:02:36,608 --> 00:02:39,725 我們的方體物件附有一個方形碰撞體 33 00:02:43,061 --> 00:02:47,334 而在掉落的球體上我們加入了這個程式腳本 34 00:02:47,733 --> 00:02:50,383 這個程式腳本進行了三個碰撞事件的檢查 35 00:02:50,383 --> 00:02:51,900 碰撞進入(OnCollisionEnter) 36 00:02:51,900 --> 00:02:53,417 碰撞持續(OnCollisionStay) 37 00:02:53,417 --> 00:02:54,935 和碰撞結束(OnCollisionExit) 38 00:02:55,135 --> 00:02:59,418 當這些事件被呼叫時我用Debug.Log語法 在控制台(Console)寫入資訊 39 00:02:59,568 --> 00:03:05,805 提示進入、停留和離開的訊息 40 00:03:09,809 --> 00:03:11,936 所以當我們檢視控制台內容時 41 00:03:11,936 --> 00:03:16,946 你會先看到碰撞進入 接下來碰撞持續了一陣子, 最後碰撞結束 42 00:03:17,162 --> 00:03:21,635 如果我們將遊戲暫停 我們可以詳細的檢視這個範例 43 00:03:22,135 --> 00:03:24,431 當我單步執行每一幀 44 00:03:25,682 --> 00:03:30,315 你可以看到當碰撞開始時 控制台顯示了碰撞進入的訊息 45 00:03:30,315 --> 00:03:32,315 代表OnCollisionEnter事件剛被呼叫 46 00:03:32,815 --> 00:03:37,259 當我繼續後換OnCollisionStay被呼叫 47 00:03:37,259 --> 00:03:43,344 控制台顯示了碰撞持續的訊息 因為兩個碰撞體還保持在碰撞的階段 48 00:03:43,344 --> 00:03:51,925 直到兩個碰撞體不再有碰撞行為 OnCollisionExit事件就會被呼叫 49 00:03:53,142 --> 00:04:00,016 要注意的是,如果要觸發碰撞(OnCollision) 兩個碰撞的物件之中一個必須有剛體元件