「明明撞上了却没反应」是 2D 入门最高频的一类问题,排查基本按三步走。

    第一步看碰撞层和掩码。Godot 里每个碰撞对象有 layer(我在哪一层)和 mask(我检测哪一层)。两边要对得上:玩家在 layer 1、mask 2,敌人在 layer 2、mask 1,才算互相看得见。只改一边没用。项目设置里给层起名字(player、mobs、walls),比记数字不容易错,编辑器里也能直接看名字。

    第二步看用哪个信号。Area2D 进区域用 area_entered,CharacterBody2D 或 RigidBody2D 撞进来用 body_entered。根节点类型选错了,信号就永远不发。这个项目玩家和敌人都用 Area2D,所以连的是 area_entered。

    第三步看碰撞形状是不是真的存在。CollisionShape2D 建了但没给它指定 Shape 资源,编辑器里会显示一个警告图标,运行时等于没碰撞体。还有一种是形状尺寸缩成了零,或者被父节点缩放连带压没了。

    调试时打开菜单里的「显示碰撞形状」(Debug → Visible Collision Shapes),跑起来直接看轮廓。八成的问题在这一眼就能定位,比逐行读脚本快得多。

    再补一个偏隐蔽的:monitoring 和 monitorable 两个开关。Area2D 默认都开,要是哪个脚本里顺手关过,信号同样不发。查完前三项还没头绪,就翻这两个属性。

    最后,信号连没连上也要确认。编辑器「节点」面板的信号页签会显示已有连接,代码连的则搜一下 connect 调用。重复连接会触发两次,漏连一次都不触发。