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

Godot RayCast2D使用问题求助:随机点位连线功能异常

问题分析与修复方案

代码里的核心问题

  • point_a在全局初始化,只会获取一次初始位置,点位移动后位置不会更新,应该每次绘制前获取实时全局位置。
  • 单个RayCast2D只能检测一个方向上的第一个碰撞体,没法覆盖周围所有点位,你需要多个射线朝不同方向排列,或者换用更适合的Area2D来批量检测。
  • rays.get_collider().get_parent() == "Location"是拿节点对象和字符串对比,永远不成立,应该判断节点的name属性:rays.get_collider().get_parent().name == "Location"。
  • point_b是单个变量,只能存一个目标点位,draw_line是布尔值,只能触发一次绘制,没法批量处理多个连接点。

方案1:用Area2D实现批量检测(更简单高效)

既然你最初尝试过Area2D,其实它适合这种“检测区域内所有目标”的场景,之前没成功是因为没循环处理所有重叠对象。

修改后的代码示例:

# 存储所有需要连接的目标点位
var target_points: Array[Vector2] = []

func _process(delta):
    target_points.clear()
    # 获取Area2D区域内所有重叠的Location节点
    for body in $Area2D.get_overlapping_bodies():
        if body.name == "Location" and body != self:
            # 转成本地坐标存起来
            target_points.append(to_local(body.get_global_position()))
    # 触发重绘
    update()

func _draw():
    var current_pos = Vector2.ZERO  # 本地坐标下自身位置是(0,0)
    for target_pos in target_points:
        draw_line(current_pos, target_pos, Color(1, 1, 1, 1), 2)

使用说明:

  • 给每个点位节点添加Area2D,并设置合适的碰撞形状(比如CircleShape2D,半径设为你的“附近”范围)。
  • 确保所有点位节点的name是Location,并且碰撞层/掩码设置正确,让Area2D能检测到彼此。

方案2:用RayCast2D实现多方向检测

如果坚持用RayCast2D,你需要在点位周围添加多个RayCast2D(比如8个方向),然后逐个检测:

修改后的代码示例:

var target_points: Array[Vector2] = []

func _process(delta):
    target_points.clear()
    # 遍历所有子节点中的RayCast2D
    for ray in get_children():
        if ray is RayCast2D:
            if ray.is_colliding():
                var collider_parent = ray.get_collider().get_parent()
                if collider_parent is Node2D and collider_parent.name == "Location" and collider_parent != self:
                    # 转成本地坐标
                    target_points.append(to_local(collider_parent.get_global_position()))
    update()

func _draw():
    var current_pos = Vector2.ZERO
    for target_pos in target_points:
        draw_line(current_pos, target_pos, Color(1, 1, 1, 1), 2)

使用说明:

  • 在点位节点下添加多个RayCast2D,调整它们的方向覆盖周围区域(比如0°、45°、90°...315°)。
  • 每个RayCast2D的碰撞层/掩码要和点位节点匹配,并且开启enabled。

额外注意事项

  • 确保所有Location节点的碰撞体(比如CollisionShape2D)设置正确,碰撞层和掩码相互匹配,否则检测不到。
  • 如果点位是随机生成的,生成时记得给每个节点设置name为Location,避免名称不匹配。
  • draw_line方法在本地坐标系下绘制,所以把目标点位转成本地坐标后,自身位置就是Vector2.ZERO,不用再转。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 21:30:44