枪械射击冷却功能失效:timeSinceLastShot未正常累加问题排查
枪械冷却机制失效问题解决
我做的枪械想用timeSinceLastShot += Time.deltaTime实现射击后冷却,但实际运行时timeSinceLastShot好像根本没增长。相关代码如下:
private void Update() { timeSinceLastShot += Time.deltaTime; } public bool CanShoot() => !gunData.reloading && timeSinceLastShot > 1 / (gunData.fireRate / 60); public void Shoot() { if (gunData.currentAmmo > 0) { if (CanShoot()) { Debug.Log("shooting"); gunData.currentAmmo--; timeSinceLastShot = 0; OnGunShot(); } } else { StartCoroutine(Reload()); } }
问题根源
核心问题是整数除法导致的计算错误:1 / (gunData.fireRate / 60)里的运算全是整数类型,如果gunData.fireRate是大于60的整数(比如常见的120),gunData.fireRate / 60会先执行整数除法得到2,接着1 / 2还是整数除法,结果为0。这就导致timeSinceLastShot > 0永远为真,每次调用Shoot()都会立刻把timeSinceLastShot重置为0,看起来就像它从来没增长过。
修复方法
把运算改成浮点类型计算,有两种简单方式:
- 给数值加上
f后缀强制转成float:
public bool CanShoot() => !gunData.reloading && timeSinceLastShot > 1f / (gunData.fireRate / 60f);
- 调整公式逻辑,改成更直观的“60秒除以每分钟射击次数=单次射击间隔”,避免嵌套除法:
public bool CanShoot() => !gunData.reloading && timeSinceLastShot > 60f / gunData.fireRate;
另外可以临时在Update()里加Debug.Log(timeSinceLastShot),确认这个值确实在正常增长,排除脚本未启用、对象被禁用这类基础问题。
内容的提问来源于stack exchange,提问作者bob maximus
相关产品推荐
相关产品推荐

