如何优化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
相关产品推荐
相关产品推荐

