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

はじめに

前回の記事で学んだPath2Dは、ゲーム空間に「曲線のルート」を定義するノードでした。しかし、ルートだけではキャラクターは動きません。そのルート上を実際に移動させるのがPathFollow2Dノードです。PathFollow2Dは、Path2Dが定義した曲線に沿って滑らかに移動するオブジェクトを実現します。

敵キャラクターの自動巡回、空を飛ぶ雲やカメラパス、ループするコンベアベルトなど、多くのゲーム要素で活躍するノードです。この記事では、PathFollow2Dの使い方、プロパティ、そして実践的な活用法を詳しく解説します。

PathFollow2Dとは?

PathFollow2Dは、親ノード(Path2D)が定義した曲線に沿って移動するノードです。progress値を操作することで、曲線上のどの位置にいるかを制御します。Path2Dが「線路」なら、PathFollow2Dが「その上を走る電車」です。

線路の上を走る電車をイメージしてください。線路(Path2D)が存在してはじめて、その上を電車(PathFollow2D)が移動できます。電車の位置を「100メートル地点」と言うように、PathFollow2Dも「進捗100」のように曲線上の位置を数値で管理します。

継承ツリー:


PathFollow2D → Node2D → CanvasItem → Node

Path2Dの子ノードとして配置される必要があります。そうすることで、PathFollow2Dは親のPath2D内のCurve2Dにアクセスし、そのルート上を移動できます。




PathFollow2Dとその子ノード
PathFollow2DはPath2Dの子として配置され、その上を移動する。さらにPathFollow2Dの子にSprite2Dを配置してキャラクターを表現

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

  • 敵キャラクターの自動巡回:敵が決まったルートに沿って移動し続ける場合。progressを毎フレーム増加させるだけで実装できます。
  • 空を飛ぶ雲・鳥・移動物体:背景要素がスムーズなアニメーション付きで移動する演出。パーティクルではなく、明確なオブジェクトとして表現したい場合。
  • ループするコンベアベルト・エスカレーター:プレイヤーが乗れるギミック。プレイヤーをPathFollow2Dに「乗せる」ことで、同時に移動させられます。
  • カットシーンのカメラ移動:ゲームの演出シーンで、カメラをスムーズにパンニング・ズームアウトさせるアニメーション。

別のノードが適切な場面:

  • ルートが曲線ではなく、単なるAからBへの移動であればTween(アニメーション)の方がシンプル。
  • AIが動的に敵を追いかける場合は、NavigationAgent2Dを使用します。
  • 複雑な物理演算や衝突判定を伴う移動はRigidBody2Dを推奨。

主なプロパティと機能

プロパティ・メソッド 役割
progress float 曲線上の進捗距離(ピクセル単位)。0から曲線全長までの値
progress_ratio float 0.0~1.0に正規化された進捗値。ルート全体を相対的に表現
h_offset float 曲線の左右方向へのオフセット。複数のPathFollow2Dを平行に走らせたいときに使用
v_offset float 曲線の上下方向へのオフセット
rotates bool trueにするとPathFollow2Dが曲線の向きに自動で回転(デフォルト:true)
loop bool trueでprogress値が曲線全長を超えるとリセット。ループ移動を実現(デフォルト:true)

GDScript コード例1:PathFollow2Dで敵を自動巡回させる


extends PathFollow2D

@export var speed = 100 # 毎秒のピクセル移動量

func _process(delta):
# progressを毎フレーム更新(ループは自動)
progress += speed * delta

# 曲線の長さを取得
var path = get_parent() as Path2D
var curve_length = path.curve.get_baked_length()

# ループ処理(自動だがここで明示的に制御することも可能)
if progress > curve_length:
progress = 0

GDScript コード例2:progress_ratioを使ったスムーズな移動制御


extends PathFollow2D

@export var move_duration = 5.0 # 5秒でルート全体を移動

var elapsed_time = 0.0

func _process(delta):
elapsed_time += delta

# 移動時間内に0.0~1.0にマッピング
if elapsed_time < move_duration: progress_ratio = elapsed_time / move_duration else: # 移動完了 progress_ratio = 1.0 elapsed_time = 0.0 # ループ再開 # 曲線に沿って自動で方向が変わる(rotates=trueの場合)




PathFollow2Dの移動パターン
複数のPathFollow2Dを同じPath2D上に配置し、異なるprogressで管理。曲線に沿ってスムーズに向きが変わる

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

パラメータ・テクニック 変えると何が起きるか
progress_ratio を0.5に設定 PathFollow2Dが曲線の中点に移動。時間計算不要で便利な書き方
rotates = false 曲線に沿っても向きが変わらない。矢印アニメーション等、回転させたくない場合に使用
loop = false progress値が曲線全長に達するとそこで停止。ワンショット移動を実現
h_offset = 50、v_offset = -30 曲線から右50ピクセル、上30ピクセルのオフセット位置に配置。並列移動を簡単に実現
get_parent_path() と get_progress_ratio() スクリプト内で親Path2Dや現在の進捗を取得。条件分岐に使用

まとめ

PathFollow2Dは、Path2Dが定義した曲線に沿ってスムーズに移動するノードです。progress値やprogress_ratioを毎フレーム操作することで、敵の巡回、カメラアニメーション、ギミック移動など、多くのゲーム要素を実現できます。rotatesやloopなどのプロパティを活用すれば、より複雑な表現も可能です。

  • PathFollow2DはPath2Dの子ノードとして配置する必要がある
  • progressやprogress_ratioを毎フレーム更新して移動を制御
  • rotatesやh_offset、v_offsetで見た目や配置を細かく調整可能

次回は、プレイヤーや敵の動的な経路探索を実現するNavigationAgent2Dについて詳しく解説します。AI敵がプレイヤーを追いかけたり、障害物を避けて移動したりする場面で活躍するノードです。

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

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

コメント