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

枪械射击冷却功能失效: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,看起来就像它从来没增长过。

修复方法

把运算改成浮点类型计算,有两种简单方式:

  1. 给数值加上f后缀强制转成float:
public bool CanShoot() => !gunData.reloading && timeSinceLastShot > 1f / (gunData.fireRate / 60f);
  1. 调整公式逻辑,改成更直观的“60秒除以每分钟射击次数=单次射击间隔”,避免嵌套除法:
public bool CanShoot() => !gunData.reloading && timeSinceLastShot > 60f / gunData.fireRate;

另外可以临时在Update()里加Debug.Log(timeSinceLastShot),确认这个值确实在正常增长,排除脚本未启用、对象被禁用这类基础问题。

内容的提问来源于stack exchange,提问作者bob maximus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 16:35:22