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

Unity中计时器运行1秒后停止的技术求助

问题分析与解决方案

你的计时器只运行1秒就停止,核心问题出在协程逻辑的两个致命缺陷:

  • 协程内无任何时间延迟,递归调用会瞬间执行所有逻辑,视觉上仅能看到第一次数值变化
  • 秒数归零的分支逻辑混乱,启动分钟协程后仍执行秒数递减,导致数值异常

修复后的完整代码

using System.Collections;
using UnityEngine;

public class Timer : MonoBehaviour
{
    public ZeitManager zeitmanager;
    // 防止重复启动多个计时器协程
    private bool _isTimerRunning = false;

    // 供按钮调用的启动方法
    public void StartCountdown()
    {
        if (!_isTimerRunning)
        {
            StartCoroutine(CountdownCoroutine());
        }
    }

    private IEnumerator CountdownCoroutine()
    {
        _isTimerRunning = true;
        
        // 只要分钟或秒数大于0,就继续倒计时
        while (zeitmanager.Minuten > 0 || zeitmanager.Sekunden > 0)
        {
            // 关键:等待1秒再执行下一次递减
            yield return new WaitForSeconds(1f);
            
            zeitmanager.Sekunden--;
            // 秒数归零时,重置为59并减少分钟数
            if (zeitmanager.Sekunden < 0)
            {
                zeitmanager.Sekunden = 59;
                zeitmanager.Minuten--;
                zeitmanager.MinutenText.text = zeitmanager.Minuten.ToString();
            }
            // 可选:用D2格式化,让秒数显示为两位数(如03而非3)
            zeitmanager.SekundenText.text = zeitmanager.Sekunden.ToString("D2");
        }

        // 倒计时结束后的收尾
        _isTimerRunning = false;
        zeitmanager.SekundenText.text = "00";
        zeitmanager.MinutenText.text = "00";
    }
}

核心修改说明

  • 新增WaitForSeconds(1f)实现每秒一次的延迟,这是计时器正常运行的基础
  • 用while循环替代递归调用,逻辑更清晰,避免栈溢出风险
  • 添加_isTimerRunning标记,防止按钮重复点击启动多个协程
  • 重构秒数归零的逻辑,避免出现负数数值,同时保证分钟和秒数的联动正确

使用注意

将按钮的点击事件绑定到Timer脚本的StartCountdown()方法(而非直接调用协程),确保计时器能稳定启动并持续运行。

内容的提问来源于stack exchange,提问作者Jonas Köpp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 17:55:16