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

はじめに

前回解説したPath3Dでベジェ曲線のパスを定義しました。しかし、パスを作るだけでは何も動きません。「敵がこのパスに沿って移動したい」「カメラが曲線を描いて動きたい」という時に使うのが、今回のPathFollow3Dです。

PathFollow3Dを使うと、Path3Dの子ノードとして配置された任意のノード(3Dメッシュ、キャラクター、カメラなど)を、パスに沿った位置に自動配置できます。単なる移動だけでなく、パスの方向に合わせた回転も可能です。

PathFollow3Dとは?

PathFollow3Dは、親のPath3Dが持つパス上の「指定された位置(0〜1の割合、またはメートル)」に、自ノードを配置するノードです。進捗値を変更するだけで、パスに沿った移動を実現します。

継承ツリー:

PathFollow3D → Node3D → Node → Object

重要な点として、PathFollow3DはPath3Dの「子ノード」として配置されます。親のPath3DのCurve3Dを参照し、progressprogress_ratioプロパティを操作することでパス上の位置を制御します。

PathFollow3Dの主な特徴は以下の通りです。

  • パス追従が自動:progressを変更するだけで、位置・回転が自動で更新される
  • 2つの進捗制御方式:絶対距離(progress:メートル)と相対比率(progress_ratio:0.0~1.0)
  • 回転モード選択:YON_ONLY(Y軸回転のみ)から ORIENTED(フル3D回転)まで、複数の回転モードを用意
  • ループ対応:パスの終端に達したら自動でループするオプション




PathFollow3Dの進捗値と配置
PathFollow3Dの progress_ratio を変更することで、パス上の位置を制御。0.0は開始点、1.0は終端

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

使う場面:

  • 巡回敵:決まったルートを往復・ループする敵NPC(パトロール敵)
  • カットシーンカメラ:ゲーム内ムービーでカメラが曲線的に移動
  • 乗り物の移動:レール上を走行する列車・ロープウェイ・絡繰り装置
  • プラットフォーム移動:パスに沿って移動する動く足場・エレベーター
  • エフェクト軌道:複雑な曲線を描いて飛ぶパーティクルやモデル

使わない場面:

  • プレイヤーの自由な移動:PathFollow3Dは事前に定義されたパスに拘束されるため、プレイヤーの自由な移動には向きません
  • リアルタイムで経路を変更:複雑な動的経路探索が必要な場合はNavigationAgent3Dを使う方が適切です

主なプロパティと機能

プロパティ 説明 デフォルト
progress float パス上の移動距離(メートル)。0.0からget_baked_length()の値まで 0.0
progress_ratio float パスの進捗を0.0~1.0の比率で指定。0.5で中間地点 0.0
rotation_mode int(enum) パスの方向に合わせた回転モード。ROTATION_NONE / Y_ONLY / XY / XYZ / ORIENTED ROTATION_NONE
loop bool progressが終端に達したら自動でループするか true
tilt_enabled bool パスのtilt(バリング)を反映して回転するか true

回転モードの詳細:

モード 説明 用途
ROTATION_NONE パスの方向に関わらず、回転しない 独立した動きが必要な場合(例:飛行物体が上を向いたまま移動)
ROTATION_Y Y軸(上下)回転のみ。XZ平面での方向を追従 キャラクターが前を向きながら移動する場合(最も一般的)
ROTATION_XY XY平面での回転。Z軸回転は無視 ローラーコースターなど、複雑な3D軌道を描く乗り物
ROTATION_XYZ 3つの軸すべてで回転。ローリングなし 特殊な回転が必要な複雑な動き
ROTATION_ORIENTED パス上の接線方向 + tiltによるローリングを完全に反映 ローラーコースター・カメラレール(最も自然)

主なメソッド:

# 親のPath3Dを取得
get_path_reparent() -> Path3D

# パスの総長をパスから取得
var total_length = get_path_reparent().curve.get_baked_length()

コード例1:シンプルな巡回敵(progress_ratioを使用)

extends PathFollow3D

@export var speed = 0.5  # 0.0~1.0の範囲での移動速度(比率/秒)

func _physics_process(delta):
	# progress_ratioを増加させてパスを移動
	progress_ratio += speed * delta

	# ループはデフォルトで有効なため、自動的に0に戻る

コード例2:Tweenでパスを滑らかにアニメーション(カットシーン向け)

extends PathFollow3D

@export var duration = 5.0  # アニメーション時間(秒)

