2018年1月19日 星期五

[Unity] Unity入門教學(二) - 當物件撞上了物件

Unity入門教學(二)

在上次的物件移動中,球體之所以可以在地板上移動是因為球體跟地板這兩個物件中都帶有碰撞器(Collider)的零件,這個零件可以使物件實體化但並不具物理特性.

所有實體化的物件可以跟有剛體的物件產生碰撞的,預設的所有碰撞並不會觸發任何其他行為,在上一次的練習裡,一開始球體是會往下掉到地板上,當球體接觸到地板時,這兩者也只是接觸著而已,並沒有其他任何事情發生.

這次我們試著加入新的物件,讓球體碰撞該物件後,讓該物件消失.

首先在場景中新增一個Cube物件 (Game Object > 3D Object > Cube),把Position改為(2, 1, 2),或隨個人喜好.


接著在Cube裏加入一個Script,就命名為CollideCube好了.

開始編輯Script (滑鼠雙擊),把預設的Start跟Update兩個方法移除後,加入一個void OnCollisionEnter(Collision collision)的方法.

這個方法也是官方定義的,功能是用來偵測Collider的碰撞,這個方法通常是使用在被碰撞物件的身上. 當物件被碰撞時,會執行方法裡面的程式碼. 我們在裡面寫了一行Destroy(gameObject),Destroy是用來銷毀物件用,需要將你想銷毀的物件放進去執行就可以了,要注意的是放進去的資料型態一定是要GameObject才能執行. 試著存檔後執行看看吧.

附帶說明一下,OnCollision這系列會有三種方法可以使用,分別是OnCollisionEnter, OnCollisionStay, OnCollisionExit,分別代表著接觸到碰撞體的瞬間、碰撞後未分開及與碰撞體分開的瞬間這三種情況,可以視自己的需求使用. 在這邊也可以試試看把OnCollisionEnter改為OnCollisionExit,執行看看會有什麼不一樣吧.

大家在執行時有沒發現到,當我們使用碰撞使物件消失時,會有一點點的延遲產生,因為必須先讓球體撞到方塊後才會觸發摧毀方塊,這樣在這個遊戲上顯得有點不流暢,那麼該怎麼處理這種狀況呢?

我們先前提到Collider這個零件可以讓物件實體化,在Collider裡面有個設定叫做觸發器(IsTrigger)的選項,當這個選項被勾起時,這個物件將不再被實體化,而是變成了一個可觸發範圍,也就是這個物件會變成可被穿透的.

當觸發器被勾選時,原本在程式裡面所使用的OnCollision系列的方法自然就失效了,因為已經撞不到了,那該怎麼辦呢?? 官方另外提供了OnTrigger系列的方法可以使用,跟OnCollision系列一樣分為三個OnTriggerEnter、OnTriggerStay及OnTriggerExit,分別代表著剛接觸到這個觸發範圍的瞬間、停滯在觸發範圍內及離開觸發範圍的瞬間這三種狀況,在這裡,就讓大家自己試著去把碰撞改為觸發,親自體驗一下兩者的不同吧.


沒有留言:

張貼留言