Unity3D協程yield的理解

  Unity3D的協程歸納地將就是:對於一段程序,你能夠加上yield標明哪裏須要暫停,而後在下一幀或者一段時間後,系統會繼續執行這段代碼。協程的做用:①延遲一段時間執行代碼。②等某個操做完成以後再執行以後的操做。異步

  總結起來就是一句話:控制一段代碼在特定的時機執行。async

  Unity3D協程的核心在於「yield return"命令,這句代碼的意義是立刻中止當前函數,而後在下一幀中從這裏從新開始。舉個例子:函數

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CoroutineCountdown : MonoBehaviour
{
    public float floattimer;
    public float timer;

    void Start()
    {
        StartCoroutine(Countdown());
    }

    IEnumerator Countdown()
    {
        int seconds = 0;
        while (true)
        {
            //timer累加到1時,至關於運行了1秒後,會timer大於1,不會執行yield return 0,而結束循環
            //接着執行second++;second經過log對用戶可見,隨着程序執行,每過1秒輸出累加時間值1,2,3。。。
            for (float timer = 0; timer < 1;)
            {
                yield return 0;
                timer += Time.deltaTime;
            }
            seconds++;
            Debug.Log(seconds + " seconds have passed since the Coroutine started.");
        }
    }
}

  在timer知足循環條件,即timer小於1時,會執行yield return 0,這時候會中止countdown函數,而後在下一幀中從新從yield處開始執行;因此在進入下一幀時會先在運行一次yield return 0語句,而後是timer+=Time.deltaTime,當timer大於1時,這時候不知足循環的判斷條件,這時候會結束循環。接着運行下一行代碼:second++,對Second累加1,並輸出Log信息。spa

  在Console窗口中會輸出log信息,可見Second每秒累加1次。其實每次輸出log信息時,線程

  

  另外注意,結束一個協程須要使用協程函數的字符串形式:StopCoroutine("Countdown");
code

  協程是 Unity 3D的一種官方的加載方式,好處是能讓代碼看起來更「同步」(sync)一些。協程不是線程,也不是異步執行(async)的。協程和 MonoBehaviour 的 Update函數同樣也是在MainThread中執行的。使用協程你不用考慮同步和鎖的問題。資源在 yield 返回後便可使用,代碼比回調的方式容易組織。協程

相關文章
相關標籤/搜索