Unity协程(Coroutine)

协程与线程的区别

1、协程不是线程,也不是异步执行的。
2、协程和 MonoBehaviour 的 Update函数一样,也是在MainThread中执行的。
3、使用协程你不用考虑同步和锁的问题。
4、协程可以被yield return在当前帧进行打断,到下一帧后可以继续从被打断的地方继续运行。
5、协程是每帧的LateUpdate()后去运行的。

IEnumerable与IEnumerator的区别

public interface IEnumerable  
{  
    IEnumerator GetEnumerator();  
}

public interface IEnumerator
{
    object Current { get; }
    bool MoveNext ();
    void Reset ();
}

1、一个Collection要支持foreach方式的遍历,必须实现IEnumerable接口(亦即,必须以某种方式返回IEnumerator object)。
2、IEnumerator object具体实现了iterator(通过MoveNext(),Reset(),Current)。
3、从这两个接口的用词选择上,也可以看出其不同:IEnumerable是一个声明式的接口,声明实现该接口的class是“可枚举(enumerable)”的,但并没有说明如何实现枚举器(iterator);IEnumerator是一个实现式的接口,IEnumerator object就是一个iterator。
4、IEnumerable和IEnumerator通过IEnumerable的GetEnumerator()方法建立了连接,client可以通过IEnumerable的GetEnumerator()得到IEnumerator object,在这个意义上,将GetEnumerator()看作IEnumerator object的factory method也未尝不可。

yield return的常见返回值及其作用

常见返回值 作用
yield return new WaitForSeconds(3.0f); 等待3秒,然后继续从此处开始,常用于做定时器
yield return null; 这一帧到此暂停,下一帧再从暂停处继续,常用于循环中
yield return new WaitForEndOfFrame(); 等到这一帧的Cameras和GUI渲染结束后再从此处继续,即等到这帧的末尾再往下运行。这行之后的代码还是在当前帧运行,是在下一帧开始前执行,跟return null很相似
yield return new WaitForFixedUpdate(); 在下一次执行FixedUpdate的时候继续执行这段代码,即等一次物理引擎的更新
yield return www; 等待直至异步下载完成
yield break; 直接跳出协程,对某些判定失败必须跳出的时候,比如加载AssetBundle的时候,WWW失败了,后边加载bundle没有必要了,这时候可以yield break跳出。
yield return StartCoroutine(methodName); 等待另一个协程执行完。这是把协程串联起来的关键,常用于让多个协程按顺序逐个运行

注意:用0或者null来yield的意思是告诉协程等待下一帧,直到继续执行为止。

注意事项

1、在程序中调用StopCoroutine()方法只能终止以字符串形式启动(开始)的协程
2、多个协程可以同时运行,它们会根据各自的启动顺序来更新
3、协程可以嵌套任意多层
4、如果你想让多个脚本访问一个协程,那么你可以定义静态的协程
5、协程不是多线程(尽管它们看上去是这样的),它们运行在同一线程中,跟普通的脚本一样
6、如果你的程序需要进行大量的计算,那么可以考虑在一个随时间进行的协程中处理它们
7、IEnumerator类型的方法不能带ref或者out型的参数,但可以带被传递的引用
8、目前在Unity中没有简便的方法来检测作用于对象的协程数量以及具体是哪些协程作用在对象上

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