func start_cutscene():
	# progress_ratioを0.0から1.0まで、指定時間で変動させる
	var tween = create_tween()
	tween.set_trans(Tween.TRANS_SINE)
	tween.set_ease(Tween.EASE_IN_OUT)
	tween.tween_property(self, "progress_ratio", 1.0, duration)
	await tween.finished
	print("カットシーン完了")

コード例3:複数のPathFollow3Dを使った編隊移動(敵グループ)

# Parent: Path3D
# Children: PathFollow3D (複数)

extends Path3D

@export var patrol_speed = 1.0
@export var offset_step = 0.05  # PathFollow3D間のオフセット

func _ready():
	# 子のPathFollow3Dを取得して、初期位置をずらす
	var index = 0
	for child in get_children():
		if child is PathFollow3D:
			child.progress_ratio = index * offset_step
			index += 1

func _physics_process(delta):
	# すべてのPathFollow3Dを同じ速度で移動させる
	for child in get_children():
		if child is PathFollow3D:
			child.progress_ratio += patrol_speed * delta

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

まずは基本を動かしてみてから、余裕が出たら試してみてください。

パラメータ 目的 実装例
rotation_modeを使い分け ノードの向きをパスの形状に合わせる rotation_mode = PathFollow3D.ROTATION_ORIENTED
ローラーコースターに最適
progressでメートル単位制御 正確な距離ベースの制御が必要な場合 progress = 2.5 # パスの2.5メートル地点
tilt_enabledの切り替え パスの回転(バリング)を有効/無効 tilt_enabled = falseで回転なし移動
loopプロパティの制御 パスの終端でループするか片道移動か loop = falseで、終端到達後は停止
負の速度による逆走行 同じパスを往復移動させる speed = -patrol_speedで逆方向に移動

応用例:敵が往復移動する(ループなし)

extends PathFollow3D

@export var speed = 1.0
var direction = 1.0  # 1 or -1
var is_at_end = false

func _ready():
	loop = false  # ループを無効化

func _physics_process(delta):
	progress_ratio += speed * direction * delta

	# 終端または開始点に到達したら反転
	if progress_ratio >= 1.0:
		progress_ratio = 1.0
		direction = -1.0
		is_at_end = true
	elif progress_ratio <= 0.0:
		progress_ratio = 0.0
		direction = 1.0
		is_at_end = false




PathFollow3Dの回転モード比較
異なる回転モード(NONE, Y_ONLY, XY, XYZ, ORIENTED)による向きの違い

まとめ

PathFollow3Dは「Path3D上の任意の位置に自ノードを配置し、パスに沿った動きを実現する」専用ノードです。progress や progress_ratio を操作するだけで、複雑な計算なしに滑らかな曲線運動を実現できます。

  • シンプルな制御:progress_ratioを増加させるだけで、パスに沿った移動が自動化される
  • 柔軟な回転モード:ROTATION_Y(キャラクター)からROTATION_ORIENTED(ローラーコースター)まで、用途に応じて選択
  • Tween との相性抜群:progress_ratio をアニメーションさせることで、カットシーンや演出シーンを簡単に実装

次回は、動的な経路探索に対応した「NavigationAgent3D」を解説します。




PathFollow3Dを使ったカットシーン
PathFollow3Dでカメラを制御したカットシーン。パスに沿った滑らかなカメラ動きを実現

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

001〜040:各種ノード | 041~070:個別ノード解説

  • 041: CanvasLayer
  • 042: ParallaxLayer
  • 043: Parallax2D
  • 044: Control
  • 045: PanelContainer
  • 046: TabContainer
  • 047: MarginContainer
  • 048: AnimationPlayer
  • 049: AnimationTree
  • 050: Tween
  • 051: CPUParticles2D
  • 052: GPUParticles2D
  • 053: Sprite2D
  • 054: CharacterBody2D
  • 055: RigidBody2D
  • 056: StaticBody2D
  • 057: Area2D
  • 058: AudioStreamPlayer
  • 059: AudioStreamPlayer2D
  • 060: AudioStreamPlayer3D
  • 061: MultiMeshInstance3D
  • 062: MeshInstance3D
  • 063: CSGBox3D
  • 064: CSGMesh3D
  • 065: OmniLight3D
  • 066: GridMap
  • 067: Path3D
  • 068: PathFollow3D
  • 069: NavigationAgent3D
  • 070: Skeleton3D

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

コメント