初心者培訓班 - Unity基本觀念

Unity基本功(2) – Collider 碰撞器

※中肯辭典

(註:有別於官方文件上的嚴謹說明,在此以工程師的角度來簡短說明此元素的特質與使用時機。)

讓物體開始在場面上有存在感(?)可以撞東西、被撞,以及被玩家點擊。



上次提到了Rigidbody剛體是啟動物體的物理性質的核心元素,然而,光是Rigidbody的添加還不足以實作玩家印象中的「撞到牆壁」、「吃到道具」等行為,因為實際的碰撞面積、碰撞範圍及碰撞對象(如:玩家不能直接穿越怪物,但子彈跟子彈不能撞在一起)還沒有被定義,而Collider就是用來實作這些系統。

螢幕快照 2017-07-03 上午12.37.44

選定一個物件後,在Inspector中按下「Add Component」並進入「Physics 2D」類別,就會看到滿滿的Collider結尾的元素XD其實他們主要是形狀的差別,Box, Circle, Edge跟Polygon是比較常用到的,但其實運用的概念都一樣,我在此以Box Collider來做示範。

螢幕快照 2017-07-03 上午12.47.12.png

加入Collider元件後,我們就會在畫面上看到一圈綠色的框框,這就是碰撞的偵測區域。這裡有個重要的觀念是:物體之間會不會發生碰撞,是以綠線部分Collider的區塊做判斷,跟物件本身的外觀沒有關聯。所以依照圖片中的狀況,這隻小雞可能有結界護體,看起來還沒撞到東西就把其他人彈開了XD,為了讓遊戲的行為看起來比較合理,我們要點擊Collider設定中「Edit Collider」左邊的這個圖案。

螢幕快照 2017-07-03 上午12.52.15.png

點擊後就會發現綠色框框上多了幾顆正方形節點,只要左鍵按住節點做拖曳,就可以依照自己的喜好來設定碰撞範圍囉!

此外,也可以直接從數值中的”Offset”和”Size”來做調整:

Offset指的是整個外框的座標,在面積不變的情況下一次搬動整個正方形。

Size則是針對碰撞範圍的面積做調整。

接下來介紹Collider設定裡其他比較重要的選項:

●Material

和Rigidbody裡的Material功能相同,可以加入Physic Material物體材質來針對碰撞體的摩擦力、彈性來做設定。

●Is Trigger 

當這個選項打勾後,其他物體在遇見它時就不會產生真正物理上的碰撞,但是依舊可以偵測接觸的狀況,並透過程式碼來產生希望達成的行為。

如:玩家碰到道具並不會被撞開,但是會有事件發生。

 

有了Rigidbody和Collider的搭配後,就可以完成物體撞擊的效果了!在此提供幾個重要的程式碼。

●物體發生碰撞時,希望達到的動作

螢幕快照 2017-07-03 上午1.06.12.png

碰撞時希望做到的事情,必須寫在名為OnCollisionEnter2D的function裡,並且接收Collision2D型別的參數,代表的是與你相撞的對象。

OnCollision系列的函數有分為以下三類:

OnCollisionEnter2D  當碰撞發生的第一個瞬間要發生的事情。

如:玩家吃到道具就馬上移動加速

OnCollisionStay2D   只要維持在碰撞的狀態,就一直呼叫裡面的程式碼。

如:角色踩在陷阱裡頭時持續扣血。

OnCollisionExit2D   當碰撞的狀態結束時呼叫的程式碼。

如:玩家角色跳出水面時,給予一個向上的加速度。

圖中我使用了一個指令叫做Debug.Log(“內容內容內容”),如同這段程式碼的名字,是Debug時相當好用的工具XD只要寫好你要的內容,當遊戲有正常執行到你的code時,就會在unity介面裡的”Console”區塊顯示資訊,如圖中右上角。



進階例題:我要怎麼控制同類型的物件不要撞在一起?

在達到這個效果前,我們要先有Layer(階層)的概念。

螢幕快照 2017-07-03 上午1.19.11.png

雖然在2D遊戲裡,所有的物件看起來都在同一個平面上,但是為了方便實作遊戲的系統,每個物件都可以使用Tag, Layer等標籤來做規範。在InspectorAdd裡點開Layer的選單(在Tag旁邊,被我擋住了) ,然後進入Add Layer。

螢幕快照 2017-07-03 上午1.19.03

假設今天我想要幫我的主角小雞做客製化的設定,我就在Layer裡面加一個”Chicken”類別。Layer的順序編號是沒有任何影響的,放心!

螢幕快照 2017-07-03 上午1.21.40.png

新增完之後回到Inspector,就能順利更改小雞的Layer了!

 

問:我想讓兩隻小雞不要相撞,該怎麼做呢?

首先,我們先從Unity最上方的選單開啟一個頁面:Edit -> Project Settings -> Physics 2D

螢幕快照 2017-07-03 上午1.24.03.png

點開後就會看到這一串恐怖的係數,先不要緊張,我們的重點是下面的矩陣XD

順帶一提,第一欄的Gravity就是控制重力方向、重力值的地方!透過這個欄位的設定,我們也可以讓所有的物體都受到來自右上方的引力牽引之類的。

螢幕快照 2017-07-03 上午1.25.57.png

這個矩陣就是控制「誰跟誰應該要撞在一起」的關鍵,打勾代表的是「會彼此影響」。

如我們看到最底下的那個欄位,就是代表”Chicken”與”Chicken”是否會互相產生撞擊,只要把這個勾勾取消掉,小雞與小雞之間的Collider就不會互相偵測了!

 

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s