Line2D衝突判定

課題

衝突検出を Line2D に対して行いたい。

解決策

ノード設定

以下のノードをシーンに追加し、必要に応じてラインを描いてください。

 Line2D
     StaticBody2D

まだボディに衝突形状を追加しないでください!

メモ

衝突ではなく線との重複を検出したい場合は、代わりに Area2D を使用することもできます。

次に、ボディに衝突形状を追加が必要です。以下の2つのオプションがあります。

その1:SegmentShape2Dの使用

SegmentShape2D は線分衝突形状です。この手法の目的は、直線上の各点ペアに対して個別のセグメント衝突を作成することです。

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

その2:RectangleShape2Dを使用する場合

SegmentShape2D は幅成分を持たないため、線の衝突判定に厚みが必要な場合には、代わりに矩形の衝突判定を使用することをオススメします。

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

プロジェクトのダウンロード

プロジェクトのサンプルコードはこちらからダウンロードできます。https://github.com/godotrecipes/line2d_collision