1. 程式人生 > >Unity3D協程(Coroutine)和Invke的區別

Unity3D協程(Coroutine)和Invke的區別

一:什麼是Invoke() Invoke方法是 Unity3D 的一種委託機制 例子1: Invoke(“SendMsg”, 5); 它的意思是:5 秒之後呼叫 SendMsg() 方法; 例子2: InvokeRepeating("SendMsg", 2 , 3); 該方法的意思是指:2 秒後呼叫 SendMsg() 方法,並且之後每隔 3 秒呼叫一次 SendMsg () 方法。 比如模擬做英雄聯盟的出兵時,就可以用這個方法,隔1分10秒開始呼叫此方法(此時應該播放“全軍出擊”的聲音,哈哈),然後每隔30秒呼叫一次這個生成小兵的方法。

使用 Invoke() 方法需要注意 3點: 1 :它應該在 指令碼的生命週期裡的(Start、Update、OnGUI、FixedUpdate、LateUpdate)中被呼叫; 2

:Invoke(); 不能接受含有引數的方法; 3:在 Time.ScaleTime = 0; 時, Invoke() 無效,因為它不會被呼叫到,另外,Invoke() 也支援重複呼叫;

二、什麼是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

型別的方法不能帶ref或者out型的引數,但可以帶被傳遞的引用; (8):目前在Unity中沒有簡便的方法來檢測作用於物件的協程數量以及具體是哪些協程作用在物件上。 (9):MonoBehaviour.enabled = false 協程會照常執行,但 gameObject.SetActive(false) 後協程卻全部停止,即使在Inspector把 gameObject 啟用還是沒有繼續執行。

4.兩者的對比 1:Invoke方法:執行沒有被掛起,相當於設定完被呼叫函式的執行時間後即時向下執行,應用到每隔一段時間執行某個函式很方便。 2:Coroutine方法:新開一條執行序列(跟新建執行緒差不多)並掛起,等待中斷指令結束,開銷不大,當需要掛起當前執行時使用。