Godot中CharacterBody2D与StaticBody2D碰撞无触发问题求助
问题:Godot 4中CharacterBody2D与StaticBody2D碰撞无打印输出
问题详情
我是Godot新手,想实现CharacterBody2D(玩家)和StaticBody2D(物品)碰撞时触发打印输出。现有3个场景:game_level、玩家场景(CharacterBody2D)、物品场景(StaticBody2D),已在game_level里实例化Player和Item作为子节点。
给物品的StaticBody2D附加了如下脚本:
extends StaticBody2D func _ready(): print("ready") func _on_StaticBody2D_body_entered(body): print("Static body collided with: ", body.name)
尝试调整两者的碰撞层与掩码,结果如下:
- 仅碰撞但无打印输出
CharacterBody2D || StaticBody2D Collision>Layer = 1 || Collision>Layer = 1 Collision>Mask = 1 || Collision>Mask = 1
- 直接穿过且无打印输出
CharacterBody2D || StaticBody2D Collision>Layer = 1 || Collision>Layer = 2 Collision>Mask = 1 || Collision>Mask = 2
- 仅碰撞但无打印输出
CharacterBody2D || StaticBody2D Collision>Layer = 1 || Collision>Layer = 2 Collision>Mask = 1 & 2 || Collision>Mask = 1 & 2
使用Godot版本:Godot_v4.0.1-stable_win64
解决方法
1. 手动连接碰撞信号
Godot 4不会自动绑定脚本里的_on_*格式回调函数,必须手动操作:
- 选中物品的StaticBody2D节点
- 打开右下角的信号面板
- 找到
body_entered信号,点击「连接」 - 在弹窗里选择当前StaticBody2D作为接收者,确认函数名为
_on_StaticBody2D_body_entered,点击「连接」
2. 正确配置碰撞层与掩码
要让StaticBody2D接收到CharacterBody2D的碰撞信号,需满足:
- StaticBody2D的Collision Mask包含CharacterBody2D的Collision Layer
- 如果需要物理阻挡(不穿过),CharacterBody2D的Collision Mask也要包含StaticBody2D的Collision Layer
推荐新手用这种简化设置:
CharacterBody2D || StaticBody2D Collision>Layer = 1 || Collision>Layer = 1 Collision>Mask = 1 || Collision>Mask = 1
该设置下两者会产生物理碰撞,且StaticBody2D能触发信号(前提是信号已连接)。
3. 额外检查项
- 确保两个节点都添加了CollisionShape2D或CollisionPolygon2D子节点,且碰撞形状完全覆盖节点的可视化范围
- 确认CharacterBody2D是通过
move_and_slide()或move_and_collide()方法移动的(只有这类物理移动函数才会触发碰撞信号)
内容的提问来源于stack exchange,提问作者FurtiveStranger
相关产品推荐
相关产品推荐

