这篇文章转自:
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
网友评论