文章目錄
- 前言
- 協程的概念
- 協程的使用
- 協程方法的宣告
- 協程的啟用
- 協程的停止
- 小結
前言
我們知道,Unity中的代碼是大致上是按幀回圈執行,一般的一個方法中的邏輯是會在一幀內執行完畢的,那么如果我們需要將某段代碼延時進行執行的時候該怎么辦呢?
當然,我們可以自己設定一個計時器變數,每幀更新,在合適的時候再進行代碼塊的執行,這樣處理毫無疑問是可以的,但如果需要進行計時的物件數量很多的時候,這樣處理就不免會變得麻煩起來了,那有沒有什么簡單的方法可以實作這個需求呢?
Coroutine(協程)就可以很簡單的解決這個問題,
協程的概念
要理解協程,首先就得先明白執行緒和行程的概念:
行程:系統進行資源分配的基本單位,通俗地來說就是一個又一個的應用程式;
執行緒:是行程的組成單位,它一條條順序的命令執行流,所以也可以看做是系統進行命令執行和資源分配的最小單位
為了輔助理解,讓我們來看看Win10的資源監視器:
系統進行了記憶體分配的這些exe,就是行程,而他們又由一條條執行緒組成,一條執行緒又由復數的代碼塊組成執行邏輯命令
單個執行緒是順序執行的,很顯然我們并不會只有線性的需求,當我們需要多個任務同時執行的時候,多執行緒這一概念就出現了
而協程則是C#中用于實作“多執行緒”的一種“偽多執行緒”操作
先讓我們來個簡單的協程,來初步看看協程的效果:
public class SimpleCoroutine : MonoBehaviour
{
private int count = 0;
void Start()
{
StartCoroutine(CoroutineTest());
}
void Update()
{
count += 1;
print("Count : " + count);
}
IEnumerator CoroutineTest()
{
for (int i = 0; i < 5 ;i++ )
{
print("i : " + i);
yield return null;
}
}
}
來分析一下這段代碼,
首先宣告了一個全域變數count,它的初始值為0,并在Updata()方法中進行每幀自增自身的值1,和在控制臺列印它的值
宣告了一個使用了協程的方法CoroutineTest(),它會在for回圈的i值小于5之前,每當i自增1就列印一次i的值,它在腳本的Start()方法中進行了啟動
這個腳本執行后的結果如下:

可以看到,i的值與Count的值在交替列印
如果按照正常的線性順序來看的話,在Start方法中進行了啟動的CoroutineTest方法應該先于列印第一個Count之前就已經完成了所有的列印,而現在如上圖的交替列印結果就是協程實作的效果了——它使得CoroutineTest方法中的for回圈中的內容進行了一個逐幀的延時,
協程的使用
協程方法的宣告
就像上一部分的例子中宣告CorotineTest()的方式一樣
要將一個代碼塊使用協程進行處理,首先需要使它所在的方法的返還為一個IEnumerator型別
因為協程實際上就是通過迭代器實作的,底層的東西這里就不做過多討論了
然后需要做的事是在你希望它進行暫時中斷的地方加上一條yield return陳述句,返還的值為非YieldInstruction類的子類的任意值(推薦使用null、1或0)時,它的效果都是延時一幀
而YieldInstruction類的子類則包含有如下幾種:

效果從名字上可以很明顯的看得出來,不一一贅述
比較常用的是WaitForSeconds類:
yield return new WaitForSeconds(float seconds);
按照這樣的形式進行返還即可,float型別的seconds引數決定了中斷的時長,以秒為單位
協程的啟用
啟用一個協程使用的是封裝在Behaviour類中的StartCoroutine()方法,它有如下兩種多載:
StartCoroutine(string methodName);
StartCoroutine(IEnumerator routine);
第一種是使用string型別的方法名作為引數
第二種則是直接接收目標方法返還的IEnumerator型別
但是我們注意到,這樣呼叫方法并沒有帶有引數,那么啟用一個需要使用到引數的方法要怎么實作呢?
在使用string型別的作為引數的StartCoroutine()方法中還有這么一種多載:
StartCoroutine(string methodName, [DefaultValue(“null”)] object value);
默認值為null的引數value會作為目標方法的引數參與啟用協程
協程的停止
很自然地,有啟動便有停止——StopCoroutine()方法,它也被封裝在封裝于Behaviour類中,多載方式主要也是如下的兩種:
StopCoroutine(IEnumerator routine)
StopCoroutine(string methodName)
但要注意的是,它只能用于停止那些使用string型別引數的啟用方式進行啟用的方法
小結
協程的主要作用就是對一個代碼塊的執行進行延時,所以它的常用場景是在需要實作一個簡單的計時器,或者對大量計算進行延時處理的時候
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/128715.html
標籤:其他
上一篇:MTK3353導航升級包-刷機包
下一篇:PTA 線性表 7-1 約瑟夫環(Josephus)問題(by Yan) (100分) 按出列次序輸出每個人的編號
