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