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
相关产品推荐
相关产品推荐

