Godot 4.3中RayCast2D实现泡泡射手虚拟连线的问题求解
解决Godot 4.3泡泡射手瞄准线的两个问题
问题1:无法获取目标物体的颜色
你当前用get_collider().color获取颜色失败,核心原因是目标节点的颜色属性并非直接命名为color:
- 若目标是Sprite2D/AnimatedSprite2D这类渲染节点,颜色控制属性为
modulate而非color - 若目标是挂载自定义脚本的节点,需确保
color变量是公开(未加private修饰)的有效变量
修改方案
替换原颜色获取逻辑,优先适配通用渲染节点的modulate属性,再兼容自定义color变量:
var target_color = default_color if get_collider().has("modulate"): target_color = get_collider().modulate elif get_collider().has("color"): target_color = get_collider().color vl.default_color = target_color dl.default_color = target_color
问题2:虚拟线dl无法在触达目标后正确终止
原代码仅在无碰撞时设置dl.points[1].x,但碰撞场景下未更新dl的线段点数组,导致线段长度无法随碰撞点调整;同时直接修改points[1].x不符合Line2D的本地坐标逻辑。
修改方案
- 碰撞时:基于碰撞点的反射方向计算
dl的终点,更新线段点数组 - 无碰撞时:重置
dl的线段为沿当前瞄准方向延伸的预设长度
完整修正代码
extends RayCast2D @onready var vl = $LineOne @onready var dl = $LineTwo var vector_line_length = 600 @onready var manager = $"../Manager" var default_color: Color = Color(0.388,0.643,0.969,1) func _physics_process(_delta: float) -> void: if not $"../Shoot".was_shooted: vl.visible = true dl.visible = true if $"../Shoot".can_be_shot: look_at(get_global_mouse_position()) if is_colliding(): var collision_point = to_local(get_collision_point()) var target_color = default_color # 修正颜色获取逻辑 if get_collider().has("modulate"): target_color = get_collider().modulate elif get_collider().has("color"): target_color = get_collider().color if not manager.items.has(get_collider()): vl.default_color = default_color dl.default_color = default_color vl.points = [Vector2.ZERO, collision_point] # 计算反射方向并生成dl的线段 var incoming_dir = global_position.direction_to(get_collision_point()).normalized() var reflection_dir = get_collision_normal().reflect(incoming_dir) var dl_global_end = get_collision_point() + reflection_dir * vector_line_length dl.position = get_collision_point() dl.points = [Vector2.ZERO, to_local(dl_global_end)] dl.rotation = reflection_dir.angle() dl.visible = true else: vl.default_color = target_color dl.default_color = target_color vl.points = [Vector2.ZERO, collision_point] dl.visible = false else: vl.default_color = default_color vl.points = [Vector2.ZERO, Vector2(vector_line_length, 0)] dl.points = [Vector2.ZERO, Vector2(vector_line_length, 0)] else: vl.visible = false dl.visible = false
内容的提问来源于stack exchange,提问作者Coder
相关产品推荐
相关产品推荐

