前言
遊戲工程師平常的工作除了實作遊戲邏輯外,常常也需要處理視覺演出的部分ex.選單淡入淡出、碰到道具後2秒鐘觸發特定效果…等等。這時,Invoke()函式就是個不錯的好夥伴!
想像一個情境:在開始執行遊戲的3秒後,開始播放BGM。
最直觀的方法是創一個clock做計時,在達到指定的秒數後開始做動作,如下圖。
然而,如果今天我想要3秒後播放BGM、15秒後底圖變色、30秒後螢幕開始閃白光….
就會需要重複使用clock、初始clock、使用clock…,甚至是多開好幾個不同的float來充當計時器,讓程式碼變得雜亂。
那,如果是用Invoke()來處理,會變怎樣呢?
先來看看Invoke的參數。
Invoke(string methodName, float time);
Invoke總共有兩個參數,第一個是「想呼叫的函式名稱」,第二個是「在幾秒鐘後呼叫」。
因此,若是使用Invoke()來改寫跟上圖相同功能的程式,就會長這樣:
是不是就簡單多了!
然而,有些注意的事: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);