相信在unity中用过协程的人肯定都遇到过下面的这个报错
哈哈哈是不是很眼熟,但是知道了问题的原因后就能很好的避免掉了,出现这个原因就是协程开启的时候开启协程的MonoBehavior挂载的物体是未激活状态,知道了问题原因所在就很容易解决了.
if (gameObject.activeInHierarchy)
{
StartCoroutine(Render());
}
在开启的地方加一个判断就行了,但是这只是权宜之策,理论上来讲是不能用未激活的物体开启协程的.
在开启的时候判断是否能开启很重要,同样的关闭协程也很重要,要是关闭的不好就会出现下面这个报错
/*emmm关键时候不报错了...大概意思就是这个物体已经销毁了但是你还继续调用它*/
出现这个报错的主要原因就是协程没有适当的关闭引起的,因为协程的yield return机制是把当前任务挂起,当return的内容完成后再执行下面的操作,假设你加载一个物体,当界面关闭的时候再卸载掉,但是在界面关闭的时候你的协程并没有关闭,协程会继续执行,如果再物体已经卸载掉的情况下再调用了物体的组件就会报上面那个错,所以协程的关闭也相当重要.
一般来说当MonoBehavior隐藏的时候应该把协程也相应的停了,在OnDisable的时候调用一下StopAllCoroutines();就可以了
说到关闭还要注意一点,就是协程中开启协程这种情况,一个MonoBehavior只能关闭它自己开启的协程
private class TestA : MonoBehavior
{
private TestB testB;
private void OnEnable()
{
StartCoroutine(Render());
}
private void OnDisable()
{
StopCoroutine(Render());
}
private IEnumerator Render()
{
yield return testB.StartCoroutine(RenderB());
}
}
public class TestB : MonoBehavior
{
public IEnumerator Re