C# Unity控制台倒计时调试:ONE与GO同显、计时器无法停止求助
Unity C# 控制台倒计时Bug修复方案
问题根因
两个Bug的触发逻辑非常明确:
- "ONE"与"GO!"同时打印:执行完打印"ONE"的逻辑、将
startTime自减为0后,代码没有做分支阻断,会直接顺次执行下方startTime == 0的判断块,两个日志在同一次方法调用中被触发。 - "GO!"无限重复打印:使用
InvokeRepeating注册的重复调用任务,在倒计时归0后没有被主动终止,timer()方法会每秒持续被调用,每次都会命中startTime == 0的判断重复打印日志。 - 额外语法错误:原代码将
Update()生命周期方法嵌套写在了timer()方法内部,会直接导致代码编译不通过。
修复后完整代码
using UnityEngine; public class PlayerMovement : MonoBehaviour { public int startTime = 4; void Start() { InvokeRepeating("timer", 1.0f, 1.0f); } void timer() { if (startTime > 0) { switch (startTime) { case 3: Debug.Log("THREE"); break; case 2: Debug.Log("TWO"); break; case 1: Debug.Log("ONE"); break; } startTime--; // 阻断当前次方法后续逻辑,避免同帧触发GO!打印 return; } Debug.Log("GO!"); // 终止重复调用,停止计时器 CancelInvoke("timer"); } void Update() { } }
核心修改点
- 重构了多层嵌套的if-else判断为更易读的switch分支,每次打印完对应数字、
startTime自减后,直接通过return终止当前次timer()方法的执行,不会走到后续"GO!"的判断逻辑,彻底解决两个日志同时打印的问题。 - 打印完"GO!"后调用
CancelInvoke("timer"),主动注销InvokeRepeating注册的重复调用任务,倒计时结束后timer()不会再被触发,解决无限打印的问题。 - 修正了原代码的语法错误,将嵌套的
Update()方法移到类的成员层级,符合Unity生命周期方法的定义规则。
内容的提问来源于stack exchange,提问作者DemonicGenesis
相关产品推荐
相关产品推荐

