Line2D Collision

Problem

You want to have collisions with a Line2D.

Solution

Node setup

Add the following nodes to your scene, and draw your line as desired:

 Line2D
     StaticBody2D

Don’t add a collision shape to the body yet!

Note

You can use an Area2D instead if you want to detect overlap with the line rather than collision.

Next, we need to add collision shapes to the body. We have two options:

Option 1: Using SegmentShape2D

SegmentShape2D is a line-segment collision shape. The idea here is to create a segment collision for each pair of points in the line.

extends Line2D

func _ready():
    for i in points.size() - 1:
        var new_shape = CollisionShape2D.new()
        $StaticBody2D.add_child(new_shape)
        var segment = SegmentShape2D.new()
        segment.a = points[i]
        segment.b = points[i + 1]
        new_shape.shape = segment

Option 2: Using RectangleShape2D

SegmentShape2D does not have any width component, so if you need your line collision to have a thickness, you can use a rectangle collision instead.

extends Line2D

func _ready():
    for i in points.size() - 1:
        var new_shape = CollisionShape2D.new()
        $StaticBody2D.add_child(new_shape)
        var rect = RectangleShape2D.new()
        new_shape.position = (points[i] + points[i + 1]) / 2
        new_shape.rotation = points[i].direction_to(points[i + 1]).angle()
        var length = points[i].distance_to(points[i + 1])
        rect.extents = Vector2(length / 2, width / 2)
        new_shape.shape = rect

Download This Project

Download the project’s example code here: https://github.com/godotrecipes/line2d_collision