Godot中如何检测KinematicBody2D玩家与RigidBody2D mob的碰撞?
Godot 玩家与敌人碰撞检测分步实现指南
前置说明
你已关闭mob的物理掩码避免物理交互,本次方案使用Area2D做检测,完全不影响原有逻辑,无需修改你已有的移动、敌人销毁、生成逻辑。
步骤1:给玩家场景添加碰撞配置
- 打开
KinematicBody2D.tscn玩家场景 - 选中根节点
KinematicBody2D,添加子节点CollisionShape2D - 选中刚添加的
CollisionShape2D,在右侧检查器的Shape属性,选择和玩家精灵匹配的形状(矩形选RectangleShape2D、圆形选CircleShape2D),调整形状大小完全覆盖玩家精灵 - 无需修改玩家的碰撞层/掩码,保留默认配置即可
步骤2:给敌人mob场景添加碰撞检测配置
- 打开
mob.tscn敌人场景 - 选中根节点
RigidBody2D,添加子节点Area2D,可命名为HitArea方便识别 - 选中
HitArea节点,添加子节点CollisionShape2D - 选中这个
CollisionShape2D,在检查器的Shape属性选择匹配敌人精灵的形状,调整大小完全覆盖敌人精灵 - 选中
HitArea节点,找到检查器里的碰撞层/碰撞掩码配置:- 碰撞层保持默认第1层勾选即可
- 碰撞掩码只勾选第1层,和玩家的碰撞层对应,确保只会检测到玩家的碰撞体
步骤3:连接碰撞信号
使用编辑器可视化连接,出错概率更低:
- 仍然在
mob.tscn场景内,选中刚才添加的HitArea(Area2D节点) - 点击编辑器右侧的
信号标签栏,找到body_entered信号(该信号会在Area2D检测到其他物理体进入时触发) - 双击
body_entered信号,弹出连接窗口,选择当前场景的根节点RigidBody2D作为接收信号的节点 - 在窗口底部的
接收方法输入框内填写方法名,比如_on_hit_area_body_entered,点击连接即可
步骤4:编写触发逻辑代码
打开mob场景根节点绑定的脚本,添加如下信号处理方法:
# mob脚本新增以下内容 func _on_hit_area_body_entered(body: Node2D) -> void: # 先判断进入碰撞区域的是否为玩家,避免其他物体误触发 if body.name == "KinematicBody2D": # 此处替换为你玩家根节点的实际名称,和玩家场景根节点名保持一致即可 print("检测到玩家和敌人发生接触!") # 后续需要添加的扣血、销毁敌人等逻辑都可以写在此处
功能验证
保存所有场景和脚本,运行主场景,操控玩家碰到生成的mob,即可在编辑器底部的输出栏看到对应打印内容。
常见问题排查
- 没有触发输出时,先检查两个碰撞的Shape是否正确覆盖精灵,避免出现形状比精灵小很多、偏移的情况
- 检查Area2D的碰撞掩码是否和玩家的碰撞层匹配,默认均为第1层即可
- 检查玩家的
CollisionShape2D是否添加在玩家根节点(KinematicBody2D)下,不要添加在精灵子节点内
内容的提问来源于stack exchange,提问作者Syoma
相关产品推荐
相关产品推荐

