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

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的本地坐标逻辑。

修改方案

  1. 碰撞时:基于碰撞点的反射方向计算dl的终点,更新线段点数组
  2. 无碰撞时:重置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 05:02:23