Unity3D运行时终止协程问题:按钮启停协程失效
解决Unity协程无法终止的问题
嘿,我来帮你搞定这个协程停不下来的坑!咱们先捋清楚为啥你的代码会出现这种情况:
问题根源
你现在调用StopCoroutine(AutoLoop())的时候,其实每次都会生成一个全新的IEnumerator实例,而不是你之前启动协程时的那个对象。Unity根本找不到要停止的那个协程,自然就停不住啦。而且重复点击按钮会多次启动新的协程,多个协程同时修改slider的值,所以数值会蹭蹭往上涨得更快。
解决方案:保存协程引用
要解决这个问题,核心就是把启动协程时返回的引用存起来,停止的时候直接用这个引用就行。具体步骤如下:
1. 声明协程引用变量
在你的脚本类里添加一个Coroutine类型的变量,用来存储正在运行的协程实例:
private Coroutine _runningAutoLoop; // 存储当前运行的协程引用 private int tb = 0; // 保留你原来的tb变量
2. 修改按钮点击逻辑
更新LoopButton方法,用保存的引用启动和终止协程,同时避免重复启动:
public void LoopButton() { if (_runningAutoLoop != null) { // 停止正在运行的协程 StopCoroutine(_runningAutoLoop); _runningAutoLoop = null; // 清空引用,标记协程已停止 tb--; } else { // 启动协程并保存引用 _runningAutoLoop = StartCoroutine(AutoLoop()); tb++; } }
3. 完善协程逻辑
在你的AutoLoop协程里,最好加上协程自然结束后的引用清空操作,避免状态混乱:
IEnumerator AutoLoop() { slider.value = slider.minValue; while (slider.value < slider.maxValue) { slider.value++; // 补全你的等待语句,比如等待0.1秒 yield return new WaitForSeconds(0.1f); } // 协程正常结束后,清空引用 _runningAutoLoop = null; tb--; // 同步更新tb的值 }
额外小建议
如果你原来的lb变量只是用来判断协程的运行状态,其实可以直接用_runningAutoLoop != null来代替,这样就不用维护lb和tb的同步关系,代码会更简洁~
内容的提问来源于stack exchange,提问作者Bosanac95
相关产品推荐
相关产品推荐

