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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 13:21:18