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

如何在Godot 4中为Line2D动态添加碰撞?

解决Godot绘制线条的物理碰撞问题

你的代码里用的Line2D只是负责显示的节点,本身没有物理碰撞能力,要让线条和其他碰撞体产生交互,需要给每条线条搭配物理体节点和碰撞形状节点。下面是具体的修改方案:

核心思路

每次绘制线条时,创建一个包含三个节点的组合:

  • StaticBody2D(或RigidBody2D,如果需要线条受重力等物理影响):提供物理交互能力
  • Line2D:负责显示绘制的线条
  • CollisionPolygon2D:根据线条的点生成碰撞形状,依附在物理体上

修改后的代码

@onready var _lines := $Lines

var _pressed := false
var _current_body: StaticBody2D  # 物理体节点
var _current_line: Line2D
var _current_collision: CollisionPolygon2D

func _input(event):
    if event is InputEventMouseButton:
        _pressed = event.pressed
        
        if _pressed:
            # 创建物理体节点,这里用StaticBody2D,若需要线条能动改用RigidBody2D
            _current_body = StaticBody2D.new()
            _lines.add_child(_current_body)
            
            # 创建Line2D并添加到物理体下
            _current_line = Line2D.new()
            _current_line.width = 4  # 可调整线条粗细
            _current_body.add_child(_current_line)
            
            # 创建碰撞多边形并添加到物理体下
            _current_collision = CollisionPolygon2D.new()
            _current_body.add_child(_current_collision)
        
    if event is InputEventMouseMotion && _pressed:
        _current_line.add_point(event.position)
        # 同步更新碰撞形状:用Line2D的点生成碰撞多边形
        _current_collision.build_from_points(_current_line.points)

关键说明

  • 物理体选择:如果希望绘制的线条是固定障碍物,用StaticBody2D;如果需要线条能被其他物体推动、受重力影响,替换成RigidBody2D即可。
  • 碰撞形状更新:每次添加点后调用build_from_points,让碰撞形状实时跟着绘制的线条变化。
  • 线条粗细:可以通过_current_line.width调整显示的线条宽度,碰撞形状会自动适配点的路径。

测试时,你可以在场景中放一个带CollisionShape2D的RigidBody2D(比如一个小球),绘制线条后让小球下落,就能看到碰撞效果了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 10:27:17