看下面程序
void Start()
{
print("Starting " + Time.time);
StartCoroutine(WaitAndPrint(2.0F));
print("Before WaitAndPrint Finishes " + Time.time);
}
IEnumerator WaitAndPrint(float waitTime)
{
yield return new WaitForSeconds(waitTime);
print("WaitAndPrint " + Time.time);
}
程序的输出结果是:
Starting 0
Before WaitAndPrint Finishes 0
WaitAndPrint 2.00175
当给StartCoroutine方法添加修饰时,如下:
IEnumerator Start()
{
print("Starting " + Time.time);
yield return StartCoroutine(WaitAndPrint(2.0F));
print("Done " + Time.time);
}
IEnumerator WaitAndPrint(float waitTime)
{
yield return new WaitForSeconds(waitTime);
print("WaitAndPrint " + Time.time);
}
此时,输出的结果是:
Starting 0
WaitAndPrint 2.003294
DOne 2.003294
结论:一个协同程序在执行过程中,可以在任意位置使用yield语句。yield的返回值控制何时恢复协同程序向下执行。协同程序在对象自有帧执行过程中堪称优秀。协同程序在性能上没有更多的开销。StartCoroutine函数是立刻返回的,但是yield可以延迟结果。直到协同程序执行完毕。
很多情况下,我们会用到StartCoroutine的一个变体。使用有字符串方法名的StartCoroutine允许你用StopCoroutine去停止它。其缺点就是会有较高的性能开销,而且你只能传递一个参数。
IEnumerator Start()
{
StartCoroutine("DoSomething", 2.0F);
yield return new WaitForSeconds(1);
StopCoroutine("DoSomething");
print("结束");
}
IEnumerator DoSomething(float someParameter)
{
while (true)
{
print("DoSomething Loop");
yield return null;
}
}
结果是在一秒内循环输出 DoSomething Loop,最后输出 “结束”