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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 15:05:26