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

如何优化Unity速拧专用倒计时计时器?现有实现问题排查及改进咨询

魔方计时器问题修复与优化方案

现有问题修复

1. 计时器字体颜色异常修复

你代码中设置计时器字体颜色的代码被注释了,主动补充颜色设置逻辑即可:

  • 取消StartTimer方法中//timerText.color = Color.white;的注释
  • 取消PrepareToCount方法中//timerText.color = Color.yellow;的注释
  • 在StopTimer方法中添加设置字体为白色的逻辑:
private void StopTimer()
{
    timerEnabled = false;
    timerText.color = Color.white; // 停止时重置为白色
}

2. ResetAll按钮界面不同步修复

你之前的ResetAll只清空了数据列表,没有同步更新UI,修改为以下实现:

public void ResetAll()
{
    // 清空业务数据
    records.Clear();
    countDownTimer = 0f;
    timerEnabled = false;
    timeBetweenCount = 0f;
    averageOfFive = 0f;
    averageOfTwelve = 0f;

    // 清空5次尝试UI
    foreach (var text in attemts5)
    {
        text.text = string.Empty;
    }
    // 清空12次尝试UI
    foreach (var text in attemts12)
    {
        text.text = string.Empty;
    }
    // 重置平均文本
    averageOfFiveText.text = "AVERAGE: --";
    averageOfTwelveText.text = "AVERAGE: --";
    // 重置计时器显示
    timerText.text = "0.00";
    timerText.color = Color.white;
    // 重置准备状态UI
    prepareUI.color = transparent;
}

另外原代码中records.Clear()不需要套循环,直接调用即可。

3. 平均计算逻辑优化

原代码只计算前5/12次的平均,不符合速拧场景计算最近N次的需求,引入Linq简化计算逻辑,先在脚本开头添加引用:

using System.Linq;

修改SaveTime中的平均计算逻辑:

private void SaveTime()
{          
    records.Add(countDownTimer);

    // 计算最近5次平均
    if(records.Count >= 5)
    {
        averageOfFive = records.TakeLast(5).Average();
        averageOfFiveText.text = $"AVERAGE: {averageOfFive:0.00}";
    }
    // 计算最近12次平均
    if(records.Count >= 12)
    {
        averageOfTwelve = records.TakeLast(12).Average();
        averageOfTwelveText.text = $"AVERAGE: {averageOfTwelve:0.00}";
    }

    // 新增最佳记录持久化逻辑,重启游戏不丢失
    float currentBest = records.Min();
    PlayerPrefs.SetFloat("BestRecord", currentBest);
}

代码结构优化建议

1. 抽离统一UI更新方法

把所有UI更新逻辑抽成单独的RefreshUI()方法,每次数据变更(新增记录、删除记录、重置)时统一调用,避免逻辑散落在Update各处:

private void RefreshUI()
{
    timerText.text = countDownTimer.ToString("0.00");
    ProgressBar.isOn = timerEnabled; // 原Update里的逻辑可以挪到这
    
    // 更新5次尝试列表
    for (int i = 0; i < attemts5.Length; i++)
    {
        attemts5[i].text = i < records.Count ? $"{i+1}: {records[i]:0.00}" : string.Empty;
    }
    // 更新12次尝试列表
    for (int i = 0; i < attemts12.Length; i++)
    {
        attemts12[i].text = i < records.Count ? $"{i+1}: {records[i]:0.00}" : string.Empty;
    }
}

2. 冗余逻辑简化

原Update里的ProgressBar状态判断可以简化为一行ProgressBar.isOn = timerEnabled;,不需要写if-else分支。

3. 静态变量优化

countDownTimer不需要设为static,静态变量在场景重载时会残留数值,容易出现异常bug,除非有跨脚本访问需求否则改为普通实例变量即可。

4. ResetLast方法实现

删除最后一条记录的逻辑可以直接这么写:

public void ResetLast()
{
    if(records.Count > 0)
    {
        records.RemoveAt(records.Count - 1);
        RefreshUI(); // 调用统一UI更新方法
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:45:05