冒險日誌 - 生活隨筆

2018.04.24(三) – Invoke()在n秒鐘後執行函式

前言

遊戲工程師平常的工作除了實作遊戲邏輯外,常常也需要處理視覺演出的部分ex.選單淡入淡出、碰到道具後2秒鐘觸發特定效果…等等。這時,Invoke()函式就是個不錯的好夥伴!


想像一個情境:在開始執行遊戲的3秒後,開始播放BGM。

最直觀的方法是創一個clock做計時,在達到指定的秒數後開始做動作,如下圖。

螢幕快照 2018-04-26 上午2.27.44.png

然而,如果今天我想要3秒後播放BGM、15秒後底圖變色、30秒後螢幕開始閃白光….

就會需要重複使用clock、初始clock、使用clock…,甚至是多開好幾個不同的float來充當計時器,讓程式碼變得雜亂。

那,如果是用Invoke()來處理,會變怎樣呢?

先來看看Invoke的參數。

Invoke(string methodName, float time);

Invoke總共有兩個參數,第一個是「想呼叫的函式名稱」,第二個是「在幾秒鐘後呼叫」。

因此,若是使用Invoke()來改寫跟上圖相同功能的程式,就會長這樣:

螢幕快照 2018-04-26 上午2.39.07.png

是不是就簡單多了!

然而,有些注意的事:Invoke的第一個參數是填「字串」,就是想呼叫的Function的名稱,不需要加()。而不需要加()也有另外一層含義….

Invoke沒辦法呼叫需要填參數的Function。

假設今天有個Function叫做 Add(int a, int b),功能是把整數a和b相加之後透過Debug.Log印出來,Invoke(“Add(3,5)”, 1.5f)這種寫法是不被接受的。

Invoke是直接根據第一個參數”methodName”去找這個腳本檔裡有沒有名稱相同的Function,並不支援附帶參數的Function、或是呼叫其他程式檔的Function,在使用上有其一定的局限性。

另外有一個與Invoke相似、帶有計時概念的語法叫做Coroutine,以後有機會的話再談!


與Invoke相關的其他功能

CancelInvoke() : 停止所有在這個腳本檔裡的Invoke(),立即生效。

InvokeRepeating(string methodName, float time, repeatRate) :支援「週期性地預約執行某Function」,白話來說就是InvokeRepeating(想執行的Function, 幾秒後呼叫第一次, 接下來隔多久呼叫一次)

直接看個例子:想要預約5秒鐘後印出第一個Hello,之後每隔2秒就呼叫一次。

InvokeRepeating(“Print_Hello”, 5.0f, 2.0f);

 

Advertisement

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 )

Facebook photo

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

Connecting to %s