最近在學習uinty,用到了協程這個東西。網上查閱了很多資料,介紹的都十分復雜,而且沒有太大價值,不得不說有項目經驗的人果真厲害,幾句話就點醒了我,現在直接解釋。
1. 協程不是多線程!!! 協程還是在主線程里面,這點十分重要,不要被網上其他資料誤導。
2. 協程不是只能做簡單的延遲,雖然你可能用過下面的延遲幾秒的代碼,但是協程的價值在這里完全體現不出來。
void Start()
{
StartCoroutine(coRoutine());
}
IEnumerator coRoutine()
{
yield return new WaitForSeconds(1);
}
因為其實這種只是暫停幾秒,完全沒必要單獨開一個協程,下面這種方法也可以實現
IEnumerator Start () {
// StartCoroutine(coRoutine());
Debug.Log("1");
yield return new WaitForSeconds(3);
Debug.Log("2");
}
是不是很意外,start竟然也可以return,當然一般不這么做,這個例子只是為了說明協程不只是用來做延遲的
3. 協程的真正用途是分步做一個比較耗時的事情,比如游戲里面的加載資源
private int num = 0;
private const int total=30;
void Start()
{
StartCoroutine(coRoutine());
}
IEnumerator coRoutine()
{
while (num<total)
{
num++;
Debug.Log(num);
yield return null;
}
}
void Update () {
Debug.Log("update!");
}
void LateUpdate()
{
Debug.Log("lateUpdate!");
}
上面的代碼是個簡單的例子,比如我們加載的資源有30個(total),但是一次加載完畢會耗費大量的時間,不可能讓玩家在start中等待這么久,這時候協程的作用就出現了,協程是每幀lateUpdate之前執行yield return之前的代碼,lateupdate之后執行yield return之后的代碼,相當於每幀循環一次(前提是你的協程有循環體,否則一幀就執行完了),具體可以復制我的代碼看一下日志,這樣就不會卡在這加載30個資源這里,而是你在update里面繼續做你的事情,我每次只加載1個,加載1個耗時顯然遠遠小於30個。
上面的例子具體可以對應進入一張地圖加載NPC,當你進入一張地圖后,如果一次性加載30個NPC,你可能就卡在進地圖的地方,等待這30個NPC全部加載出來之后才能行動,但是用了協程,你可以移動,可能你移動一步(或者幾步),加載一個NPC,實際上你根本感受不到移動過程中有停頓的現象。
