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

Godot中绑定同一按键的两种攻击类型切换问题求助

解决方案:基于攻击范围切换J键攻击模式

核心思路

通过状态变量标记玩家是否处于敌人攻击范围,结合输入检测逻辑,在按下J键时根据当前状态触发对应的攻击动作。需要正确处理区域检测信号,同时做好攻击状态的冷却与重置。

步骤1:状态变量与区域信号配置

在玩家脚本中定义状态变量,并正确连接攻击范围检测区域的信号:

# Player.gd
var is_in_attack_range: bool = false  # 是否处于敌人攻击范围内
var is_attacking: bool = false       # 是否正在攻击
const ATTACK_COOLDOWN: float = 0.3   # 攻击冷却时间,防止重复触发
var attack_cooldown_timer: float = 0.0

func _ready():
    # 连接攻击范围区域的进入/离开信号(假设区域节点名为AttackRangeArea)
    $AttackRangeArea.body_entered.connect(_on_attack_range_body_entered)
    $AttackRangeArea.body_exited.connect(_on_attack_range_body_exited)

步骤2:处理区域信号,更新状态

确保只对敌人对象触发状态变化,且敌人全部离开后重置状态:

func _on_attack_range_body_entered(body: Node):
    # 检查进入区域的是否为敌人(需给所有敌人添加"enemy"分组)
    if body.is_in_group("enemy"):
        is_in_attack_range = true

func _on_attack_range_body_exited(body: Node):
    if body.is_in_group("enemy"):
        # 检查是否还有其他敌人在范围内,避免单个敌人离开就直接重置状态
        var remaining_enemies = $AttackRangeArea.get_overlapping_bodies()
        is_in_attack_range = remaining_enemies.size() > 0

步骤3:输入检测与攻击触发

在_process中处理J键输入,根据状态切换攻击类型:

func _process(delta: float):
    # 更新冷却计时器
    if attack_cooldown_timer > 0:
        attack_cooldown_timer -= delta

    # 检测J键按下(假设输入映射名为"attack")
    if Input.is_action_just_pressed("attack") and not is_attacking and attack_cooldown_timer <= 0:
        if is_in_attack_range:
            start_combo_attack()
        else:
            single_punch()
        attack_cooldown_timer = ATTACK_COOLDOWN

# 单发拳击实现
func single_punch():
    is_attacking = true
    # 播放单发拳击动画、音效
    $AnimationPlayer.play("SinglePunch")
    # 动画结束后重置攻击状态
    yield($AnimationPlayer, "animation_finished")
    is_attacking = false

# 连击实现
func start_combo_attack():
    is_attacking = true
    # 播放连击动画(可在动画关键帧添加伤害检测逻辑)
    $AnimationPlayer.play("ComboAttack")
    yield($AnimationPlayer, "animation_finished")
    is_attacking = false

关键注意事项

  • 碰撞层设置:确保攻击范围区域的碰撞层和掩码正确配置,仅检测敌人所在的碰撞层。
  • 连击扩展:如果需要支持连续按J键触发多段连击,可以在动画的关键帧添加信号(比如combo_continue),在信号回调中允许再次触发下一段攻击,同时维护combo_stage变量跟踪连击进度。
  • 状态重置:务必处理body_exited后的状态判断,避免单个敌人离开后错误切换回单发模式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 05:15:05