Unity3D協程(Coroutine)和Invke的區別
一:什麼是Invoke() Invoke方法是 Unity3D 的一種委託機制 例子1: Invoke(“SendMsg”, 5); 它的意思是:5 秒之後呼叫 SendMsg() 方法; 例子2: 該方法的意思是指:2 秒後呼叫 SendMsg() 方法,並且之後每隔 3 秒呼叫一次 SendMsg () 方法。 比如模擬做英雄聯盟的出兵時,就可以用這個方法,隔1分10秒開始呼叫此方法(此時應該播放“全軍出擊”的聲音,哈哈),然後每隔30秒呼叫一次這個生成小兵的方法。
使用 Invoke() 方法需要注意 3點: 1 :它應該在 指令碼的生命週期裡的(Start、Update、OnGUI、FixedUpdate、LateUpdate)中被呼叫; 2
二、什麼是Unity協程(Coroutine)
此文章是翻譯作品,不過講的很詳細,很容易理解。
1.使用協程的作用一共有兩點: 1)延時(等待)一段時間執行程式碼; 2)等某個操作完成之後再執行後面的程式碼。總結起來就是一句話:控制程式碼在特定的時機執行。
協程不是執行緒,也不是非同步執行的。協程和 MonoBehaviour 的 Update函式一樣也是在MainThread中執行的。使用協程你不用考慮同步和鎖的問題。
2.協程的定義: 協程是一個分步執行,遇到條件(yield return 語句)會掛起,直到條件滿足才會被喚醒繼續執行後面的程式碼。 Unity在每一幀(Frame)都會去處理物件上的協程。Unity主要是在Update後去處理協程(檢查協程的條件是否滿足)
3.注意事項: (1):在程式中呼叫StopCoroutine()方法只能終止以字串形式啟動(開始)的協程; (2):多個協程可以同時執行,它們會根據各自的啟動順序來更新; (3):協程可以巢狀任意多層; (4):如果你想讓多個指令碼訪問一個協程,那麼你可以定義靜態的協程; (5):協程不是多執行緒(儘管它們看上去是這樣的),它們執行在同一執行緒中,跟普通的指令碼一樣; (6):如果你的程式需要進行大量的計算,那麼可以考慮在一個隨時間進行的協程中處理它們; (7):IEnumerator
4.兩者的對比 1:Invoke方法:執行沒有被掛起,相當於設定完被呼叫函式的執行時間後即時向下執行,應用到每隔一段時間執行某個函式很方便。 2:Coroutine方法:新開一條執行序列(跟新建執行緒差不多)並掛起,等待中斷指令結束,開銷不大,當需要掛起當前執行時使用。