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
相关产品推荐
相关产品推荐

