You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:15:26