Unity Particular 粒子系统终极教程
目录
-
第一部分:初识粒子系统
(图片来源网络,侵删)- 什么是粒子系统?
- 粒子系统的核心组成
- 如何创建和查看一个粒子系统
-
第二部分:核心模块详解
- Main 模块:粒子的基本属性
- Emission 模块:控制粒子发射
- Shape 模块:控制粒子发射形状
- Color over Lifetime 模块:粒子生命周期颜色变化
- Size over Lifetime 模块:粒子生命周期大小变化
- Rotation over Lifetime 模块:粒子生命周期旋转变化
- Velocity over Lifetime 模块:粒子生命周期速度变化
- Limit Velocity over Lifetime 模块:限制粒子速度
- Force over Lifetime 模块:持续施加力
- External Forces 模块:受全局力影响
- Collision 模块:粒子碰撞检测
- Sub Emitters 模块:子粒子发射器
- Texture Animation 模块:粒子动画
- Renderer 模块:粒子渲染
-
第三部分:实战案例 - 制作一个魔法火花特效
- 目标效果
- 步骤 1:创建基础粒子流
- 步骤 2:添加颜色和大小变化
- 步骤 3:添加拖尾效果
- 步骤 4:添加发光和模糊
- 步骤 5:添加碰撞和消散
- 步骤 6:优化与整合
-
第四部分:高级技巧与最佳实践
- 使用 Shader 控制粒子
- 粒子与 C# 脚本的交互
- 性能优化技巧
- VFX Graph 简介
第一部分:初识粒子系统
什么是粒子系统?
粒子系统是一种在计算机图形学中模拟大量微小粒子(如火焰、烟雾、雪花、魔法、雨滴等)的技术,在 Unity 中,它是一个强大的组件,通过模拟这些粒子的生命周期(出生、运动、消亡)来创建各种复杂的视觉效果。

