coroutine这个功能是unity非常好用的功能,能解决类似线程的一些问题,而且不用考虑lock 和 同步的问题,所以必须深入掌握coroutine的功能。
coroutine的使用场景
等待多久做某件事
等待某件事结束再做后续的事 tips:使用while(条件巧妙的做到)
coroutine不是线程,不会在unity中并行处理
这点必须了解清楚,很多同学会在这里迷糊,其实这个功能只是c#
的yield的功劳。coroutine的调用仍然会在unity 主线程中调用。
简单写个测试用例就知道了。
public class NewBehaviourScript : MonoBehaviour {
void Start () {
StartCoroutine(Test());
Debug.Log("after coroutine");
}
IEnumerator Test(){
for(int i=0; i<1000; i++){
Debug.Log(i);
}
yield return null;
Debug.Log("end test");
}
}
打印结果顺序:#)打印1000次i的信息 --> after coroutine -->end test
从结果我们可以看到: courtine的却是一个单线程的,不然的话after coroutine的打印
是不会等到程序遇到yield关键字暂停后继续进行的。所以之前的unity并行处理的理解
是错误的,或者给你造成了假象。
coroutine的调用时机
看下unity的官方的coroutine的流程图就可以明白了。croutine一般情况是在
update 后执行的。当然unity 也提供了WaitForEndOfFrame 这种的功能。