PathFollow2D
2026/4/14大约 3 分钟
最后同步日期:2026-04-15 | Godot 官方原文 — PathFollow2D
PathFollow2D
节点继承关系
继承自 Node
| 类型 | 名称 | 说明 |
|---|---|---|
| 属性 | Name | 节点名称 |
| 属性 | ProcessMode | 处理模式(始终 / 暂停时 / 仅编辑器) |
| 属性 | ProcessPriority | 处理优先级,数字越小越先执行 |
| 信号 | ready | 节点进入场景树并准备就绪 |
| 信号 | tree_entered | 节点进入场景树 |
| 信号 | tree_exited | 节点完全离开场景树 |
| 方法 | GetNode<T>() | 按路径获取子节点 |
| 方法 | AddChild() | 添加子节点 |
| 方法 | RemoveChild() | 移除子节点 |
| 方法 | QueueFree() | 帧结束后释放节点 |
| 方法 | GetParent() | 获取父节点 |
定义
PathFollow2D 是 Path2D 的"跟屁虫"。它必须作为 Path2D 的子节点存在,会自动沿着父节点的路径移动。你可以控制它走到路径的哪个位置、移动速度、是否循环等。
打个比方:Path2D 是铺好的铁轨,PathFollow2D 就是铁轨上的小火车。你只需要告诉小火车"开到第几公里"(progress),它就会自动跑到铁轨上对应的位置。
简单说:PathFollow2D 让你沿着 Path2D 画的路径移动,不用自己算坐标。
使用频率:★★★ 一般常用
节点用途
- 敌人巡逻:让敌人自动沿着预定路线来回走
- 平台移动:让浮空平台沿着路径移动
- 摄像机动画:让摄像机沿路径平滑移动
- 弹道飞行:让子弹沿曲线飞行
- 车辆移动:让车辆沿道路行驶
使用场景
| 场景 | 说明 |
|---|---|
| 平台游戏 | 敌人沿 PathFollow2D 来回巡逻 |
| 塔防游戏 | 敌人沿 PathFollow2D 行进 |
| 过场动画 | 摄像机沿 PathFollow2D 移动展示场景 |
| 自动移动平台 | 浮空平台沿 PathFollow2D 上下左右移动 |
常用节点搭配
| 搭配节点 | 搭配方式 |
|---|---|
| Path2D | PathFollow2D 必须作为 Path2D 的子节点 |
| 其他 Node2D | 其他节点作为 PathFollow2D 的子节点,一起沿路径移动 |
生效必备素材/资源
PathFollow2D 必须作为 Path2D 的子节点,且父 Path2D 必须设置了 curve 属性。
节点属性与信号
属性
| 属性 | 类型 | 默认值 | 继承自 | 说明 |
|---|---|---|---|---|
| progress | float | 0.0 | PathFollow2D | 当前在路径上的位置(像素距离)。0 = 起点,路径总长 = 终点 |
| progress_ratio | float | 0.0 | PathFollow2D | 当前位置的百分比。0.0 = 起点(0%),1.0 = 终点(100%) |
| h_offset | float | 0.0 | PathFollow2D | 沿路径法线方向的水平偏移 |
| v_offset | float | 0.0 | PathFollow2D | 垂直于路径平面的偏移 |
| rotation_mode | int | 0 | PathFollow2D | 旋转模式:0=不旋转,1=朝向路径切线方向,2=朝向切线但保持上方向 |
| loop | bool | true | PathFollow2D | 是否循环。true = 走到头再从头走,false = 走到头就停 |
| speed | float | 1.0 | PathFollow2D | 移动速度(已废弃,建议在代码中手动控制 progress) |
信号
PathFollow2D 没有自己的特有信号。
常用方法
| 方法/属性 | 说明 |
|---|---|
| progress / progress_ratio | 修改这个值就能控制物体在路径上的位置 |
代码示例
C
// C# - 敌人沿路径巡逻
using Godot;
public partial class PatrolEnemy : CharacterBody2D
{
private PathFollow2D _pathFollow;
private float _speed = 100f; // 每秒移动100像素
private int _direction = 1; // 1=正向,-1=反向
public override void _Ready()
{
_pathFollow = GetParent<PathFollow2D>();
}
public override void _Process(double delta)
{
// 沿路径移动
_pathFollow.Progress += _speed * _direction * (float)delta;
// 到达终点就掉头
if (_pathFollow.ProgressRatio >= 1.0f)
{
_pathFollow.ProgressRatio = 1.0f;
_direction = -1;
}
else if (_pathFollow.ProgressRatio <= 0.0f)
{
_pathFollow.ProgressRatio = 0.0f;
_direction = 1;
}
}
}GDScript
# GDScript - 敌人沿路径巡逻
extends CharacterBody2D
@onready var path_follow: PathFollow2D = get_parent()
var speed: float = 100.0 # 每秒移动100像素
var direction: int = 1 # 1=正向,-1=反向
func _process(delta):
# 沿路径移动
path_follow.progress += speed * direction * delta
# 到达终点就掉头
if path_follow.progress_ratio >= 1.0:
path_follow.progress_ratio = 1.0
direction = -1
elif path_follow.progress_ratio <= 0.0:
path_follow.progress_ratio = 0.0
direction = 1