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

如何实现可实时更新的耐力系统:按住Shift时持续消耗耐力

问题核心原因

  • 你当前调用的Input.GetKeyDown(KeyCode.LeftShift)API仅在按键按下的第一帧触发一次,自然只能单次扣减耐力
  • 若直接将扣减逻辑放到每帧判断的Input.GetKey中,扣减速度会随游戏帧率波动,无法做到固定每秒扣3点的效果

修复后的实现方案

首先在你的脚本类中先声明几个变量,用来控制耐力消耗的计时规则:

// 耐力消耗间隔(单位:秒)
private const float STAMINA_CONSUME_INTERVAL = 1f;
// 每次间隔消耗的耐力值
private const int STAMINA_CONSUME_AMOUNT = 3;
// 计时缓存变量
private float _staminaTimer = 0f;

然后修改你原来的移动+耐力逻辑:

// 冲刺触发:仅在按下瞬间修改速度,加耐力判断避免0耐力还能触发冲刺
if (Input.GetKeyDown(KeyCode.LeftShift) && Stamina > 0)
{
    speed += run_speed;
}

// 按住冲刺期间的耐力消耗逻辑
if (Input.GetKey(KeyCode.LeftShift) && Stamina > 0)
{
    _staminaTimer += Time.deltaTime;
    // 累计时间达到1秒时扣除耐力
    if (_staminaTimer >= STAMINA_CONSUME_INTERVAL)
    {
        Stamina -= STAMINA_CONSUME_AMOUNT;
        // 避免耐力扣成负数
        Stamina = Mathf.Max(Stamina, 0);
        _staminaTimer = 0f;
    }
}
// 耐力不足时自动退出冲刺
else if (Input.GetKey(KeyCode.LeftShift) && Stamina <= 0)
{
    speed = Mathf.Max(speed - run_speed, 此处替换为你的默认移动速度);
}

// 松开冲刺按键逻辑
if (Input.GetKeyUp(KeyCode.LeftShift))
{
    speed = Mathf.Max(speed - run_speed, 此处替换为你的默认移动速度);
    // 重置计时器,下次冲刺重新计时
    _staminaTimer = 0f;
    // 你原来写的松开加3点如果是临时测试逻辑可以保留,如果是要做耐力恢复,建议参照消耗逻辑做按秒持续恢复,避免按一下松一下还能刷耐力
    // Stamina += 3; 
}

补充说明

  • Time.deltaTime是上一帧到当前帧的时间间隔,累加后可以得到真实流逝的时间,完全不受帧率影响
  • 如果你需要松开Shift后持续恢复耐力,只要参照消耗的计时逻辑,在松开按键后累加计时器,每秒加对应耐力值即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 06:48:05