Unity3D如何优化自定义时钟逻辑?解决计时误差与代码冗余问题
游戏内独立计时系统的优化方案
解决小数计时误差问题
原来的写法在timeCount >= 1时直接清零,会丢掉timeCount里的小数部分(比如累计到1.3秒时,清零后就丢了0.3秒),长期运行肯定会让计时越来越不准。正确的做法是只把整数部分计入秒数,剩余小数继续累计:
- 先算出这次累计溢出的整数秒数:
int overflowSeconds = Mathf.FloorToInt(timeCount); - 把溢出的秒数加到
Second上,同时让timeCount减去溢出的整数部分(保留小数):timeCount -= overflowSeconds;
这样就不会再丢精度了。
优化冗余的if语句
多层if判断可以用数学运算直接替代,通过整除和取余一次性算出日、时、分、秒,既减少分支判断,逻辑也更清晰。
优化后的完整代码
using UnityEngine; public class PlayTime { public int Day { get; private set; } public int Hour { get; private set; } public int Minute { get; private set; } public float Second { get; private set; } // 记录累计的总时间(包含小数秒,保证精度) private float totalElapsedTime; public PlayTime() { Day = 0; Hour = 0; Minute = 0; Second = 0; totalElapsedTime = 0; } public void UpdateTime() { totalElapsedTime += Time.deltaTime; // 提取总时间里的整数秒部分 int totalSeconds = Mathf.FloorToInt(totalElapsedTime); // 分解出天数,剩下的秒数继续分解 Day = totalSeconds / (24 * 3600); int remainingSeconds = totalSeconds % (24 * 3600); // 分解小时 Hour = remainingSeconds / 3600; remainingSeconds %= 3600; // 分解分钟 Minute = remainingSeconds / 60; remainingSeconds %= 60; // 小数秒直接取总时间的小数部分 Second = totalElapsedTime - totalSeconds; } }
代码说明
- 精度保障:用
totalElapsedTime累计所有Time.deltaTime,完整保留时间精度,不会丢失任何小数部分。 - 逻辑简化:用整除(
/)和取余(%)直接拆分时间单位,替代原有的多层if判断,代码更高效。 - 可读性拉满:变量命名清晰,每一步拆分逻辑一目了然,不用额外注释也能看懂。
内容的提问来源于stack exchange,提问作者June_SP
相关产品推荐
相关产品推荐

