在Godot 3D Doom类游戏中实现冲刺与stamina机制的问题排查
3D Doom类游戏冲刺机制 stamina 归零时无法阻止的修复方案
问题根源
- Stamina消耗逻辑未做帧率同步与下限限制:原代码未将消耗值乘以
delta,导致消耗速度随帧率波动;且未限制value最小值为0,可能出现负数干扰判断。 - Player冲刺判断条件不够精准:原判断
stamina >=1会遗漏0 < stamina <1的情况,且当stamina归零时,可能因节点更新顺序问题导致判断不及时。
修复步骤
1. 修正Stamina.gd的 stamina 处理逻辑
func _process(delta): if Input.is_action_pressed("Shift"): # 乘以delta保证跨帧率消耗速度一致,同时限制最小值为0 value = max(value - 0.505 * delta, 0) func _on_timer_timeout(): # 限制最大值为100,避免 stamina 溢出 if value < 100: value = min(value + 1, 100)
2. 调整Player.gd的冲刺判断逻辑
# 提前获取Stamina节点引用,提升性能与稳定性 @onready var stamina_control = $"../../Control" func _process(delta): var current_stamina = stamina_control.stamina # 仅当Shift按住且stamina大于0时允许冲刺 if Input.is_action_pressed("Shift") and current_stamina > 0: SPEED = sprintspeed else: SPEED = 5
额外优化建议
给Stamina的value添加属性限制,避免异常值:
@export var value: float = 100 setget set_stamina_value func set_stamina_value(new_value: float): # 强制将stamina限制在0-100区间内 value = clamp(new_value, 0, 100)
内容的提问来源于stack exchange,提问作者Zdc360
相关产品推荐
相关产品推荐

