跳转到内容

粒子系统

Estella 提供基于 GPU 实例化渲染的 2D 粒子系统,使用 C++ 后端模拟。ParticlePlugin 由引擎默认包含。

ParticleEmitter 组件

在带有 Transform 的实体上添加 ParticleEmitter 即可从该位置发射粒子。

通用

属性类型默认值说明
enabledbooleantrue组件激活
playOnStartbooleantrue实体加载时自动播放
loopingbooleantrue持续时间结束后重新开始
durationnumber5发射持续时间(秒)

发射

属性类型默认值说明
ratenumber10每秒发射粒子数
burstCountnumber0每次爆发发射粒子数(0 = 禁用)
burstIntervalnumber1爆发间隔(秒)
maxParticlesnumber1000最大存活粒子数

生命周期

属性类型默认值说明
lifetimeMinnumber5最小粒子寿命(秒)
lifetimeMaxnumber5最大粒子寿命(秒)

形状

属性类型默认值说明
shapenumber3发射形状(见下方)
shapeRadiusnumber100圆形和锥形的半径
shapeSizeVec2{100, 100}矩形的宽高
shapeAnglenumber25锥形的半角(度,0–360)

发射形状:

形状说明
0从单个点发射
1圆形从圆形区域内随机位置发射
2矩形从矩形区域内随机位置发射
3锥形从发射器原点以锥形方向发射

速度

属性类型默认值说明
speedMinnumber500最小初始速度
speedMaxnumber500最大初始速度
angleSpreadMinnumber0最小发射角度(度,0–360)
angleSpreadMaxnumber360最大发射角度(度,0–360)

大小随生命变化

属性类型默认值说明
startSizeMinnumber100出生时最小尺寸
startSizeMaxnumber100出生时最大尺寸
endSizeMinnumber100消亡时最小尺寸
endSizeMaxnumber100消亡时最大尺寸
sizeEasingnumber0插值曲线(0=Linear, 1=EaseIn, 2=EaseOut, 3=EaseInOut)

颜色随生命变化

属性类型默认值说明
startColorColor{1,1,1,1}出生时颜色(RGBA)
endColorColor{1,1,1,0}消亡时颜色(RGBA,默认淡出)
colorEasingnumber0插值曲线(0=Linear, 1=EaseIn, 2=EaseOut, 3=EaseInOut)

旋转

属性类型默认值说明
rotationMinnumber0最小初始旋转角度(度)
rotationMaxnumber0最大初始旋转角度(度)
angularVelocityMinnumber0最小旋转速度(度/秒)
angularVelocityMaxnumber0最大旋转速度(度/秒)

作用力

属性类型默认值说明
gravityVec2{0, 0}每帧施加的重力
dampingnumber0速度阻尼系数(摩擦)

纹理与精灵表

属性类型默认值说明
textureTextureHandle粒子纹理
spriteColumnsnumber1精灵表列数
spriteRowsnumber1精灵表行数
spriteFPSnumber10精灵表动画帧率
spriteLoopbooleantrue循环播放精灵表动画

渲染

属性类型默认值说明
blendModenumber10 = 正常, 1 = 叠加(默认)
layernumber0渲染层级(-1000 到 1000)
materialnumber0自定义材质 ID(0 = 默认)
simulationSpacenumber00 = 世界空间, 1 = 本地空间

运行时 API

使用静态 Particle 对象从代码控制发射器:

import { Particle } from 'esengine';
// 开始发射
Particle.play(entity);
// 停止发射(已存在的粒子继续其生命周期)
Particle.stop(entity);
// 重置发射器状态并清除所有存活粒子
Particle.reset(entity);
// 查询存活粒子数
const count = Particle.getAliveCount(entity);

控制发射器属性

在系统中查询和修改 ParticleEmitter

import { defineSystem, addSystem, Query, Mut, ParticleEmitter } from 'esengine';
addSystem(defineSystem(
[Query(Mut(ParticleEmitter))],
(query) => {
for (const [entity, emitter] of query) {
emitter.rate = 50;
emitter.startColor = { r: 1, g: 0.5, b: 0, a: 1 };
emitter.endColor = { r: 1, g: 0, b: 0, a: 0 };
emitter.gravity = { x: 0, y: -500 };
}
}
));

自定义材质

为粒子指定自定义材质以实现特殊渲染效果:

emitter.material = myMaterialHandle;

粒子渲染器会对指定材质调用 getMaterialDataWithUniforms,因此你定义的任何 Shader Uniform 都会按发射器生效。

UIMask 兼容

粒子遵守 UIMask 的裁剪区域。在可滚动 UI 面板中使用粒子:

  1. 在面板实体上添加 UIMask 组件(Scissor 模式)
  2. ParticleEmitter 实体作为遮罩容器的子实体
  3. 粒子将被裁剪到遮罩区域内

编辑器集成

  • 检查器 — 属性按可折叠分组展示(发射、生命周期、形状、速度、大小、颜色、旋转、作用力、纹理、渲染),数值输入带约束
  • Scene View 叠加层 — 选中 ParticleEmitter 实体时,Scene View 会绘制发射形状的 Gizmo:
    • :十字标记
    • 圆形:虚线圆轮廓
    • 矩形:虚线矩形轮廓
    • 锥形:扇形展示发射角度范围
  • Hierarchy — 右键 → 创建 → Particle 可添加新的粒子实体

枚举常量

使用命名常量提高可读性:

import { EmitterShape, SimulationSpace, ParticleEasing } from 'esengine';
emitter.shape = EmitterShape.Circle;
emitter.simulationSpace = SimulationSpace.Local;
emitter.sizeEasing = ParticleEasing.EaseOut;
emitter.colorEasing = ParticleEasing.EaseInOut;
枚举
EmitterShapePoint (0), Circle (1), Rectangle (2), Cone (3)
SimulationSpaceWorld (0), Local (1)
ParticleEasingLinear (0), EaseIn (1), EaseOut (2), EaseInOut (3)

示例:火焰效果

import {
defineSystem, addStartupSystem, Commands, Transform,
ParticleEmitter, EmitterShape, ParticleEasing
} from 'esengine';
addStartupSystem(defineSystem(
[Commands()],
(commands) => {
commands.spawn()
.insert(Transform, { position: { x: 400, y: 300, z: 0 } })
.insert(ParticleEmitter, {
rate: 30,
lifetimeMin: 0.5,
lifetimeMax: 1.5,
shape: EmitterShape.Circle,
shapeRadius: 20,
speedMin: 100,
speedMax: 200,
angleSpreadMin: 250,
angleSpreadMax: 290,
startSizeMin: 40,
startSizeMax: 60,
endSizeMin: 5,
endSizeMax: 10,
sizeEasing: ParticleEasing.EaseIn,
startColor: { r: 1, g: 0.8, b: 0.2, a: 1 },
endColor: { r: 1, g: 0.2, b: 0, a: 0 },
colorEasing: ParticleEasing.EaseOut,
gravity: { x: 0, y: -50 },
blendMode: 1,
});
}
));