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

