协程与迭代器(Coroutine 与 Enumerator)

协程不是线程,也不是进程,是Unity定义的一种执行规则,使用时间片轮转机制并配合迭代器来模拟“并发”的效果。

void Start()
{
   StartCoroutine(DelayedExecution());
}

IEnumerator DelayedExecution()
{
   Debug.Log("开始延迟两秒");
   yield return new WaitForSeconds(2); // 延迟2秒
   Debug.Log("延迟两秒结束");
}

上面的代码使用MonoBehaviour类的成员方法StartCoroutine将一个迭代器函数IEnumerator注册进MonoBehaviour的协程管理器中。

而Unity中对协程的调用,实际上是在每一个Update函数之后,但是又在LateUpdate函数之前,也就是说对于任何一个继承了MonoBehaviour的对象来说,Unity会在执行完Update函数之后执行一次它使用StartCoroutine方法注册的“迭代器函数”,但是只执行一次就马上去执行LateUpdate函数,当下一次执行完Update函数之后,Unity会再次执行一次这个“迭代器函数”,从上一次返回的位置继续执行,而不是从头开始。

yield其实可以理解为是对return的一种修饰,我们知道通常函数执行到return就意味着它的生命周期也随之结束了,但是yield return意味着函数的生命周期并没有结束,而是被“挂起了”。

WaitForSeconds是Unity自己定义的一个计时器,其主要目的就是用于配合协程实现暂停一定时间的功能,如果一个迭代器函数在调用过程中返回了一个WaitForSeconds,它会在Unity的协程管理器中被暂时“休眠”,Unity下一次处理MonoBehaviour回调时会跳过这个协程的调用,直到时间达到了指定的时间。

在上面的代码中,Unity第一次在协程管理器中调用DelayedExecution这个函数时就会立刻获得一个WaitForSeconds(2)的返回值,之后会标记这个函数暂且休眠,两秒之后,在下一轮MonoBehaviour的处理逻辑中,Unity会再次调用DelayedExecution这个函数并从上次返回的位置继续,于是我们又得到了"延迟两秒结束"的Debug信息。

IEnumerable和IEnumerator的区别:IEnumerable是接口,IEnumerator是迭代器。像C#内置的数据结构“数组”,就是实现了IEnumerable接口,这意味着我们可以使用foreach语句来遍历数组中的元素,但是遍历的这个过程我们需要借助IEnumerator来实现,因为只有它才知道下一步去哪。

全部评论

相关推荐

03-27 17:33
门头沟学院 Java
代码飞升:同学院本,你要注意hr当天有没有回复过,早上投,还要打招呼要推销自己,不要一个劲投
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客企业服务