粒子系统的核心组成
一个粒子系统可以想象成一个“粒子工厂”:
- 发射器:负责在指定的时间、位置和数量下“发射”或“生成”新的粒子。
- 粒子:被发射出的个体,每个粒子都有自己的属性,如位置、速度、颜色、大小、旋转、生命周期等。
- 影响器:对已存在的粒子施加影响,如重力、风力、阻力等,改变它们的运动状态。
- 渲染器:负责在屏幕上绘制所有粒子。
如何创建和查看一个粒子系统?
- 在 Unity 的 Hierarchy 窗口中,右键点击 -> Effects -> Particle System。
- 你会看到一个默认的粒子系统,在 Scene 视图中,你会看到一个带有播放控制的图标。
- 点击 Scene 视图中的播放按钮,你就能看到粒子效果在实时运行。
- 在 Inspector 窗口中,你可以看到并调整所有控制粒子行为的模块。
第二部分:核心模块详解
这是理解粒子系统的关键,我们将逐一讲解最重要的模块。
Main 模块
这是粒子系统的核心,定义了粒子最基础的行为。
- Start Lifetime:粒子的存活时间,单位是秒。
- Start Speed:粒子被发射时的初始速度。
- Start Size:粒子被发射时的大小。
- Start Color:粒子被发射时的颜色。
- Gravity Modifier:重力影响系数,1 表示标准重力,0 表示无重力,负数表示反重力。
- Max Particles:场景中同时存在的最大粒子数量。
- Simulation Space:
- Local:粒子相对于粒子系统本身运动,移动粒子系统时,所有粒子会一起移动。
- World:粒子在全局坐标系中运动,移动粒子系统时,已发射的粒子不受影响。
- Play On Awake:是否在场景加载后自动播放。
- Looping:是否循环播放。
Emission 模块
控制粒子发射的速率和数量。
- Rate over Time:每秒钟发射多少个粒子。
- Bursts:一次性发射指定数量的粒子,你可以设置多个爆发点。
Shape 模块
定义粒子从哪里发射出来,以及初始的分布形状。
- Shape:选择发射形状,如球体、锥体、半球、立方体等。
- Radius:对于球体、圆锥等形状,控制其半径大小。
- Angle:对于圆锥形状,控制其张角。
- Random Direction:粒子发射方向是否随机,勾选后,粒子会从形状表面向各个方向飞散;不勾选,则粒子会沿形状的法线方向统一飞出。
Color over Lifetime 模块
让粒子在生命周期内改变颜色,这是制作渐变效果的关键模块。
- 你可以在这里添加关键点,创建从生到死的颜色渐变曲线,通常会使用 Alpha 通道来控制粒子的淡入淡出。
Size over Lifetime 模块
让粒子在生命周期内改变大小。
- 同样是曲线编辑器,可以制作粒子从小变大、从大变小或保持不变的效果。
Rotation over Lifetime 模块
让粒子在生命周期内旋转。
- Angular Velocity:设置粒子的旋转速度。
- Rotation Axis:选择旋转轴。
Velocity over Lifetime 模块
让粒子在生命周期内持续改变速度。
- 你可以分别设置 X, Y, Z 轴的速度变化,可以模拟风吹的效果,让粒子在水平方向上持续加速。
Limit Velocity over Lifetime 模块
限制粒子的最大速度,防止粒子运动过快。
- Space:选择是在局部空间还是世界空间中限制速度。
- Magnitude:设置最大速度值。
Force over Lifetime 模块
持续对粒子施加一个力,使其不断加速。
- 与
Velocity over Lifetime不同,这个模块直接施加力,效果更符合物理规律(力 = 质量 × 加速度)。
External Forces 模块
让粒子受到场景中全局力的影响(如 Wind Zone 组件)。
- Multiplier:设置全局力的影响强度。
Collision 模块
启用粒子与场景中物体的碰撞检测。
- Type:选择碰撞类型(如 World, Plane, Collider 等)。
- Collider:指定要碰撞的特定物体。
- Send Collision Messages:是否在碰撞时触发 C# 事件。
Sub Emitters 模块
从一个主粒子系统发射出另一个子粒子系统。
- Type:子粒子的行为。
- Birth:主粒子出生时,发射一个子粒子。
- Death:主粒子死亡时,发射一个子粒子。
- Collision:主粒子碰撞时,发射一个子粒子。
- 这非常适合制作“火花溅射”、“爆炸碎片”等效果。
Texture Animation 模块
让粒子在渲染时播放一个序列帧动画。
- 你需要准备一张包含多帧动画的贴图,然后在这里设置播放速度和帧数。
- 常用于制作“精灵类”粒子,如云朵、烟雾、鸟群等。
Renderer 模块
定义粒子如何被渲染到屏幕上。
- Render Mode:
- Billboard:默认模式,粒子始终面向摄像机。
- Stretched Billboard:粒子沿运动方向拉伸,适合制作高速运动的拖尾。
- Horizontal Billboard:粒子只在水平面上面向摄像机。
- Vertical Billboard:粒子只在垂直面上面向摄像机。
- Mesh:将粒子渲染成指定的 3D 模型。
- Material:为粒子指定材质,这是决定粒子最终“长相”的核心。
- Trail Material:为粒子拖尾指定材质(需要开启
Render Trails选项)。
第三部分:实战案例 - 制作一个魔法火花特效
目标效果:一个从地面升起,带有拖尾、发光效果,并在空中消散的魔法火花。
步骤 1:创建基础粒子流
- 创建一个新的 Particle System,命名为
MagicSpark。 - Main 模块:
Start Lifetime: 设置为5秒。Start Speed: 设置为2。Start Size: 设置为2。Max Particles: 设置为50。Simulation Space: 选择World。
- Emission 模块:
Rate over Time: 设置为20。
- Shape 模块:
Shape: 选择Cone。Angle: 设置为5,让它向上集中喷射。- 取消勾选
Random Direction,让粒子垂直向上。
- Renderer 模块:
Material: 创建一个新的Unlit/Texture材质,命名为SparkMat。- 为
SparkMat的Main Texture选择一张白色的圆形噪点图(可以在网上搜索 "white noise texture")。
- 播放:现在你应该看到一股白色的粒子流向上喷射。
步骤 2:添加颜色和大小变化
- Color over Lifetime 模块:
- 添加该模块。
- 将曲线的起始 Alpha 值设为
0(淡入),中间设为1,结束设为0(淡出)。 - 将曲线的起始颜色设为青色,中间设为亮蓝色,结束设为白色。
- Size over Lifetime 模块:
- 添加该模块。
- 将曲线的起始大小设为
1,然后快速变大到3,再缓慢变小到0,这模拟了粒子爆发后收缩的过程。
步骤 3:添加拖尾效果
- Renderer 模块:
- 勾选
Render Trails选项。 Trail Material: 复制SparkMat,命名为SparkTrailMat。- 在
SparkTrailMat的设置中,将Texture的 Tiling 的 Y 值调大(如5),让拖尾看起来更密集。 - 调整
Min Vertex Distance和Life Time来控制拖尾的长度和细节。
- 勾选
步骤 4:添加发光和模糊
- 材质:
- 选中
SparkMat和SparkTrailMat,将它们的着色器从Unlit/Texture更改为Universal Render Pipeline/Unlit/Shader Graph(如果你使用 URP) 或Standard(内置管线),并勾选Emission属性。 - 为
Emission属性选择一个明亮的颜色(如亮青色),并增加强度。
- 选中
- 后期处理:
- 在场景中创建一个
Post-process Layer和Post-process Volume。 - 在 Volume 中添加
Bloom(泛光) 效果,并调整其强度和阈值,让火花看起来更加璀璨。
- 在场景中创建一个
步骤 5:添加碰撞和消散
- Collision 模块:
- 添加该模块。
Type: 选择World。Lifetime Loss: 粒子碰撞后损失的寿命比例,设为1,意味着粒子一碰到物体就立即消失。
- Sub Emitters 模块:
- 添加该模块,模拟碰撞时的小爆炸。
Type: 选择Death。- 点击
Sub Emitter Object的None,创建一个新的、微小的粒子系统作为子发射器,命名为Burst。 - 配置
Burst粒子系统:让它瞬间爆发几个小粒子,然后快速消失,你可以复制MagicSpark并修改其参数来快速制作Burst效果。
步骤 6:优化与整合
- 性能:观察
Profiler窗口,确保粒子数量在合理范围内。 - 调整:微调所有曲线和参数,直到效果满意为止。
- 预设:如果你对这个效果很满意,可以在 Inspector 窗口右上角的菜单中选择
Save as Preset,方便在其他项目中复用。
第四部分:高级技巧与最佳实践
使用 Shader 控制粒子
标准的粒子材质有时不够灵活,你可以编写自定义的 Shader 或使用 Shader Graph 来实现更复杂的效果,
- 基于速度的拉伸:让粒子根据运动速度自动拉伸。
- 基于生命周期的透明度混合:实现更复杂的淡入淡出逻辑。
- 法线贴图:为 3D 粒子增加表面细节。
粒子与 C# 脚本的交互
-
获取粒子系统组件:
ParticleSystem ps; ParticleSystem.Particle particles; // 用于存储粒子数据 void Start() { ps = GetComponent<ParticleSystem>(); } -
动态修改参数:
// 修改发射速率 var emission = ps.emission; emission.rateOverTime = 50f; // 爆发发射 ps.Emit(10); // 立即发射10个粒子
-
访问单个粒子:使用
GetParticles和SetParticles方法可以获取和修改场景中每一个粒子的属性,实现完全的动态控制。
性能优化技巧
- 粒子数量是王道:
Max Particles是影响性能的最主要因素,尽量用巧妙的设计(如使用子发射器)来减少主发射器的粒子数。 - 简化材质:复杂的 Shader(如复杂的透明混合、光照计算)会显著增加每个粒子的渲染成本,优先使用
Unlit着色器。 - 使用 Billboard:
Billboard模式通常比Mesh模式性能更好。 - LOD (Level of Detail):为粒子系统创建不同精度的预设,当摄像机远离时,切换到粒子数更少的版本。
- 避免频繁的模块开关:在运行时频繁地启用/禁用模块比保持其一直开启但设置强度为 0 的开销更大。
VFX Graph 简介
对于追求极致性能和复杂效果的团队,Unity 提供了 Visual Effect Graph (VFX Graph),它是一个基于节点的、数据驱动的粒子系统,与传统的 ParticleSystem 组件相比:
- 性能更高:利用 GPU 进行并行计算,能处理数百万个粒子。
- 功能更强大:内置了更多高级物理和模拟功能。
- 更现代的 API:与 C# 的交互方式更现代化。
对于初学者,先掌握好 ParticleSystem 是至关重要的,当你需要制作电影级特效或遇到性能瓶颈时,再转向学习 VFX Graph。
