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

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)

尝试调整两者的碰撞层与掩码,结果如下:

  1. 仅碰撞但无打印输出
CharacterBody2D            || StaticBody2D
Collision>Layer = 1        || Collision>Layer = 1
Collision>Mask = 1         || Collision>Mask = 1
  1. 直接穿过且无打印输出
CharacterBody2D            || StaticBody2D
Collision>Layer = 1        || Collision>Layer = 2
Collision>Mask = 1         || Collision>Mask = 2
  1. 仅碰撞但无打印输出
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 13:07:29