Godot中如何防止按住攻击键重复触发膝击攻击动画?
解决抓取后膝击重复触发的问题
核心原因
当前代码是每帧检测攻击键的按住状态,导致按住期间每帧都会触发膝击逻辑。要实现“按一次触发一次”,核心是只响应攻击键的单次按下动作,或者通过状态锁限制重复触发。
具体解决方案
方案1:检测按键的单次按下动作(优先推荐)
不同游戏引擎都提供了检测“按键从松开到按下瞬间”的API,替换原来的按住检测即可:
Unity(C#):
用Input.GetKeyDown替代Input.GetKey:void Update() { if (isGrabbingEnemy && Input.GetKeyDown(KeyCode.Attack)) { PerformKneeStrike(); } }Unreal Engine(C++):
用IsInputKeyJustPressed替代IsInputKeyDown:void APlayerChar::Tick(float DeltaTime) { Super::Tick(DeltaTime); if (bIsGrabbingEnemy && InputComponent->IsInputKeyJustPressed(EKeys::Attack)) { PerformKneeStrike(); } }
方案2:添加触发锁变量(兼容复杂逻辑场景)
如果无法直接使用单次按下API(比如需要结合长按的其他逻辑),可以加一个布尔变量控制触发权限,确保每次膝击完成后才能再次触发:
// Unity示例 bool isKneeStrikeAvailable = true; void Update() { if (isGrabbingEnemy && Input.GetKey(KeyCode.Attack) && isKneeStrikeAvailable) { isKneeStrikeAvailable = false; PerformKneeStrike(); // 两种解锁方式:通过动画事件(更精准)或延迟协程 // 方式1:动画事件——在膝击动画结束帧调用UnlockKneeStrike() // 方式2:协程延迟 StartCoroutine(UnlockKneeStrikeAfterDelay(0.6f)); } } void UnlockKneeStrike() { isKneeStrikeAvailable = true; } IEnumerator UnlockKneeStrikeAfterDelay(float delay) { yield return new WaitForSeconds(delay); isKneeStrikeAvailable = true; }
额外优化建议
- 绑定动画事件:在膝击动画的实际攻击生效帧触发伤害逻辑,同时在动画结束时解锁触发权限,既符合动作节奏,又能避免动作重叠。
- 及时更新抓取状态:当敌人挣脱、被释放时,立刻将
isGrabbingEnemy(或对应变量)置为false,防止无效触发。
内容的提问来源于stack exchange,提问作者Chris33556
相关产品推荐
相关产品推荐

