2D战争游戏昼夜循环冗余代码优化方案咨询
优化2D战争游戏昼夜循环与时间系统代码
问题分析
原代码的NightDayCycle()依赖大量冗余的if-else判断设置透明度,维护和扩展难度极高;时间系统的嵌套判断也可简化,提升整体可读性。
优化后的完整代码
void Update() { NightDayCycle(); if (!TimeStopped) { TimerMethod(); } } public void TimerMethod() { Timer -= Time.deltaTime; if (Timer <= 0) { Hour++; if (Hour >= 25) { Hour = 1; Day++; if (Day >= 30) { Day = 1; Month++; if (Month >= 12) { Month = 1; Year++; } } } Timer = hourToRealTime; } } public void NightDayCycle() { float opacity; if (!wasNight) { // 白天阶段:从1点的1.0线性降到24点的0.04,每小时递减0.04 opacity = 1f - (Hour - 1) * 0.04f; if (Hour == 24) { wasNight = true; Hour = 1; } } else { // 夜晚阶段:从1点的0.04线性升到24点的1.0,每小时递增0.04 opacity = 0.04f + (Hour - 1) * 0.04f; if (Hour == 24) { wasNight = false; Hour = 1; } } // 强制约束透明度在0-1区间,避免计算误差导致异常 opacity = Mathf.Clamp01(opacity); NightDay.color = new Color(1f, 1f, 1f, opacity); }
优化说明
- 简化Update逻辑:用
!TimeStopped替代冗余的else if (TimeStopped == false),移除空分支,代码更紧凑。 - 扁平化时间递进判断:将嵌套的日期更新逻辑拆分为顺序判断,结构更清晰,后续调整每月天数、闰年规则等会更方便。
- 数学公式替代冗余判断:用线性计算直接得出透明度,彻底消除几十行
if-else,后续调整明暗变化速率只需修改步长值(比如把0.04改成其他数值)。 - 增加边界防护:通过
Mathf.Clamp01()确保透明度始终在合法区间,避免因计算误差出现异常显示。 - 保留原有核心逻辑:完全兼容原有的
wasNight状态切换和小时重置逻辑,不会破坏原有昼夜循环的行为。
进一步扩展建议
如果需要更平滑的明暗过渡(而非按小时跳变),可以基于Timer的剩余时间计算插值透明度,实现逐帧渐变效果:
// 在NightDayCycle中替换opacity计算逻辑 if (!wasNight) { // 计算当前小时内的进度:0(小时开始)到1(小时结束) float hourProgress = 1f - (Timer / hourToRealTime); // 基础透明度 + 当前小时内的渐变量 opacity = 1f - (Hour - 1) * 0.04f - hourProgress * 0.04f; } else { float hourProgress = 1f - (Timer / hourToRealTime); opacity = 0.04f + (Hour - 1) * 0.04f + hourProgress * 0.04f; } opacity = Mathf.Clamp01(opacity); NightDay.color = new Color(1f, 1f, 1f, opacity);
内容的提问来源于stack exchange,提问作者Redierro
相关产品推荐
相关产品推荐

