GPUParticles2D
2026/4/14大约 5 分钟
最后同步日期:2026-04-15 | Godot 官方原文 — GPUParticles2D
GPUParticles2D
节点继承关系
继承链:Node → CanvasItem → Node2D → GPUParticles2D
继承自 Node2D
| 类型 | 名称 | 说明 |
|---|---|---|
| 属性 | Position | 本地位置(相对于父节点) |
| 属性 | GlobalPosition | 全局位置 |
| 属性 | Rotation | 旋转角度(弧度) |
| 属性 | Scale | 缩放比例 |
| 属性 | Skew | 倾斜角度(弧度) |
| 方法 | Rotate() | 旋转指定弧度 |
| 方法 | ToGlobal() | 本地坐标转全局坐标 |
| 方法 | ToLocal() | 全局坐标转本地坐标 |
继承自 CanvasItem
| 类型 | 名称 | 说明 |
|---|---|---|
| 属性 | Visible | 是否可见 |
| 属性 | Modulate | 整体颜色叠加(乘法) |
| 属性 | SelfModulate | 自身颜色叠加(不影响子节点) |
| 属性 | ZIndex | 绘制层级(Z 轴排序) |
| 信号 | visibility_changed | 可见性变化时触发 |
| 方法 | GetGlobalMousePosition() | 获取鼠标全局坐标 |
继承自 Node
| 类型 | 名称 | 说明 |
|---|---|---|
| 属性 | Name | 节点名称 |
| 属性 | ProcessMode | 处理模式(始终 / 暂停时 / 仅编辑器) |
| 属性 | ProcessPriority | 处理优先级,数字越小越先执行 |
| 信号 | ready | 节点进入场景树并准备就绪 |
| 信号 | tree_entered | 节点进入场景树 |
| 信号 | tree_exited | 节点完全离开场景树 |
| 方法 | GetNode<T>() | 按路径获取子节点 |
| 方法 | AddChild() | 添加子节点 |
| 方法 | RemoveChild() | 移除子节点 |
| 方法 | QueueFree() | 帧结束后释放节点 |
| 方法 | GetParent() | 获取父节点 |
定义
运行在显卡(GPU)上的 2D 粒子系统(Particle System)——能同时管理成千上万个微小元素,模拟火焰、烟雾、雨雪、爆炸等各种视觉特效。
打个比方:想象你在舞台上放飞了上千只发光的萤火虫,每只萤火虫按照你设定好的规则飞行、变色、消失。GPUParticles2D 就是那个"放萤火虫的人",而且因为是在显卡上计算,所以即使放飞一万只也不会卡。
使用频率:★★★★ 常用——2D 游戏中最常用的特效节点。
节点用途
- 火焰、爆炸效果
- 烟雾、蒸汽效果
- 雨滴、雪花、落叶
- 魔法光效、技能特效
- 血液飞溅、碎片飞散
- 背景装饰(飘浮的光点、尘埃)
使用场景
典型场景
- 角色攻击特效:挥剑时产生剑气粒子,施放魔法时产生魔法粒子
- 环境特效:下雨、下雪、飘落的树叶
- 交互反馈:角色脚下的尘土、击中敌人时的火花
- UI 特效:按钮点击时的光效扩散
不适用场景
- 需要逐粒子精确控制每个粒子的位置 → 使用 CPUParticles2D
- 3D 游戏中的粒子效果 → 使用 GPUParticles3D
常用节点搭配
| 搭配节点 | 用途 | 必需? |
|---|---|---|
| ParticleProcessMaterial | 控制粒子的运动方式(方向、速度、重力等) | 必需 |
| Texture2D(贴图资源) | 粒子的外观图片 | 推荐 |
典型节点树:
FireEffect (GPUParticles2D)
└── (通过属性配置 ProcessMaterial 和 Texture)生效必备素材/资源
| 资源 | 类型 | 说明 |
|---|---|---|
| ParticleProcessMaterial | ShaderMaterial | 赋给 process_material 属性,决定粒子如何运动、变色、缩放 |
| 粒子贴图 | Texture2D | 赋给 texture 属性,决定每个粒子长什么样(圆形光点、火焰图等) |
节点属性与信号
粒子基础设置
| 属性 | 类型 | 默认值 | 继承自 | 说明 |
|---|---|---|---|---|
amount | int | — | — | 粒子数量。决定了同时存在多少个粒子,越多越密集但越耗性能 |
process_material | ParticleProcessMaterial | — | — | 粒子运动材质,控制粒子的方向、速度、重力、颜色变化等 |
texture | Texture2D | — | — | 粒子贴图,每个粒子显示的图片 |
生命周期
| 属性 | 类型 | 默认值 | 继承自 | 说明 |
|---|---|---|---|---|
lifetime | float | — | — | 每个粒子从出生到消失的时间(秒) |
one_shot | bool | false | — | 是否只播放一次。true = 播完一轮就停,false = 无限循环 |
explosiveness | float | 0.0 | — | 爆炸性。0 = 粒子均匀分布在整个生命周期内,1 = 所有粒子在第一帧同时出生 |
randomness | float | 0.0 | — | 随机性。0 = 所有粒子行为一致,1 = 每个粒子的生命周期和运动都有很大随机差异 |
信号
| 信号 | 触发时机 | 继承自 | 说明 |
|---|---|---|---|
finished | 粒子系统播放完毕 | — | 仅在 one_shot = true 时触发 |
常用方法
| 方法 | 返回值 | 说明 |
|---|---|---|
Emit(count) | void | 手动发射指定数量的粒子 |
Restart() | void | 重启粒子系统 |
GetAmount() | int | 获取粒子数量 |
GetLifetime() | float | 获取粒子生命周期 |
SetEmitting(enabled) | void | 设置是否正在发射粒子 |
代码示例
C
using Godot;
/// <summary>
/// 创建火焰粒子效果
/// 节点结构:GPUParticles2D(通过属性配置 ProcessMaterial 和 Texture)
/// </summary>
public partial class FireEffect : GPUParticles2D
{
public override void _Ready()
{
// 设置粒子数量
Amount = 50;
// 设置每个粒子存活时间(秒)
Lifetime = 1.5f;
// 创建粒子运动材质
var processMat = new ParticleProcessMaterial();
// 设置粒子发射方向(向上,Y 轴负方向)
processMat.Direction = new Vector3(0, -1, 0);
// 设置粒子扩散角度(越小越集中,越大越分散)
processMat.Spread = 15f;
// 设置重力(粒子会向上飞然后被重力拉下来,形成火焰效果)
processMat.Gravity = new Vector3(0, -50, 0);
// 设置粒子初始速度
processMat.InitialVelocityMin = 20f;
processMat.InitialVelocityMax = 40f;
// 应用材质
ProcessMaterial = processMat;
// 开始发射
Emitting = true;
}
}GDScript
## 创建火焰粒子效果
## 节点结构:GPUParticles2D(通过属性配置 ProcessMaterial 和 Texture)
extends GPUParticles2D
func _ready():
# 设置粒子数量
amount = 50
# 设置每个粒子存活时间(秒)
lifetime = 1.5
# 创建粒子运动材质
var process_mat = ParticleProcessMaterial.new()
# 设置粒子发射方向(向上,Y 轴负方向)
process_mat.direction = Vector3(0, -1, 0)
# 设置粒子扩散角度(越小越集中,越大越分散)
process_mat.spread = 15.0
# 设置重力(粒子会向上飞然后被重力拉下来,形成火焰效果)
process_mat.gravity = Vector3(0, -50, 0)
# 设置粒子初始速度
process_mat.initial_velocity_min = 20.0
process_mat.initial_velocity_max = 40.0
# 应用材质
process_material = process_mat
# 开始发射
emitting = true使用建议
- 粒子数量不是越多越好。通常 50~200 个就能产生不错的效果,移动端建议控制在 100 以内
explosiveness设为 1 可以做爆炸效果(所有粒子同时出现)- 配合
ColorRamp(颜色渐变)可以让粒子从亮到暗,模拟火焰从白到红到黑 - 配合
ScaleRamp(缩放渐变)可以让粒子从大到小,模拟烟雾消散
