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

Unity基本功(5) – 使物件消失和被摧毀

※中肯辭典

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

常見的關鍵小指令,讓畫面上的物件在觸發特定條件後消失!



不論是在玩打磚塊時,磚塊被球撞到,或是玩馬力歐時香菇被踩扁消失,「擊破」、「排除障礙」等行為在各種遊戲中都十分常見,也是遊戲開發初期就應該會需要的技巧。

先撇開磚塊被撞到後粉碎的動畫效果,這是屬於Animation的部分留待日後再介紹,這次我們要討論的是:

要如何把畫面上的物件弄不見?

做法並不複雜,透過簡單的2、3行程式碼就能搞定。

讓我們延續前幾篇小雞的範例,並且加入幾個障礙物。

螢幕快照 2017-07-06 上午12.51.18.png

 

首先,把障礙物的素材拉近Inspector,在他們底下各自加入一個Script,並且輸入以下程式碼:

螢幕快照 2017-07-06 上午12.53.22.png

運用前幾篇講過的碰撞偵測,額外開一個OnCollisionEnter2D函數(記得要先在物件上加入Collider!),並且使用一個特別的功能叫做

this.gameObject.SetActive(true或false);

就如這個功能的名字,很明顯地它就是掌管物件是否要在畫面上顯示出來,false就是讓它消失。

其實這個程式碼做的事情我們並不陌生,來看下面這張圖:

螢幕快照 2017-07-06 上午12.59.12.png

每一個gameObject的名稱旁邊都有一個勾勾,這個勾勾就相當於SetActive這個選項,只要拿掉了,物件就不會出現在畫面中。

而我們的程式碼最主要的目標就是:

讓原本在場上的東西,在play模式後透過特定條件去隱藏它。

也是因為這樣,如果程式碼正確執行,當我讓小雞走路過去去撞到仙人掌時,Inspector的狀況就會是螢幕快照 2017-07-06 上午1.02.21.png

“仙人掌"這個物件的字被刷淡了,代表它目前非Active狀態。

然而,它依舊存在著,依舊佔著記憶體空間。

如果我們今天做的是射擊打小兵的遊戲,每一個被打死的單位都使用SetActive(false)的手法去處理,數量累積起來後對系統還是很大的一個負擔。

因此,如果是以後都不會再用到的東西,可以把程式碼替代為Destroy(this.gameObject);

如此一來,就能在遊玩時有效地清除垃圾了!


問:如果我的物件只希望被「小雞」撞到時才消失,該怎麼處理呢?

我們先回顧一下剛剛的程式碼:

    public void OnCollisionEnter2D(Collision2D other){
this.gameObject.SetActive (false);
}

這裡的意思是,只要這個物件被碰撞了,就會消失,不論那個傳進來的"other"是誰。

這樣撰寫程式碼是不嚴謹的,很有可能發生物件之間相撞、或是撞到牆壁後同歸於盡的慘劇XD

所以我們要運用到在碰撞那個章節我們提過的tag

螢幕快照 2017-07-06 上午1.10.46

我們要新增tag的對象是小雞,如果沒有自己中意的類別,就進到Add Tag自己加一個。

螢幕快照 2017-07-06 上午1.10.58

螢幕快照 2017-07-06 上午1.11.08

新增完之後記得把小雞設定成最新的Tag!

然後,把原有的程式碼改成這樣:

螢幕快照 2017-07-06 上午1.19.20.png

如line 20所示,我們可以透過(物件名稱).gameObject.tag來抓取一個物件的tag,並且拿來跟一串字串來比對,如果吻合的話再進行if裡面的動作。

後面兩行則是剛剛提到的SetActive和Destroy的區別,只要兩者擇一使用就好了,不必多此一舉!

經過這些步驟,就正式完成「物件在被小雞撞到時會不見」的動作了!

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s