解说unity中Coroutines与Invoke

2015年03月13日 13:24 0 点赞 0 评论 更新于 2017-05-09 16:24

一、StartCoroutine、StopCoroutine、StopAllCoroutines

1. StartCoroutine的传参方法

StartCoroutine 有两种传参方式:一种是传入方法名的字符串,另一种是传入 IEnumerator 类型的迭代器。当使用字符串传参时,只能传递一个方法参数;而使用 IEnumerator 传参时,参数数量没有限制。

2. 停止协同程序的方法

StopCoroutine 只能停止通过字符串传参启动的协同程序。对于使用 IEnumerator 传参启动的协同程序,需要使用 StopAllCoroutines 来停止。

3. GameObject 状态对协同程序的影响

一旦 GameObject 的状态为 inactive,协同程序就会失效。这里不仅包括脚本所依附的 GameObject 本身,还包括其所有父级 GameObject。并且,即使之后再次将其激活,协同程序也无法恢复。

4. 组件启用状态与协同程序

组件的 enable 状态不会暂停协同程序的运行。也就是说,无论组件是否启用,协同程序都会按照既定逻辑继续执行。

5. 场景跳转对协同程序的影响

当进行场景跳转时(实际上是协同程序所在的脚本所依附的 GameObject 被删除,包括脚本被删除或者整个 GameObject 被删除),协同程序会立即停止。

6. 停止协同程序的作用范围

StopCoroutineStopAllCoroutines 只能停止相应脚本上的协同程序,无法停止其他脚本上的协同程序。例如,若脚本 A 上有协同程序 a,StopCoroutineStopAllCoroutines 必须写在脚本 A 中。如果想在脚本 B 中停止脚本 A 的协同程序 a,应该在脚本 A 上封装一个停止的方法,然后由脚本 B 调用该方法。

二、Invoke、CancelInvoke

1. 停止 Invoke 的方法

InvokeInvokeRepeating 可以使用 CancelInvoke 来停止。

2. CancelInvoke 的作用范围

CancelInvoke 只能停止相应脚本上的 Invoke 调用,这与上述关于 StopCoroutineStopAllCoroutines 只能作用于相应脚本的原理相同。

3. 状态对 Invoke 的影响

无论 GameObjectactive 状态设置为 false,还是组件的 enable 状态设置为 false,都无法停止 Invoke 调用。只有当 Invoke 所在的脚本或其所依附的 GameObject 被销毁时,Invoke 调用才会停止。

作者信息

boke

boke

共发布了 1025 篇文章