协程是一个分部执行,遇到条件(yield return 语句)会挂起,直到条件满足才会被唤醒继续执行后面的代码。
Unity在每一帧(Frame)都会去处理对象上的协程。Unity主要是在Update后去处理协程(检查协程的条件是否满足)
协程跟Update()其实一样的,都是Unity每帧对会去处理的函数(如果有的话),至少是每帧的LateUpdate()后去运行。
详细见下图:
Unity生命周期流程图
另外对协程的停止还有一个方法:
通过设置MonoBehaviour脚本的enabled对协程是没有影响的,但如果gameObject.SetActive(false)
则已经启动的协程则完全停止了,即使在Inspector把gameObject
激活还是没有继续执行。也就说协程虽然是在MonoBehvaviour启动的(StartCoroutine)但是协程函数的地位完全是跟MonoBehaviour是一个层次的,不受MonoBehaviour的状态影响,但跟MonoBehaviour脚本一样受gameObject
控制,也应该是和MonoBehaviour脚本一样每帧“轮询” yield 的条件是否满足。
yield 后面可以有的表达式:
1. null 、0或者未知数值-等待下一帧执行。 2. WaitForEndOfFrame - 等待渲染周期循环和GUI完成后执行。 3.
WaitForFixedUpdate - 等待物理周期循环完成后执行 4. WaitForSeconds - 等待给定的时间周期过完后执行 5. WWW -
等待www的网络请求完成后,isDone=true后执行。 6. Another coroutine - in which case the new
coroutine will run to completion before the yielder is resumed
值得注意的是 WaitForSeconds()受Time.timeScale影响,当Time.timeScale = 0f 时,yield return
new WaitForSecond(x) 将不会满足。
热门工具 换一换