はじめに
前回解説したPath3Dでベジェ曲線のパスを定義しました。しかし、パスを作るだけでは何も動きません。「敵がこのパスに沿って移動したい」「カメラが曲線を描いて動きたい」という時に使うのが、今回のPathFollow3Dです。
PathFollow3Dを使うと、Path3Dの子ノードとして配置された任意のノード(3Dメッシュ、キャラクター、カメラなど)を、パスに沿った位置に自動配置できます。単なる移動だけでなく、パスの方向に合わせた回転も可能です。
PathFollow3Dとは?
PathFollow3Dは、親のPath3Dが持つパス上の「指定された位置(0〜1の割合、またはメートル)」に、自ノードを配置するノードです。進捗値を変更するだけで、パスに沿った移動を実現します。
継承ツリー:
PathFollow3D → Node3D → Node → Object
重要な点として、PathFollow3DはPath3Dの「子ノード」として配置されます。親のPath3DのCurve3Dを参照し、progressやprogress_ratioプロパティを操作することでパス上の位置を制御します。
PathFollow3Dの主な特徴は以下の通りです。
- パス追従が自動:progressを変更するだけで、位置・回転が自動で更新される
- 2つの進捗制御方式:絶対距離(progress:メートル)と相対比率(progress_ratio:0.0~1.0)
- 回転モード選択:YON_ONLY(Y軸回転のみ)から ORIENTED(フル3D回転)まで、複数の回転モードを用意
- ループ対応:パスの終端に達したら自動でループするオプション

このノードを使うべき場面
使う場面:
- 巡回敵:決まったルートを往復・ループする敵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は「Path3D上の任意の位置に自ノードを配置し、パスに沿った動きを実現する」専用ノードです。progress や progress_ratio を操作するだけで、複雑な計算なしに滑らかな曲線運動を実現できます。
- シンプルな制御:progress_ratioを増加させるだけで、パスに沿った移動が自動化される
- 柔軟な回転モード:ROTATION_Y(キャラクター)からROTATION_ORIENTED(ローラーコースター)まで、用途に応じて選択
- Tween との相性抜群:progress_ratio をアニメーションさせることで、カットシーンや演出シーンを簡単に実装
次回は、動的な経路探索に対応した「NavigationAgent3D」を解説します。

シリーズ: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をもとに執筆しています。


コメント