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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 19:36:03