Unity的协程

这篇文章转自:
http://blog.csdn.net/huang9012/article/details/38492937
https://www.cnblogs.com/zsb517/p/4107553.html

为了能在连续的多帧中调用该方法,Unity必须通过某种方式来存储这个方法的状态,这是通过IEnumerator 中使用yield return语句得到的返回值,当你“yield”一个方法时,你相当于说了,“现在停止这个方法,然后在下一帧中从这里重新开始!”。

注意:用0或者null来yield的意思是告诉协程等待下一帧,直到继续执行为止。当然,同样的你可以继续yield其他协程

public class CoroutineTest : MonoBehaviour {

    // Use this for initialization
    void Start ()
    {
        StartCoroutine(SaySomeThings());
    }

    IEnumerator SayHelloFiveTimes()
    {
        Debug.Log("1");
        yield return 0;
        Debug.Log("2");
        yield return 0;
        Debug.Log("3");
        yield return 0;
        Debug.Log("4");
        yield return 0;
        Debug.Log("5");
        yield return 0;
    }

    IEnumerator SaySomeThings()
    {
        Debug.Log("The routine has started");
        yield return StartCoroutine(Wait(1.0f));
        Debug.Log("1 second has passed since the last message");
        yield return StartCoroutine(Wait(2.5f));
        Debug.Log("2.5 seconds have passed since the last message");
    }

    IEnumerator Wait(float duration)
    {
        for (float timer = 0; timer < duration; timer += Time.deltaTime)
            yield return 0;
    }
}

可以单步跟踪 IEnumerator SayHelloFiveTimes() ,看看执行顺序!
另一个是嵌套的协程

yield return new WaitForSeconds(0.2f);
yield return new WaitForEndOfFrame();
1.如果只是等待下一帧执行,用yield return null即可。调用顺序在Update后,LateUpdate前

2.如果有截屏需要,用WaitForEndOfFrame。具体参考官方例子。否则直接用Texture2D.ReadPixel抓取屏幕信息则会报错。

3.此外,用WaitForEndOfFrame还可以让代码在LateUpdate的时序后调用。
https://www.cnblogs.com/hont/p/6477384.html

你可能感兴趣的:(Unity的协程)