计数器达特定值时仅执行一次IEnumerator函数的实现问题
解决Update中重复触发协程的问题
嘿,这个问题我之前也碰到过!核心原因是Update函数每帧都会执行一次,只要你的counter保持等于17的状态,每帧都会进入那个if分支,反复调用CallProcess(),自然就会重复启动协程了。给你几个简单有效的修改方案:
方案1:触发后立刻改变counter的值
这是最直接的方式,只要触发一次流程,就把counter改成一个不会再等于17的值,这样下帧就不会再触发了:
void Update() { if (counter == 17) { CallProcess(); counter++; // 或者直接设为一个无关值,比如 counter = -1; } }
适合场景:counter达到17后就不会再回到这个数值的情况。
方案2:添加一个触发标记(更灵活)
定义一个布尔变量来记录流程是否已经触发过,避免重复执行。如果之后还需要再次触发这个流程(比如counter可能循环回到17),还能在协程结束后重置标记:
首先在类里添加标记变量:
private bool hasTriggered17Process = false;
然后修改Update里的判断逻辑:
void Update() { if (counter == 17 && !hasTriggered17Process) { CallProcess(); hasTriggered17Process = true; } }
最后在你的协程结束时重置标记(如果需要再次触发的话):
private IEnumerator StartProcess() { yield return StartCoroutine (Process1()); // 注意这里你原代码拼错了:proccess1_done → process1_done if (process1_done) { yield return StartCoroutine (Process2()); if (process2_done) { process1_done = false; process2_done = false; hasTriggered17Process = false; // 重置标记,允许下次counter=17时再次触发 } } }
适合场景:需要多次触发该流程的情况,或者counter可能反复回到17的场景。
另外提个小细节:你原代码里的proccess1_done多写了一个c,应该是process1_done,记得修正,不然会编译报错哦~
内容的提问来源于stack exchange,提问作者zoenightshade
相关产品推荐
相关产品推荐

