原文链接:https://blog.csdn.net/qq_36282052/article/details/70142622
协程的概念:
协程是一个分部执行,遇到条件(yield return语句)会挂起,直到条件满足才会被唤醒继续执行后面的代码。
Unity在每一帧都会去处理对象上的协程。主要是在Update后去处理协程(检查协程的条件是否满足)。
协程跟Update()其实一样的,都是Unity每帧都会去处理函数。如果在一个对象的前期调用协程,协程会立即运行到第一个
yield return语句处,如果是yield return null,就会在同一帧再次被唤醒。
协程的写法
Unity的协程系统是基于C#的一个简单而强大的接口 ,IEnumerator,它允许你为自己的集合类型编写枚举器。也就是一个
IEnumerator 返回值,一个yield return null的语句。
//不带参数的:
IEnumerator Test01()
{// 协程中必须有返回值yield return
yield return null;
}
//带参数的:
IEnumerator Test02(string name)
{
print (name);
yield return null;
}
*协程中的细节*
1.协程与普通方法一样,可以被多次调用,
2.协程一旦被开启之后,总是试图将方法中的代码执行完,之后停止。
3.在协程内,如果遇到yield return null ,0 , 1 ...;表示剩余代码将在下一帧继续执行,
4.在协程中遇到 yield return new WaitForSeconds (n);代码;表示剩余代码将在 n秒之后执行。
5. 在协程中如果遇到 yield return StartCoroutine (Son ()),表示剩余代码将在子协程执行完成之后继续执行。子协程仍然满足协程基本规则。
6.在协程中如果遇到 yield return new WaitForFixedUpdate (),表示剩余代码将在FixedUpdate执行完毕之后继续向下执行。
7.在协程中如果遇到 yield return new WaitForEndOfFrame (),表示剩余代码将在ONGUI执行完毕之后继续向下执行。
8.在协程中如果遇到 yield return WWW,表示剩余代码将在www 下载文件之后继续向下执行。
9.在协程中如果遇到 yield return obj ,表示剩余代码将在obj不为空的时候继续向下执行。
10.在协程中如果遇到 yield return new WaitForSeconds (n) ,会受到Time.timeScale的影响。
11.协程方法,可以当做普通方法,在两个脚本之间*调用。
12. 生命周期内的方法,也可以改造成协程方法。
熟练使用协程,可以减少我们写多个计时器,同时使代码也更加整洁,但错误使用协程,就会带来N多个Bug等着我们解决。
记得写上一个练习项目时遇到一个协程方面的坑,一开始我把协程当成一个普通函数了,不知道有木有童鞋和我犯一样的错误,哈哈,结果放在Update里面就导致了Unity直接崩盘。。。
C#中的协程是本身就是一个迭代函数,类似于Update,While函数。故把它放进Update或者While true 死循环中就直接导致Unity崩溃。
它是一种伪多线程,并不是真正的多线程。协程还需要手动关闭。除非脚本挂载的对象销毁,不然还是开启的。保持手动关闭的习惯是不错的,协程开太多了也会影响系统效率。
StartCoroutine :开始协同程序。
StopAllCoroutines: 停止运行此behaviour上的所有协同程序。
StopCoroutine: 停止协同程序。
相关函数可以在Unity圣典看详细的介绍。