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

如何在Godot中检测子节点Sword Hitbox而非父节点的碰撞?

解决仅检测玩家剑Hitbox碰撞的问题

问题根源

你当前的_on_body_entered回调中,body参数返回的是碰撞的物理主体节点(比如Player的根节点,通常是CharacterBody2D/RigidBody2D),而非其子节点"Sword Hitbox"。所以直接判断body.name == "Sword Hitbox"永远不会触发——因为碰撞触发时,body指向的是Player根节点,不是Hitbox子节点。

两种可行解决方案

方案一:给剑Hitbox单独绑定碰撞信号

这是最直接的方式,让Hitbox自己处理碰撞:

  1. 选中Player节点下的Sword Hitbox(Collision2D节点)
  2. 在编辑器右侧「信号」面板中找到body_entered信号,连接到Player脚本或敌人脚本
  3. 在回调函数中直接处理攻击逻辑:
# 示例:绑定到Player脚本的回调
func _on_sword_hitbox_body_entered(body: Node2D) -> void:
    # 用分组判断敌人比名字更可靠,提前给敌人添加"enemies"分组
    if body.is_in_group("enemies"):
        print("剑击中敌人")
        # 这里编写扣血、击退等攻击逻辑

方案二:在敌人脚本中判断碰撞来源

如果坚持在敌人脚本中处理,可以通过碰撞形状对来确认是否是剑Hitbox触发的碰撞:

func _on_body_entered(body: Node2D) -> void:
    if body.name == "Player":
        # 遍历当前所有碰撞形状对,确认碰撞来源
        for shape_pair in get_collision_shape_pairs():
            var sword_hitbox = body.get_node_or_null("Sword Hitbox")
            # 检查碰撞形状是否属于剑Hitbox节点
            if sword_hitbox and shape_pair.shape_a_owner == sword_hitbox:
                print("被玩家的剑击中")
                # 编写敌人受伤逻辑
                break

额外注意事项

  • 确保Sword Hitbox的碰撞层/掩码配置正确:敌人的碰撞层必须和剑Hitbox的碰撞掩码重叠,否则无法触发碰撞
  • 尽量用分组代替节点名判断(比如给敌人加enemies分组,给攻击Hitbox加attack_hitboxes分组),避免后续节点改名导致逻辑失效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 21:33:12