Godot入門:Line2Dの使い方と活用法

はじめに

ゲームで敵の移動軌跡を表示したり、魔法のビームを描いたり、グラフのデータを視覚化したりする際に、「線」を描く必要があります。Godot 4で2D線を描くときの標準的なノードがLine2Dです。複雑な図形描画処理を書くことなく、シンプルに線を引くことができます。

シューティングゲームの敵の軌跡から、ビジュアルノベルの演出効果まで、あらゆる場面で活躍するノードです。

Line2Dとは?

Line2Dは、複数の点を指定して、それらを結ぶ線を描画するノードです。キャンバスに点を打ってそれをつなぐ折れ線を描く、というイメージです。配列で複数の座標を指定すると、自動的にそれらを結ぶ線が描画されます。線の太さや色、テクスチャなども自由に設定できます。

Line2Dの継承関係は以下の通りです。

Line2D

Node2D

CanvasItem

Node

Node2Dを継承しているため、位置・回転・スケールなどの2D変換が可能で、シーンツリーに配置して使用します。




Line2Dの描画例
Line2Dで様々な線を簡単に描画できます

このノードを使うべき場面

  • 敵や弾の軌跡表示:移動経路を可視化して、ゲームの状況をプレイヤーに伝える
  • レーザービーム・魔法エフェクト:光線状の攻撃表現に最適。テクスチャを組み合わせると派手な演出に
  • グラフ・チャート描画:ゲーム内統計情報、敵の体力推移などを視覚化
  • ロープ・チェーンの表現:重力で垂れ下がるロープなど、複雑な形状を動的に描画

別のノードが適切な場面

閉じた図形で塗りつぶしが必要な場合はPolygon2D、より複雑な描画処理が必要な場合はCanvasItemdraw_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)




Line2Dの活用例
Line2Dは様々な場面でビジュアル表現に活用できます

もっと使いこなす:カスタマイズできるパラメータ

パラメータ・テクニック 変えると何が起きるか
widthの動的変更 キーフレームで太さを変化させるとパルス効果が作れる。エネルギー表現やリズムゲーム演出に活用
default_colorでアルファ値を調整 透明度を下げると淡い軌跡になり、時間経過で薄れていく演出が表現できる
textureでビーム風テクスチャ使用 グラデーションテクスチャを指定するとリアルなビームやエネルギー線になる
複数のLine2Dを重ねる 異なる色・太さのLine2Dを複数配置して発光効果やアウトライン表現が可能
点数とantialiasedの設定 点数が多いほど滑らかだがメモリ使用量増加。軌跡の量をフレームレートと相談して決定
点の動的更新で移動物体の軌跡 set_point_position()で既存の点を更新。敵や弾の移動に完全に追従する軌跡が描画できる

まとめ

Line2Dは「線を引く」というシンプルな機能から、複雑なビジュアル表現まで多くの場面で活躍するノードです。敵の軌跡、レーザービーム、グラフ描画など、幅広い応用が可能です。複数のLine2Dを組み合わせることで、さらに表現力豊かな演出を実現できます。

  • Line2Dは座標配列から自動的に線を描画する、シンプルで強力なノード
  • add_point()で動的に点を追加して移動する軌跡を表現できる
  • widthdefault_colortextureを調整してビジュアル効果を高める

次回は、Line2Dと似ていながら「塗りつぶし可能な多角形」を描くPolygon2Dノードについて解説します。地形や建物、複雑なUI形状などの表現に活躍します。

シリーズ:Godot 4 ノード解説

この記事はGodot 4.xをもとに執筆しています。

コメント