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

Godot开发中Enemy不受bullets影响 碰撞触发逻辑失效问题

问题修复方案

核心代码错误

你的碰撞逻辑判断对象写反了:_on_Enemy_body_entered方法的入参body是和当前Enemy发生碰撞的其他节点,你当前代码里写的is_in_group("bullet")默认是判断Enemy自身是否属于bullet分组,判断结果永远为false,所以后续逻辑完全不会执行。
将代码修改为如下形式即可修复这个逻辑错误:

func _on_Enemy_body_entered(body):
    # 对碰撞到的对象做分组判断,而非判断自身
    if body.is_in_group("bullet"):
        Player.score += 1
        queue_free()

其他碰撞不触发的常见排查点

如果修改完代码逻辑仍然不生效,按以下条目逐一核对配置:

  • 碰撞层与掩码配置不匹配:Enemy和Bullet的碰撞层(Collision Layer)必须至少有一个值同时被对方的碰撞掩码(Collision Mask)勾选,引擎才会执行两者的碰撞检测。通用配置方案为:将Bullet划分到独立的第2碰撞层,Enemy的碰撞掩码勾选第2层;将Enemy划分到独立的第3碰撞层,Bullet的碰撞掩码勾选第3层。
  • 碰撞形状配置异常:两个节点上挂载的CollisionShape2D(2D项目)/CollisionShape3D(3D项目)必须指定了有效碰撞形状、形状尺寸不为0,且disabled属性为未勾选状态。
  • 信号连接异常:确认body_entered信号是从Enemy身上的碰撞宿主节点(CharacterBody/RigidBody/Area类节点)正确连接到当前脚本方法,不存在连错节点、漏连、方法名拼写不匹配的问题。注意如果你的Enemy是Area类型节点,要确保monitoring属性为开启状态,否则不会检测进入的物体。
  • 节点实例化逻辑异常:子弹实例生成后必须调用add_child()方法加入当前场景树,且子弹在碰撞到Enemy前没有被提前销毁、没有因为速度过快穿过碰撞体(高速移动的物体可以开启碰撞体的continuous_cd属性做连续碰撞检测,避免穿透)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 10:27:17