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

如何实现Unity Coroutine每隔X秒执行?解决每帧重复触发问题

问题修复:让协程每隔2秒执行一次

问题根源

你的代码每帧都在打印“Ran”,核心原因是在Update方法里每帧调用StartCoroutine——这会导致每一帧都创建并启动一个新的协程实例。哪怕每个协程只执行一次打印就进入等待,但架不住每帧都有新协程启动,最终表现为控制台每帧输出内容。

另外你写的running变量逻辑完全多余且矛盾:刚进入协程就设running = true,循环执行打印后等待2秒又立刻设running = false,每个协程本质上只跑一次循环就结束,完全起不到“每隔2秒执行”的作用。

修复方案一:单协程循环(推荐)

只在脚本初始化时启动一次协程,让协程内部通过循环持续每隔2秒执行逻辑:

public class EveryXSeconds: MonoBehaviour
{
    public bool running = true;

    private void Start()
    {
        // 仅在脚本启动时初始化一次协程
        StartCoroutine(MyCoroutine());
    }

    IEnumerator MyCoroutine()
    {
        // 持续循环直到running被设为false
        while (running)
        {
            print("Ran");
            // 等待2秒后再进入下一次循环
            yield return new WaitForSeconds(2f);
        }
    }
}

如果不需要中途停止协程,甚至可以去掉running变量,改成无限循环:

IEnumerator MyCoroutine()
{
    while (true)
    {
        print("Ran");
        yield return new WaitForSeconds(2f);
    }
}

修复方案二:Update计时器(无需协程)

如果不想用协程,也可以通过在Update里累加时间来实现定时逻辑:

public class EveryXSeconds: MonoBehaviour
{
    // 可在Inspector面板调整间隔时间
    public float interval = 2f;
    private float timer = 0f;

    private void Update()
    {
        timer += Time.deltaTime;
        if (timer >= interval)
        {
            print("Ran");
            // 重置计时器,用timer -= interval可避免时间溢出误差
            timer -= interval;
        }
    }
}

内容的提问来源于stack exchange,提问作者m0a

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 16:35:14