最后同步日期:2026-04-15 | Godot 官方原文 — CPUParticles2D
继承链:Node → CanvasItem → Node2D → CPUParticles2D
| 类型 | 名称 | 说明 |
|---|
| 属性 | Position | 本地位置(相对于父节点) |
| 属性 | GlobalPosition | 全局位置 |
| 属性 | Rotation | 旋转角度(弧度) |
| 属性 | Scale | 缩放比例 |
| 属性 | Skew | 倾斜角度(弧度) |
| 方法 | Rotate() | 旋转指定弧度 |
| 方法 | ToGlobal() | 本地坐标转全局坐标 |
| 方法 | ToLocal() | 全局坐标转本地坐标 |
| 类型 | 名称 | 说明 |
|---|
| 属性 | Visible | 是否可见 |
| 属性 | Modulate | 整体颜色叠加(乘法) |
| 属性 | SelfModulate | 自身颜色叠加(不影响子节点) |
| 属性 | ZIndex | 绘制层级(Z 轴排序) |
| 信号 | visibility_changed | 可见性变化时触发 |
| 方法 | GetGlobalMousePosition() | 获取鼠标全局坐标 |
| 类型 | 名称 | 说明 |
|---|
| 属性 | Name | 节点名称 |
| 属性 | ProcessMode | 处理模式(始终 / 暂停时 / 仅编辑器) |
| 属性 | ProcessPriority | 处理优先级,数字越小越先执行 |
| 信号 | ready | 节点进入场景树并准备就绪 |
| 信号 | tree_entered | 节点进入场景树 |
| 信号 | tree_exited | 节点完全离开场景树 |
| 方法 | GetNode<T>() | 按路径获取子节点 |
| 方法 | AddChild() | 添加子节点 |
| 方法 | RemoveChild() | 移除子节点 |
| 方法 | QueueFree() | 帧结束后释放节点 |
| 方法 | GetParent() | 获取父节点 |
运行在处理器(CPU)上的 2D 粒子系统(Particle System)——和 GPUParticles2D 功能类似,但粒子的位置和状态由 CPU 逐个计算,因此你能直接读取和修改每个粒子的数据。
打个比方:GPUParticles2D 就像放出一群信鸽后不管了(它们按预设路线飞),CPUParticles2D 就像你手里牵着每一只风筝的线,想怎么拽就怎么拽。
使用频率:★★ 偶尔使用——大多数情况优先使用 GPUParticles2D,只有需要逐粒子控制时才用这个。
- 需要精确控制每个粒子位置的场景
- 粒子数量较少但需要逐个交互的情况
- 目标设备显卡性能较弱时的备选方案
- 需要通过代码实时查询粒子状态(如粒子当前位置)
- 自定义物理交互:粒子需要和游戏逻辑深度结合(如粒子碰到敌人造成伤害)
- 少量精确粒子:只需十几个粒子但需要精确控制每个
- 调试和原型开发:开发阶段快速测试粒子效果
| 搭配节点 | 用途 | 必需? |
|---|
| Texture2D(贴图资源) | 粒子外观图片 | 推荐 |
典型节点树:
CustomParticles (CPUParticles2D)
└── (通过属性配置参数)
| 资源 | 类型 | 说明 |
|---|
| 粒子贴图 | Texture2D | 赋给 texture 属性,决定粒子外观 |
| 属性 | 类型 | 默认值 | 继承自 | 说明 |
|---|
amount | int | — | — | 粒子数量。CPU 粒子建议控制在 100 以内 |
texture | Texture2D | — | — | 粒子贴图 |
lifetime | float | — | — | 每个粒子存活时间(秒) |
one_shot | bool | false | — | 是否只播放一次 |
explosiveness | float | 0.0 | — | 爆炸性 |
randomness | float | 0.0 | — | 随机性 |
| 属性 | 类型 | 默认值 | 继承自 | 说明 |
|---|
direction | Vector2 | (0, 0) | — | 粒子发射方向 |
spread | float | 45.0 | — | 发射角度范围(度) |
gravity | Vector2 | (0, 98) | — | 重力向量 |
initial_velocity_min | float | 0.0 | — | 最小初始速度 |
initial_velocity_max | float | 0.0 | — | 最大初始速度 |
linear_accel_min | float | 0.0 | — | 最小线性加速度 |
linear_accel_max | float | 0.0 | — | 最大线性加速度 |
tangential_accel_min | float | 0.0 | — | 最小切向加速度(让粒子旋转) |
tangential_accel_max | float | 0.0 | — | 最大切向加速度 |
damping_min | float | 0.0 | — | 最小阻尼(让粒子逐渐减速) |
damping_max | float | 0.0 | — | 最大阻尼 |
| 属性 | 类型 | 默认值 | 继承自 | 说明 |
|---|
scale_min | float | 1.0 | — | 粒子最小缩放 |
scale_max | float | 1.0 | — | 粒子最大缩放 |
scale_curve | Curve | — | — | 粒子缩放随生命周期的变化曲线 |
angle_min | float | 0.0 | — | 粒子最小初始旋转角度 |
angle_max | float | 0.0 | — | 粒子最大初始旋转角度 |
angular_velocity_min | float | 0.0 | — | 粒子最小旋转速度 |
angular_velocity_max | float | 0.0 | — | 粒子最大旋转速度 |
| 属性 | 类型 | 默认值 | 继承自 | 说明 |
|---|
color_ramp | Gradient | — | — | 颜色渐变,粒子颜色随生命周期变化 |
color_initial_ramp | Gradient | — | — | 初始颜色随机渐变 |
| 信号 | 触发时机 | 继承自 | 说明 |
|---|
finished | 粒子系统播放完毕 | — | 仅在 one_shot = true 时触发 |
| 方法 | 返回值 | 说明 |
|---|
Emit(count) | void | 手动发射指定数量的粒子 |
Restart() | void | 重启粒子系统 |
GetParticleEmissionTransform(index) | Transform2D | 获取指定粒子的发射变换 |
SetParticleEmissionTransform(index, xform) | void | 设置指定粒子的发射变换 |
GetEmissionPoint(index) | Vector2 | 获取指定粒子的当前位置 |
GetEmissionColor(index) | Color | 获取指定粒点的颜色 |
C
using Godot;
/// <summary>
/// 使用 CPU 粒子创建可交互的魔法光球效果
/// 每帧检测粒子与敌人的距离,近距离造成伤害
/// </summary>
public partial class MagicOrb : CPUParticles2D
{
[Export] public float ExDamage = 10f;
[Export] public float ExDamageRadius = 50f;
public override void _Ready()
{
Amount = 30;
Lifetime = 0.8f;
OneShot = false;
Texture = GD.Load<Texture2D>("res://assets/particles/glow.png");
// 发射方向:向四周扩散
Direction = Vector2.Up;
Spread = 360f;
// 速度设置
InitialVelocityMin = 20f;
InitialVelocityMax = 60f;
// 让粒子减速
DampingMin = 3f;
DampingMax = 5f;
// 粒子从大到小
ScaleMin = 0.2f;
ScaleMax = 0.5f;
// 添加颜色渐变(白 -> 蓝 -> 透明)
var colorRamp = new Gradient();
colorRamp.SetColor(0, new Color(1, 1, 1, 1));
colorRamp.SetColor(0.5, new Color(0.3f, 0.5f, 1, 0.8f));
colorRamp.SetColor(1, new Color(0.1f, 0.2f, 0.5f, 0));
ColorRamp = colorRamp;
}
}
GDScript
## 使用 CPU 粒子创建可交互的魔法光球效果
## 每帧检测粒子与敌人的距离,近距离造成伤害
extends CPUParticles2D
@export var damage: float = 10.0
@export var damage_radius: float = 50.0
func _ready():
amount = 30
lifetime = 0.8
one_shot = false
texture = load("res://assets/particles/glow.png")
# 发射方向:向四周扩散
direction = Vector2.UP
spread = 360.0
# 速度设置
initial_velocity_min = 20.0
initial_velocity_max = 60.0
# 让粒子减速
damping_min = 3.0
damping_max = 5.0
# 粒子从大到小
scale_min = 0.2
scale_max = 0.5
# 添加颜色渐变(白 -> 蓝 -> 透明)
var color_ramp := Gradient.new()
color_ramp.set_color(0, Color(1, 1, 1, 1))
color_ramp.set_color(0.5, Color(0.3, 0.5, 1, 0.8))
color_ramp.set_color(1, Color(0.1, 0.2, 0.5, 0))
color_ramp = color_ramp
GPU 粒子 vs CPU 粒子
- GPUParticles2D:性能更好(上万粒子无压力),但不能逐粒子读取位置
- CPUParticles2D:能读取每个粒子的位置和颜色,但性能较弱(建议百个以内)
- 如果你不确定用哪个,优先选 GPU 粒子,只有明确需要逐粒子控制时才用 CPU 粒子