前言
這篇文章將會講述碰撞事件的撰寫,跟碰撞事件有關的函式共有六種,分別為 OnCollisionEnter/Stay/Exit 和 OnTriggerEnter / Stay /Exit ,本篇文章將會講述通用的邏輯。
Collider | 碰撞體
在之前我從組件(Component)和程式(c#)來介紹碰撞相關的程式碼和遊戲組建,今天這篇文章會面向「使用程式碰撞體撰寫事件」,比較基礎的知識可以參考下列文章:
Tag | 標籤
同時今天會講述到標籤的使用,這是在 Unity 介面中很常看到的東西,掛載在遊戲物件中,詳請可以參考之前的一篇文章:
OnCollision/Trigger... | 碰撞事件和觸發事件
在程式撰寫中,會很頻繁的使用 Collider 來進行碰撞或觸發的撰寫,接下來會從定義開始,再到應用進行介紹。
定義
Void OnTriggerEnter(Collider other){ Debug.Log("發生碰撞事件"); }
碰撞事件和觸發事件簡稱本事件,上述程式碼是 OnCollisionEnter 的函式,當符合條件的遊戲物件剛觸碰到本物件,則會呼叫一次本事件,其中 other 的資料型態是 Collider ,遊戲物件會被儲存在這個欄位,有點難懂嗎?接下來讓我們從頭開始。
簡單配置
首先,我們有一個遊戲物件,像是遊戲的主角,上面掛載著 Rigidbody 和 Collider ,同時,有另一個掛載 Collider 的物件,這個 Collider 中的 isTrigger可能被勾選。
這兩個物件中,無論程式腳本掛在哪一個物件中,這個碰撞 / 觸發的機制都會成立,因此都會運作,只是讓程式運作的主體不同。
應用
接下來會使用玩家跟陷阱的事件作為介紹。
1. 建立一個能移動的玩家,無論是使用 Cube 或製作一個人物都可以,讓他掛載 Rigidbody 和 Collider 。
2. 建立一個遊戲物件,裝上 Collider,並把遊戲物件命名為陷阱(trap)。
3. 創建一個程式腳本,放進玩家或陷阱,把裡面的 Start 和 Update 刪除,並新增一個 OnCollisionEnter 的函式,這個函式跟前面刪掉的兩個函式相同,屬於 Unity 官方內建,因此如果沒辦法連接到 Unity 資料庫,那你應該是寫錯了。
4. 此時已經可以觸發事件了,如果你用 Debug.Log 去確認,你會發現當玩家跟陷阱碰撞後,這個函式已經可以運作了。
5. 在事件內添加 If 判斷句,直接使用後面的 other ,此時你會發現可以調動這個 Collision 的其他資訊,像是 GameObject 、 Tag 等等,此時你可以藉此控制碰撞的對象,此時你撰寫程式碼抓取特定 Tag,如果 Unity 不存在這個Tag 的名稱,你依然可以先用程式碼去抓取。
6. 在 Unity 中 Tag 和 Layers 的部分,新增一個 Tag ,命名前面抓取的 Tag 名稱,並讓沒放程式腳本的另一個物件擁有這個 Tag。
7. 至此,你的玩家可以在碰觸到陷阱時觸發事件,而碰觸到其他物件不會有任何反應了。
後記
至此,碰撞的基礎使用已經都講解完了,如果未來有想到更專業的使用方式才會有新的章節。
參考資料
瓶裝雪