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

Godot 4中RigidBody2D的body_entered()信号失效问题求助

解决Godot中RigidBody2D与CharacterBody2D碰撞时body_entered信号未触发的问题

可能的原因及对应解决方案

1. 信号未正确连接

你提到将信号连接到自身,但需确认连接方式是否生效:

  • 编辑器连线:选中小行星RigidBody2D节点,在信号面板找到body_entered信号,拖拽到自身节点,选择_on_body_entered函数。仅编写函数但未完成连线操作,信号不会触发。
  • 代码手动连接:若不想依赖编辑器,可在小行星的_ready函数中添加连接代码:
connect("body_entered", self, "_on_body_entered")

2. 碰撞层与掩码配置错误

虽然你描述的逻辑正确(玩家图层1、掩码2;小行星图层2、掩码1),但需验证实际设置:

  • 选中玩家CharacterBody2D节点,检查器中确认Collision Layer为1,Collision Mask为2。
  • 选中小行星RigidBody2D节点,确认Collision Layer为2,Collision Mask为1。
  • 注意:碰撞层/掩码需设置在CharacterBody2D/RigidBody2D节点本身,而非子节点CollisionShape2D。

3. _integrate_forces强制赋值干扰碰撞检测

你在小行星的_integrate_forces中直接设置linear_velocity = speed,会完全覆盖物理引擎的速度计算,可能导致碰撞信号失效。建议修改为:

  • 在_physics_process中控制速度(适合直接操控刚体的场景):
func _physics_process(delta):
    linear_velocity = speed
  • 或使用物理力驱动运动,让引擎处理碰撞逻辑:
func _ready():
    var required_force = speed * mass # mass为小行星检查器中设置的质量
    apply_central_force(required_force)

4. 碰撞形状配置缺失或错误

确保玩家和小行星都正确配置了碰撞形状:

  • 两个节点下必须包含CollisionShape2D或CollisionPolygon2D子节点。
  • 碰撞形状的大小、位置需与Sprite匹配,避免偏移或过小导致碰撞检测失效。

验证与功能完善

修改后运行游戏,若控制台输出The signal is working!,即可在信号函数中调用玩家扣血逻辑:

func _on_body_entered(body):
    print("The signal is working!")
    if body is CharacterBody2D:
        body.hit(10) # 扣除10点HP

内容的提问来源于stack exchange,提问作者feather

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 18:20:35