Unity开发笔记系列(协程)—— Coroutine continue failure报错
一、概述
在开发中使用协程时遇到了Coroutine continue failure的报错,这个报错因为没有堆栈信息不好定位,虽然好像不影响运行,但为了不留隐患,还是查找资料解决了一下,特此记录。
二、问题描述
通过总结引发报错的代码,可以将其抽象成如下A、B两个脚本。在A脚本中,我们定义了一个迭代器Method(),并通过RunMethod()方法开启协程并返回。在B脚本中,我们通过调用A的RunMethod()并将返回的协程存储在变量中,并在后续使用StopCoroutine()停止该协程的运行。运行后便会引发上述报错。
public class A : MonoBehaviour { public Coroutine RunMethod() { StartCoroutine(Method) } private IEnumerator Method() { //.... } }public class B : MonoBehaviour { public A a; private Coroutine coroutine; private void Start() { coroutine = a.RunMethod(); StopCoroutine(coroutine); } }三、解决方法
这个问题的原因非常简单,协程依赖于MonoBehaviour,每个MonoBehaviour只维护自己的协程,因此通过其他脚本关闭协程就会出现这种错误。此处最简单的方法就是如下修改B脚本,报错即可消除。
public class B : MonoBehaviour { public A a; private Coroutine coroutine; private void Start() { coroutine = a.RunMethod(); //StopCoroutine(coroutine); //不能关闭其他脚本的协程 a.StopCoroutine(coroutine); } }