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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 08:30:59