引言
粒子系统是游戏特效的「主力军」——爆炸、火花、烟雾、雨雪、魔法轨迹都是粒子的天下。本文把 Defold 粒子系统讲透:先讲 ParticleFX 组件与发射器(emitter)的结构,再讲粒子生命周期(发射/存活/消亡)与三种发射器类型,接着拆解关键参数(发射速率/寿命/速度/重力/颜色渐变/尺寸缩放/旋转),然后是「曲线与随机分布」让粒子自然、材质与贴图的选择、运行时动态控制(一次性爆炸 vs 持续喷射 vs 跟随发射器),最后是粒子系统的 Draw Call 与性能优化,让你用粒子做出不卡顿的华丽特效。
前置:/defold-script-system-lua/(消息与生命周期)、/defold-sprite-animation/(贴图与动画)、/defold-performance-optimization/(Draw Call 与性能)。图形基础见 图形学专题。
目录
- 1. 粒子系统是什么:海量小精灵的编排
- 2. ParticleFX 组件与发射器结构
- 3. 粒子生命周期与发射器类型
- 4. 关键参数:速率寿命速度重力
- 5. 颜色尺寸旋转:曲线与渐变
- 6. 随机分布与自然感
- 7. 材质与贴图
- 8. 运行时动态控制
- 9. 性能优化:Draw Call 与上限
- 10. 速查表
- 延伸阅读
1. 粒子系统是什么:海量小精灵的编排
粒子 = 大量「小而自治的精灵」,每个粒子有自己的生命周期与运动:
一个粒子 = {位置, 速度, 尺寸, 颜色, 旋转, 存活时长}
粒子系统 = 批量管理成百上千个粒子:
发射 → 更新(移动/变色/缩放)→ 消亡
为什么不用普通精灵做特效:
- 普通精灵:每个一个对象 → 对象开销大、Draw Call 爆炸
- 粒子:批量提交 + 共享材质 → 一个 Draw Call 画几百个
- 粒子生命周期自动回收 → 无对象管理负担
粒子的典型应用:
爆炸/火花 一次性喷射 + 重力 + 衰减
烟雾/火焰 持续喷射 + 上升 + 透明度渐变
雨雪/落叶 大面积持续 + 随机分布 + 循环
魔法轨迹 跟随发射器 + 颜色渐变 + 发光
命中反馈 短促喷射 + 速度衰减 + 快速消亡
心智:粒子 = 批量自治的小精灵——共享材质、批量提交、自动回收,一个 Draw Call 撑起整片特效。
2. ParticleFX 组件与发射器结构
Defold 的粒子组件 = ParticleFX,由「发射器(emitter)」组成:
ParticleFX 组件
└── emitter_1(发射器 A:烟雾)
└── emitter_2(发射器 B:火花)
└── emitter_3(发射器 C:冲击波环)
每个发射器独立控制:
发射速率 / 寿命 / 速度 / 颜色 / 尺寸 / 曲线
→ 一个爆炸 = 多个发射器叠加(火球 + 烟雾 + 碎片)
创建与播放:
-- 通过工厂创建带 ParticleFX 的对象
local fx = factory.create("main/explosion_fx", go.get_position())
-- 播放粒子(发到 particlefx 组件的 play 消息)
msg.post(fx .. "#particlefx", "play")
-- 停止 / 立即停止
msg.post(fx .. "#particlefx", "stop")
msg.post(fx .. "#particlefx", "stop_immediately")
发射器编辑器参数(game.project 关联的 .particlefx 文件):
emitter 的关键分区:
- emission(发射):速率、数量、寿命
- motion(运动):速度、重力、方向
- appearance(外观):贴图、颜色、尺寸、旋转
- curve(曲线):参数随时间的插值表
心智:ParticleFX = 多个发射器的组合——一个特效拆成「烟雾+火花+冲击波」多个 emitter 叠加,play/stop 消息控制播放。
3. 粒子生命周期与发射器类型
粒子的一生:
发射(spawn)→ 存活(update 每帧更新)→ 消亡(kill/回收)
update 更新内容:
位置 += 速度 × dt
速度 += 重力 × dt
尺寸/颜色/旋转 ← 按曲线取当前进度值
寿命耗尽 → 消亡
三种发射器类型:
① 持续发射(loop):
持续按速率发射 → 火、烟、雨、尾迹
play 开始、stop 停止、已发射粒子自然消亡
② 一次性爆发(burst):
一次性发射全部粒子 → 爆炸、火花、命中
播放一次自然结束
③ 跟随式(trail / follow):
发射器跟随目标位置持续发射 → 拖尾、轨迹
结合「发射器速度」做出飘散效果
粒子数上限:
- Defold 每个发射器有 max_count(编辑器设置)
- 超出 → 丢弃新发射(或复用最老的粒子)
- 上限设置 = 特效质量 vs 性能的权衡
心智:粒子 = 发射→更新→消亡 的循环;发射器分持续/爆发/跟随三类——火与雨用持续、爆炸用爆发、拖尾用跟随,max_count 是质量与性能的旋钮。
4. 关键参数:速率寿命速度重力
五个「决定特效性格」的参数:
发射速率(emission_rate):
每秒粒子数 → 烟雾密集度、火花量
爆发类型无视速率(一次性全发)
寿命(lifetime):
单个粒子存活秒数 → 爆炸粒子短(0.5~1s)、烟雾长(2~4s)
寿命越长 → 同时存活粒子越多 → 越吃性能
速度(initial speed):
初始速度大小 → 爆炸猛(高)vs 轻雾(低)
结合方向与散开角
重力(gravity):
每帧加速 → 火花下落、烟雾上飘(负重力)
重力方向可自定义(模拟风)
发散角(spread / cone):
粒子喷射的角度范围 → 定向(窄角)vs 喷射(宽角)
-- 运行时改参数(按需)
local fx = msg.url("explosion_fx")
-- 例:加大发射速率做「加料特效」
go.set(fx, "emission_rate", 200)
「参数组合」成就特效类型:
爆炸火花:高速 + 短命 + 大散角 + 重力向下
烟雾: 低速 + 长命 + 缓慢上升 + 透明渐变
雨: 高速向下 + 长命 + 大范围 + 循环
魔法拖尾:中速 + 跟随发射器 + 颜色渐变 + 发光
心智:速率/寿命/速度/重力/发散角五个参数决定了特效的「性格」——爆炸要高速短命、烟雾要低速长命,组合即特效类型。
5. 颜色尺寸旋转:曲线与渐变
粒子不是「一张静态贴图」——它的外观随时间变化,靠「曲线」驱动:
曲线(curve)= 参数值随时间进度(0~1)的插值表
颜色曲线:
t=0 亮黄 → t=0.3 橙红 → t=0.7 深红 → t=1 透明
→ 爆炸从亮到暗、从实到虚的过渡
尺寸曲线:
t=0 小 → t=0.2 峰值 → t=1 收缩
→ 命中反馈「炸开再回缩」的冲击感
旋转:
粒子贴图旋转(自旋速度 + 方向)
→ 碎片翻转、烟雾打转
曲线编辑的意义:
- 曲线比「一个固定值」表达力强得多
- 同一 emitter 用曲线做出「动态演化」而非「静态图」
- 关键帧越多 → 越精细,但预览调参成本也越高
颜色渐变与混合模式:
- 粒子贴图 + tint 颜色 → 同一贴图多种色彩
- 混合模式:加色(发光/火焰)vs 正常(烟雾/实体)
- 加色混合让粒子「叠加变亮」→ 火焰与魔法好看
心智:粒子外观靠「曲线」随时间演化——颜色/尺寸/旋转各一条曲线,同一贴图用 tint + 混合模式变化出千种特效。
6. 随机分布与自然感
粒子的「自然感」来自随机——完全一致的粒子是「塑料特效」:
需要随机的参数:
初始速度大小(±范围)→ 爆炸大小不一
发射方向(±角度)→ 喷射更自然
寿命(±范围)→ 消亡不齐,层次感
起始旋转(0~360°)→ 碎片朝向各异
Defold 的随机参数:
每个「数值参数」可配 min/max 区间:
speed_min / speed_max
lifetime_min / lifetime_max
emission 可设随机偏移
→ 取值在 [min, max] 均匀随机
分布方式的选择:
- 均匀分布:默认,简单自然
- 曲线加权:某些值更集中(速度偏大/偏小)
- 实时随机 vs 预先生成:大批量用「预设种子」可复现
随机的美学:
- 随机范围要「克制」:太随机 = 凌乱,太一致 = 呆板
- 速度与寿命的随机最能「去塑料感」
- 需要「每一次都好看」→ 用可控种子 + 调试
心智:自然感 = 关键参数 min/max 随机——速度/方向/寿命/旋转都加 ± 范围,克制的随机让粒子「活」起来。
7. 材质与贴图
粒子用什么「画」——材质与贴图决定视觉风格:
贴图选择:
- 圆点 / 方形:基础烟雾与火花
- 星形 / 条纹:魔法与激光
- 序列帧动画贴图:爆炸帧动画(罕见,粒子多数单图)
- 灰度 + tint:最灵活(一张灰贴图染任何颜色)
材质要点:
- 混合模式:加色(发光)vs alpha(烟雾)
- 深度测试:粒子是否被场景遮挡
- 粒子材质的 uniform:可传颜色/时间做程序化效果
粒子 vs 贴图分辨率:
- 粒子贴图分辨率不宜过高(每粒子都采样)
- 半透明贴图要注意「排序」:半透明粒子间的绘制顺序
- 纹理图集 vs 单图:图集减少切换,但粒子里少见
发光粒子(Additive):
-- 加色混合粒子:火焰/能量/魔法
-- 材质用 additive 混合 → 粒子叠加变亮
让粒子更自然的材质技巧:
- 软边缘贴图(柔边圆)→ 避免粒子「方块感」
- 火焰用加色 + 中心亮边缘虚
- 烟雾用 alpha + 大图 + 慢速膨胀
心智:粒子视觉 = 贴图 + 材质混合模式——灰度贴图 + tint 最灵活,加色混合做发光/火焰、alpha 做烟雾,软边贴图去方块感。
8. 运行时动态控制
**粒子在运行时的「动态控制」**让特效响应游戏事件:
三种播放模式:
-- 一次性爆炸(播完自动销毁)
local fx = factory.create("main/explosion_fx", pos)
msg.post(fx .. "#particlefx", "play")
-- 持续喷射(play 开始、stop 结束)
local fire = factory.create("main/fire_fx", pos)
msg.post(fire .. "#particlefx", "play")
-- ...一段时间后
msg.post(fire .. "#particlefx", "stop")
-- 跟随目标(粒子随对象移动)
go.set_parent(fire, target_go) -- 发射器挂在目标下
动态改参数(运行时):
-- 根据命中强度/速度调整特效
go.set(fx .. "#particlefx", "emission_rate", damage * 5)
go.set(fx .. "#particlefx", "initial_speed", impact_speed)
特效的「对象池」:
- 高频特效(命中/射击)→ 工厂创建频繁 → 用对象池复用
- 对象池:预创建 N 个,播放时取、结束隐藏回池
- 避免频繁 factory.create/destroy(卡顿来源)
粒子与时间的交互:
- 暂停游戏时粒子也停(把更新挂到游戏时钟)
- 快放/慢放特效(dt 倍率)
- 结束时「淡出」而非「硬停」(stop 后已发射粒子自然消亡)
心智:运行时控制 = 播放/停止消息 + 动态参数 + 对象池复用——爆炸用一次性、火用持续、尾迹挂目标;高频特效必须对象池,暂停/慢放把更新挂游戏时钟。
9. 性能优化:Draw Call 与上限
粒子是特效主力,也是最容易拖垮帧率的系统——优化要点:
① 粒子数上限:
同时存活粒子数 = 速率 × 寿命
500~2000 是移动端合理区间,超出降速率/寿命
低端机要「分级特效」(低配降粒子数)
② Draw Call:
同材质同贴图的粒子可合并渲染 → 控制材质/贴图种类
不同 blend 模式的粒子分属不同 Draw Call
→ 尽量 1~2 种粒子材质
③ 发射器数量:
场景里同时活跃的 ParticleFX 组件数要控制
看不到的特效(离屏)→ 停掉或裁剪
④ 大贴图 / 高精度:
粒子贴图不宜过大(每粒子采样的开销)
RGB 通道数够用即可
性能清单:
- 场景粒子总预算:帧耗稳定(如 3ms 以内)
- 离屏发射器自动暂停(视口外裁剪)
- 移动端「特效质量分级」:低配减少粒子数/关闭特效
- Profiler 观察:粒子消耗 → 调整速率/寿命/材质数
// 分级特效(示例逻辑)
local QUALITY = sys.get_config("quality") -- low / high
local RATE_MULT = (QUALITY == "low") and 0.4 or 1.0
go.set(fx .. "#particlefx", "emission_rate", base_rate * RATE_MULT)
心智:粒子性能 = 同时存活数(速率×寿命)× Draw Call(材质种类)× 活跃发射器数——预算上限 + 分级特效 + 离屏裁剪 + Profiler 校准,四管齐下。
10. 速查表
全篇速查:
| 主题 | 结论 |
|---|---|
| 本质 | 批量自治小精灵、共享材质 |
| 结构 | ParticleFX 多发射器叠加 |
| 类型 | 持续 / 爆发 / 跟随 |
| 参数 | 速率/寿命/速度/重力/发散角 |
| 外观 | 颜色/尺寸/旋转曲线演化 |
| 随机 | min/max 区间去塑料感 |
| 材质 | 灰度贴图 + tint、加色 vs alpha |
| 控制 | play/stop 消息 + 动态参数 + 池 |
| 性能 | 存活数×Draw Call×活跃发射器 |
| 质量 | 分级特效 + 离屏裁剪 + Profiler |
一句话记忆:粒子 = 批量自治小精灵,ParticleFX 用多个发射器叠加出爆炸/烟雾/火花;持续、爆发、跟随三类发射器,速率×寿命决定存活粒子数;外观靠颜色/尺寸/旋转曲线随时间演化,min/max 随机去掉塑料感,灰度贴图 + tint + 加色/alpha 混合出千种风格;运行时 play/stop + 动态参数 + 对象池;性能四管齐下——存活数上限、材质种类控 Draw Call、离屏裁剪、分级特效——让华丽特效不卡帧率。
延伸阅读
- /defold-script-system-lua/ — 组件消息与生命周期
- /defold-sprite-animation/ — 贴图、图集与动画基础
- /defold-performance-optimization/ — Draw Call 与性能调优
- /defold-shader-postprocessing/ — 粒子材质的着色器定制
- 游戏开发专题 — 特效与粒子系统的通用实践
- 图形学专题 — 粒子渲染与混合模式
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。