はじめに
ゲームで敵の移動軌跡を表示したり、魔法のビームを描いたり、グラフのデータを視覚化したりする際に、「線」を描く必要があります。Godot 4で2D線を描くときの標準的なノードがLine2Dです。複雑な図形描画処理を書くことなく、シンプルに線を引くことができます。
シューティングゲームの敵の軌跡から、ビジュアルノベルの演出効果まで、あらゆる場面で活躍するノードです。
Line2Dとは?
Line2Dは、複数の点を指定して、それらを結ぶ線を描画するノードです。キャンバスに点を打ってそれをつなぐ折れ線を描く、というイメージです。配列で複数の座標を指定すると、自動的にそれらを結ぶ線が描画されます。線の太さや色、テクスチャなども自由に設定できます。
Line2Dの継承関係は以下の通りです。
Line2D
↓
Node2D
↓
CanvasItem
↓
Node
Node2Dを継承しているため、位置・回転・スケールなどの2D変換が可能で、シーンツリーに配置して使用します。

このノードを使うべき場面
- 敵や弾の軌跡表示:移動経路を可視化して、ゲームの状況をプレイヤーに伝える
- レーザービーム・魔法エフェクト:光線状の攻撃表現に最適。テクスチャを組み合わせると派手な演出に
- グラフ・チャート描画:ゲーム内統計情報、敵の体力推移などを視覚化
- ロープ・チェーンの表現:重力で垂れ下がるロープなど、複雑な形状を動的に描画
別のノードが適切な場面
閉じた図形で塗りつぶしが必要な場合はPolygon2D、より複雑な描画処理が必要な場合はCanvasItemでdraw_line()メソッドを使う方が適切です。
主なプロパティと機能
| プロパティ・メソッド | 型 | 役割 |
|---|---|---|
points |
PackedVector2Array | 線を構成する各点の座標配列。この配列に座標を追加すると線が描画される |
width |
float | 線の太さ(ピクセル単位)。デフォルトは2.0 |
default_color |
Color | 線全体の色(テクスチャなしの場合) |
texture |
Texture2D | 線のテクスチャ。設定するとテクスチャが線の長さに沿って繰り返される |
add_point(position, at_position) |
void | 線に点を追加。at_positionで挿入位置を指定できる |
remove_point(index) |
void | 指定インデックスの点を削除 |
clear_points() |
void | すべての点をクリアして線を消去 |
set_point_position(index, position) |
void | 既存の点の座標を更新。移動する軌跡を描画するときに使う |
コード例1:敵の移動軌跡を描画
extends Node2D
@onready var line = $Line2D
@onready var enemy = $Enemy
func _ready() -> void:
# 線の設定
line.default_color = Color.WHITE
line.width = 3.0
line.clear_points()
func _process(delta: float) -> void:
# 敵の現在位置を線の終点として追加
line.add_point(enemy.position)
# 軌跡の長さを制限(例:50点まで保持)
if line.get_point_count() > 50:
line.remove_point(0) # 古い点を削除
func _on_button_pressed() -> void:
# ボタンで軌跡をクリア
line.clear_points()
コード例2:レーザービームエフェクト
extends Node2D
@onready var laser_line = $LaserLine
var laser_targets = [] # ビームが通る点
func _ready() -> void:
laser_line.default_color = Color.YELLOW
laser_line.width = 5.0
func shoot_laser(start_pos: Vector2, end_pos: Vector2, bounces: int = 3) -> void:
laser_line.clear_points()
laser_targets.clear()
var current_pos = start_pos
laser_targets.append(current_pos)
for i in range(bounces):
# 反射処理(簡略化)
var random_offset = Vector2(randf_range(-50, 50), randf_range(-50, 50))
var next_pos = end_pos + random_offset
laser_targets.append(next_pos)
current_pos = next_pos
# すべての点を線に設定
for pos in laser_targets:
laser_line.add_point(pos)
# レーザーをTweenでアニメーション
var tween = create_tween()
tween.set_trans(Tween.TRANS_ELASTIC)
tween.tween_property(laser_line, "modulate:a", 0.0, 0.5)
func _process(delta: float) -> void:
# プレイヤーと敵を結ぶ直線を常に描画
if is_instance_valid($Player) and is_instance_valid($Enemy):
laser_line.clear_points()
laser_line.add_point($Player.position)
laser_line.add_point($Enemy.position)

もっと使いこなす:カスタマイズできるパラメータ
| パラメータ・テクニック | 変えると何が起きるか |
|---|---|
widthの動的変更 |
キーフレームで太さを変化させるとパルス効果が作れる。エネルギー表現やリズムゲーム演出に活用 |
default_colorでアルファ値を調整 |
透明度を下げると淡い軌跡になり、時間経過で薄れていく演出が表現できる |
textureでビーム風テクスチャ使用 |
グラデーションテクスチャを指定するとリアルなビームやエネルギー線になる |
| 複数のLine2Dを重ねる | 異なる色・太さのLine2Dを複数配置して発光効果やアウトライン表現が可能 |
点数とantialiasedの設定 |
点数が多いほど滑らかだがメモリ使用量増加。軌跡の量をフレームレートと相談して決定 |
| 点の動的更新で移動物体の軌跡 | set_point_position()で既存の点を更新。敵や弾の移動に完全に追従する軌跡が描画できる |
まとめ
Line2Dは「線を引く」というシンプルな機能から、複雑なビジュアル表現まで多くの場面で活躍するノードです。敵の軌跡、レーザービーム、グラフ描画など、幅広い応用が可能です。複数のLine2Dを組み合わせることで、さらに表現力豊かな演出を実現できます。
- Line2Dは座標配列から自動的に線を描画する、シンプルで強力なノード
add_point()で動的に点を追加して移動する軌跡を表現できるwidth、default_color、textureを調整してビジュアル効果を高める
次回は、Line2Dと似ていながら「塗りつぶし可能な多角形」を描くPolygon2Dノードについて解説します。地形や建物、複雑なUI形状などの表現に活躍します。
シリーズ:Godot 4 ノード解説
- 001〜035:各種ノード
- 036:PopupMenu
- 037:FileDialog
- 038〜080:その他のノード
- 081:Timer
- 082:Tween
- 083:HTTPRequest
- 084:Line2D(この記事)
- 085:Polygon2D
この記事はGodot 4.xをもとに執筆しています。


コメント