Unity3D協程yield的理解


  Unity3D的協程概括地將就是:對於一段程序,你可以加上yield標明哪里需要暫停,然后在下一幀或者一段時間后,系統會繼續執行這段代碼。協程的作用:①延遲一段時間執行代碼。②等某個操作完成之后再執行之后的操作。

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

  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信息。

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

  

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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM