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

Unity中持续修改变量是否安全最优?昼夜循环代码优化咨询

昼夜循环时段标记代码的安全性与优化方案

我在游戏中实现了昼夜循环,希望NPC能在特定时段执行对应行为,当前使用如下代码(已知有更优实现方式,先以可用为目标):

if (TimeOfDay >= 0 && TimeOfDay < 1) { Hours[0] = true; Hours[23] = false; }
else if (TimeOfDay >= 1 && TimeOfDay < 2) { Hours[1] = true; Hours[0] = false; }
else if (TimeOfDay >= 2 && TimeOfDay < 3) { Hours[2] = true; Hours[1] = false; }
else if (TimeOfDay >= 3 && TimeOfDay < 4) { Hours[3] = true; Hours[2] = false; }
else if (TimeOfDay >= 4 && TimeOfDay < 5) { Hours[4] = true; Hours[3] = false; }
else if (TimeOfDay >= 5 && TimeOfDay < 6) { Hours[5] = true; Hours[4] = false; }
else if (TimeOfDay >= 6 && TimeOfDay < 7) { Hours[6] = true; Hours[5] = false; }
else if (TimeOfDay >= 7 && TimeOfDay < 8) { Hours[7] = true; Hours[6] = false; }
else if (TimeOfDay >= 8 && TimeOfDay < 9) { Hours[8] = true; Hours[7] = false; }
else if (TimeOfDay >= 9 && TimeOfDay < 10) { Hours[9] = true; Hours[8] = false; }
else if (TimeOfDay >= 10 && TimeOfDay < 11) { Hours[10] = true; Hours[9] = false; }
else if (TimeOfDay >= 11 && TimeOfDay < 12) { Hours[11] = true; Hours[10] = false; }
else if (TimeOfDay >= 12 && TimeOfDay < 13) { Hours[12] = true; Hours[11] = false; }
else if (TimeOfDay >= 13 && TimeOfDay < 14) { Hours[13] = true; Hours[12] = false; }
else if (TimeOfDay >= 14 && TimeOfDay < 15) { Hours[14] = true; Hours[13] = false; }
else if (TimeOfDay >= 15 && TimeOfDay < 16) { Hours[15] = true; Hours[14] = false; }
else if (TimeOfDay >= 16 && TimeOfDay < 17) { Hours[16] = true; Hours[15] = false; }
else if (TimeOfDay >= 17 && TimeOfDay < 18) { Hours[17] = true; Hours[16] = false; }
else if (TimeOfDay >= 18 && TimeOfDay < 19) { Hours[18] = true; Hours[17] = false; }
else if (TimeOfDay >= 19 && TimeOfDay < 20) { Hours[19] = true; Hours[18] = false; }
else if (TimeOfDay >= 20 && TimeOfDay < 21) { Hours[20] = true; Hours[19] = false; }
else if (TimeOfDay >= 21 && TimeOfDay < 22) { Hours[21] = true; Hours[20] = false; }
else if (TimeOfDay >= 22 && TimeOfDay < 23) { Hours[22] = true; Hours[21] = false; }
else if (TimeOfDay >= 23 && TimeOfDay < 24) { Hours[23] = true; Hours[22] = false; }

代码说明

TimeOfDay是0-24的float值,达到24时重置为0;Hours是长度为24的bool数组,代码作用是每进入新时段时,将对应时段设为true,旧时段设为false。这段代码运行在Unity的Update()函数中,每帧都会执行——比如处于TimeOfDay >= 0 && TimeOfDay < 1区间时,每帧都会重复执行Hours[0] = true; Hours[23] = false;。我担心持续给bool设相同值是否安全、效率低下,目前没感受到卡顿,但不确定是否有问题,想问问这种写法在Unity中是否可行,以及有没有优化方法。


问题解答

1. 安全性与可行性

这种写法完全可行且安全。bool类型重复赋值相同值不会触发任何内存异常或逻辑错误,Unity对这种操作没有限制,只是属于无意义的重复执行而已。

2. 效率问题

单看这段代码的开销极小——只是简单的浮点范围判断和bool赋值,每帧执行的话,除非你同时运行上百个相同逻辑的脚本,否则根本不会导致卡顿,你目前没感受到性能问题是正常的。

3. 优化方案

虽然当前代码能用,但可以通过以下方式减少无意义的执行:

  • 记录当前时段,仅在变化时更新
    添加一个变量记录当前生效的小时数,每帧先计算当前时段,只有当时段变化时才更新Hours数组,避免每帧重复赋值:

    private int currentActiveHour = -1;
    
    void Update()
    {
        // 计算当前小时数,处理TimeOfDay=24的重置情况
        int newHour = Mathf.FloorToInt(TimeOfDay);
        if (newHour >= 24) newHour = 0;
    
        // 仅当时段变化时执行更新
        if (newHour != currentActiveHour)
        {
            // 将旧时段设为false(初始状态currentActiveHour为-1,跳过第一次)
            if (currentActiveHour != -1)
            {
                Hours[currentActiveHour] = false;
            }
            // 标记新时段为true
            Hours[newHour] = true;
            currentActiveHour = newHour;
        }
    }
    
  • 简化逻辑,省去bool数组
    如果你不需要用数组标记所有时段,直接用currentActiveHour变量存储当前时段即可,NPC逻辑直接读取这个变量判断时段,省去数组的维护开销,代码更简洁。

  • 事件驱动模式
    当时段变化时触发一个自定义事件,让需要响应时段变化的NPC订阅该事件,只在时段切换时执行对应逻辑,而不是每帧检查。这种方式更符合Unity的设计模式,也能减少全局的帧更新开销。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 20:42:39