Unity协程首次运行正常,满足条件时二次触发无法执行?
问题排查与修复方案
嘿,我一眼就发现问题所在了——你的协程执行完毕后没有把coroutine变量重置为null,这就导致第二次触发Counter == limit的条件时,代码直接因为this.coroutine != null的判断提前返回,完全没启动新的协程!
具体原因拆解
第一次满足条件时,你成功启动了协程,并且把coroutine变量赋值为这个协程的实例。但当StartProcess里的Process1和Process2全部执行完毕后,协程已经结束,可coroutine变量依然攥着之前的实例引用没松手。等到第二次触发条件,代码走到if(this.coroutine != null){ return; }这一行,直接就退出了,根本不会尝试启动新的协程。
两种修复方案任你选
方案一:给协程加个“收尾工作”
最简单的办法就是在StartProcess的末尾加上重置变量的代码,确保协程一结束就把coroutine置空:
private IEnumerator StartProcess () { yield return StartCoroutine(Process1()); yield return StartCoroutine(Process2()); // 协程跑完,把引用清空 this.coroutine = null; }
另外提一句,你原代码里的StartProcess少了返回值类型声明,记得补上IEnumerator哦。
方案二:封装协程启动逻辑(更灵活)
如果你的场景里可能需要中途停止协程,或者要处理更复杂的启动逻辑,可以封装一个工具方法,确保无论协程是正常结束还是被终止,都能重置变量:
// 封装的协程启动方法 private void StartCoroutineWithReset(IEnumerator routine) { // 如果已有协程在跑,先停掉(可选,根据你的业务需求调整) if(this.coroutine != null) { StopCoroutine(this.coroutine); } // 启动带重置逻辑的协程 this.coroutine = StartCoroutine(ExecuteAndReset(routine)); } // 负责执行协程并收尾的方法 private IEnumerator ExecuteAndReset(IEnumerator routine) { yield return routine; // 协程执行完毕,清空引用 this.coroutine = null; }
然后把Counter的setter里的代码改成调用这个封装方法:
public int Counter { get{ return this.counter; } set { this.counter = value; if(this.counter == limit) { StartCoroutineWithReset(StartProcess()); } } }
额外小提醒
- 确认
Process1和Process2都是正确定义的IEnumerator方法,否则协程会无法正常执行。 - 如果存在
Counter超过limit后又回到limit的情况,你可能需要根据业务需求,判断是否允许重复启动协程,或者增加更严谨的触发条件。
内容的提问来源于stack exchange,提问作者zoenightshade
相关产品推荐
相关产品推荐

