Unity中C#技能冷却计时器的优化:解决长时间运行数值过大问题
技能冷却代码优化方案
一、简化变量使用
你的代码里currentTime属于冗余变量,直接在判断逻辑中调用Time.realtimeSinceStartup即可,无需单独存储,同时把不需要外部访问的lastKeyInputTime改为私有变量,符合封装原则:
public float projectileCooldown = 3f; private float lastKeyInputTime = 0f; void Update() { if (Input.GetKeyDown(KeyCode.Space)) { if (Time.realtimeSinceStartup - lastKeyInputTime >= projectileCooldown) { SpawnProjectile(); lastKeyInputTime = Time.realtimeSinceStartup; } } }
二、解决长时间运行数值过大的问题
Time.realtimeSinceStartup会随游戏运行持续累加,虽然浮点数能存储极大数值,但数值越大小数部分精度损失越严重,可能导致冷却判断出现误差。更稳妥的替代方案是使用倒计时变量记录剩余冷却时间:
public float projectileCooldown = 3f; private float cooldownRemaining = 0f; void Update() { // 每帧更新剩余冷却时间 if (cooldownRemaining > 0) { cooldownRemaining -= Time.deltaTime; } if (Input.GetKeyDown(KeyCode.Space)) { if (cooldownRemaining <= 0) { SpawnProjectile(); cooldownRemaining = projectileCooldown; } } }
这种方案的优势:
- 变量
cooldownRemaining的数值永远不会超过projectileCooldown,彻底避免数值过大问题 - 逻辑更直观,直接通过剩余时间判断冷却状态,无需计算时间差
- 方便扩展冷却进度显示,直接用
cooldownRemaining / projectileCooldown就能获取进度百分比
额外优化建议
- 可以把按键判断逻辑抽成独立方法,或结合Unity事件系统,让代码更模块化
- 若需管理多个技能冷却,可封装
CooldownManager单例类统一处理
内容的提问来源于stack exchange,提问作者AmericanoOnTheRound
相关产品推荐
相关产品推荐

