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

Godot 4.0.b7:如何为动态生成的CollisionShape2D绑定mouse-entered信号

解决方案

问题根源

你错误地尝试给**形状资源(CircleShape2D)**绑定mouse_entered信号,但这个信号属于Area2D/CollisionObject2D这类具备碰撞交互能力的节点——形状仅用于定义碰撞范围,不处理输入信号。

正确实现步骤

  1. 把动态生成的行星节点设为Area2D(推荐用于鼠标交互,它专门处理区域检测与输入信号),将CollisionShape2D作为它的子节点。
  2. 直接给Area2D节点绑定mouse_entered信号,而非它的shape资源。

代码示例(替换你错误的绑定逻辑)

假设你动态生成行星的代码框架如下,修正信号绑定部分:

# 动态生成行星节点
func spawn_planet(position: Vector2, radius: float):
    # 创建Area2D作为行星的核心交互节点
    var planet_area = Area2D.new()
    planet_area.position = position
    # 将节点挂载到Camera2D下
    $CanvasLayer/Camera2D.add_child(planet_area)

    # 创建CollisionShape2D并设置圆形碰撞范围
    var collision_shape = CollisionShape2D.new()
    var circle_shape = CircleShape2D.new()
    circle_shape.radius = radius
    collision_shape.shape = circle_shape
    planet_area.add_child(collision_shape)

    # 绑定mouse_entered信号到处理函数
    planet_area.mouse_entered.connect(_on_mouse_entered)

# 鼠标进入行星区域的处理函数
func _on_mouse_entered():
    print("鼠标进入行星区域")
    # 这里添加你的交互逻辑,比如高亮、缩放、显示提示等

额外注意事项

  • 确保Area2D的碰撞层/掩码设置正确(默认启用,若修改过需保证能接收鼠标输入)。
  • 检查Camera2D的input_pickable属性是否为true(默认开启,确保相机下的节点能被鼠标检测到)。
  • 若你使用StaticBody2D等其他碰撞节点,同样是给节点本身绑定mouse_entered信号,而非形状资源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 03:25:27