※中肯辭典
(註:有別於官方文件上的嚴謹說明,在此以工程師的角度來簡短說明此元素的特質與使用時機。)
常見的關鍵小指令,讓畫面上的物件在觸發特定條件後消失!
不論是在玩打磚塊時,磚塊被球撞到,或是玩馬力歐時香菇被踩扁消失,「擊破」、「排除障礙」等行為在各種遊戲中都十分常見,也是遊戲開發初期就應該會需要的技巧。
先撇開磚塊被撞到後粉碎的動畫效果,這是屬於Animation的部分留待日後再介紹,這次我們要討論的是:
要如何把畫面上的物件弄不見?
做法並不複雜,透過簡單的2、3行程式碼就能搞定。
讓我們延續前幾篇小雞的範例,並且加入幾個障礙物。
首先,把障礙物的素材拉近Inspector,在他們底下各自加入一個Script,並且輸入以下程式碼:
運用前幾篇講過的碰撞偵測,額外開一個OnCollisionEnter2D函數(記得要先在物件上加入Collider!),並且使用一個特別的功能叫做
this.gameObject.SetActive(true或false);
就如這個功能的名字,很明顯地它就是掌管物件是否要在畫面上顯示出來,false就是讓它消失。
其實這個程式碼做的事情我們並不陌生,來看下面這張圖:
每一個gameObject的名稱旁邊都有一個勾勾,這個勾勾就相當於SetActive這個選項,只要拿掉了,物件就不會出現在畫面中。
而我們的程式碼最主要的目標就是:
讓原本在場上的東西,在play模式後透過特定條件去隱藏它。
也是因為這樣,如果程式碼正確執行,當我讓小雞走路過去去撞到仙人掌時,Inspector的狀況就會是
“仙人掌”這個物件的字被刷淡了,代表它目前非Active狀態。
然而,它依舊存在著,依舊佔著記憶體空間。
如果我們今天做的是射擊打小兵的遊戲,每一個被打死的單位都使用SetActive(false)的手法去處理,數量累積起來後對系統還是很大的一個負擔。
因此,如果是以後都不會再用到的東西,可以把程式碼替代為Destroy(this.gameObject);
如此一來,就能在遊玩時有效地清除垃圾了!
問:如果我的物件只希望被「小雞」撞到時才消失,該怎麼處理呢?
我們先回顧一下剛剛的程式碼:
public void OnCollisionEnter2D(Collision2D other){
this.gameObject.SetActive (false);
}
這裡的意思是,只要這個物件被碰撞了,就會消失,不論那個傳進來的”other”是誰。
這樣撰寫程式碼是不嚴謹的,很有可能發生物件之間相撞、或是撞到牆壁後同歸於盡的慘劇XD
所以我們要運用到在碰撞那個章節我們提過的tag。
我們要新增tag的對象是小雞,如果沒有自己中意的類別,就進到Add Tag自己加一個。
新增完之後記得把小雞設定成最新的Tag!
然後,把原有的程式碼改成這樣:
如line 20所示,我們可以透過(物件名稱).gameObject.tag來抓取一個物件的tag,並且拿來跟一串字串來比對,如果吻合的話再進行if裡面的動作。
後面兩行則是剛剛提到的SetActive和Destroy的區別,只要兩者擇一使用就好了,不必多此一舉!
經過這些步驟,就正式完成「物件在被小雞撞到時會不見」的動作了!
幫助很大 謝謝
LikeLike