协程的定义
Unity中的协程是一种返回值为IEnumerator
的特殊函数,它可以主动的请求暂停自身并提交一个唤醒条件,Unity会在唤醒条件满足的时候去重新唤醒协程,所以协程还是运行在主线程上。
协程的原理
协程调用方式
//第1种:使用正常的函数调用方式,但在外部添加StartCoroutine修饰符
//优势在于可以调用多个参数的方法
//但是不能通过StopCoroutine("FunName")来结束协程,只能通过StopAllCoroutines来结束
StartCoroutine(FunName(args))
//第2种:填写方法名字的字符串,方法参数
//只能调用不含参数或只包含一个参数的协程方法
//可以通过StopCoroutine来结束对正在执行的协程的调用
StartCoroutine("FunName",args)
终止协程的两种方式
StopCoroutine(string methodName) //只能终止以字符串形式启动的协程
StopAllCoroutine() //终止所有协程
返回对象类型
yield return null; // 下一帧再执行后续代码
yield return 0; //下一帧再执行后续代码
yield return 6;//(任意数字) 下一帧再执行后续代码
yield break; //直接结束该协程的后续操作
yield return asyncOperation;//等异步操作结束后再执行后续代码
yield return StartCoroution(/*某个协程*/);//等待某个协程执行完毕后再执行后续代码
yield return WWW();//等待WWW操作完成后再执行后续代码
yield return new WaitForEndOfFrame();//等待帧结束,等待直到所有的摄像机和GUI被渲染完成后,在该帧显示在屏幕之前执行
yield return new WaitForSeconds(0.3f);//等待0.3秒,一段指定的时间延迟之后继续执行,在所有的Update函数完成调用的那一帧之后(这里的时间会受到Time.timeScale的影响);
yield return new WaitForSecondsRealtime(0.3f);//等待0.3秒,一段指定的时间延迟之后继续执行,在所有的Update函数完成调用的那一帧之后(这里的时间不受到Time.timeScale的影响);
yield return WaitForFixedUpdate();//等待下一次FixedUpdate开始时再执行后续代码
yield return new WaitUntil()//将协同执行直到 当输入的参数(或者委托)为true的时候....如:yield return new WaitUntil(() => frame >= 10);
yield return new WaitWhile()//将协同执行直到 当输入的参数(或者委托)为false的时候.... 如:yield return new WaitWhile(() => frame < 10);
使用协程需要注意的地方
多个协程可以同时运行,它们会根据各自的启动顺序来更新;
协程可以嵌套任意多层;
如果你想让多个脚本访问一个协程,那么你可以定义静态的协程;
如果你的程序需要进行大量的计算,那么可以考虑在一个随时间进行的协程中处理它们;
IEnumerator类型的方法不能带ref或者out型的参数,但可以带被传递的引用;
目前在Unity中不能检测作用于对象的协程数量以及具体是哪些协程作用在对象上。