如何实现可实时更新的耐力系统:按住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
相关产品推荐
相关产品推荐

