StartCoroutine就是开启一个协程,yield return 是迭代器块返回调用迭代的地方。
官方解释:
翻译一下:一个协程的执行可以在任何地方用yield语句来暂停,yield return的值决定了什么时候协程恢复执行。协程在协调在几帧中执行的操作时有极大的用处.协程几乎没有任何性能开销。
StartCoroutine 一般都会立即返回,然而你也可以获得返回结果的值。但是这一步会等到协程结束执行才能生效。
void Awake()
{
Debug.Log("awake");
StartCoroutine(cor1());
Debug.Log("corOver");
}
IEnumerator cor1()
{
Debug.Log("corStart");
yield return null;
Debug.Log("corComplete");
}
运行结果:
当被调用函数执行到yield return null;(暂停协程,等待下一帧继续执行)时,根据Unity解释协同程序就会被暂停,其实我个人认为他这个解释不够精确,先返回开始协程的地方,然后再暂停协程。也就是先通知调用处,“你先走吧,不用管我”,然后再暂停协程。
执行结果:
start1
test1
start2
test2 (这个test2是等待三秒后才打印出来的)
再看下面这个嵌套的:
void Start () {
Debug.Log("start1");
StartCoroutine(Test());
Debug.Log("start2");
}
IEnumerator Test()
{
Debug.Log("test1");
yield return StartCoroutine(DoSomething());
Debug.Log("test2");
}
IEnumerator DoSomething()
{
Debug.Log("load 1");
yield return null;
Debug.Log("load 2");
}
执行结果:
start1
test1
load1
start2
load2
test2
这种StartCoroutine中嵌套一个yield return StartCoroutine,第一个StartCoroutine会等到第二个StartCoroutine中所有代码结束后再继续执行,而第二个StartCoroutine中的yield语句会先返回第一个,然后立即返回他的调用处,也就是调用处会继续执行,而第一个StartCoroutine会等待第二个执行完再继续执行。