粒子特效系统

18.1 Particle System 概述

Unity 的粒子系统是一个可组合的模块化特效工具,用于创建火焰、烟雾、魔法、爆炸、雨雪等各种视觉效果。

核心模块

模块 功能
Main 基础设置(持续时间、循环、最大粒子数)
Emission 发射速率和爆发
Shape 发射形状(锥体、球体、盒子、网格等)
Velocity over Lifetime 生命周期内的速度变化
Color over Lifetime 颜色渐变
Size over Lifetime 大小变化
Force over Lifetime 受力(风力、重力)
Collision 粒子碰撞
Sub Emitters 子发射器(粒子消亡时触发新粒子)
Texture Sheet Animation 序列帧动画

18.2 创建第一个粒子效果

基础步骤

  1. Hierarchy 右键 → Effects → Particle System
  2. 选中粒子系统,在 Inspector 中调整参数
  3. 点击 Scene 视图中的粒子预览或直接 Play 查看效果

Main 模块核心参数

参数 说明
Duration 粒子系统运行时长
Looping 是否循环
Start Lifetime 粒子存活时间
Start Speed 粒子初始速度
Start Size 粒子初始大小
Start Color 粒子初始颜色
Max Particles 最大粒子数(控制性能)

18.3 不可用模块(Emission & Shape)

Emission 模块

1
2
3
4
5
6
7
8
9
10
11
// 通过脚本控制爆发
ParticleSystem ps = GetComponent<ParticleSystem>();

// 爆发 50 个粒子
ps.Emit(50);

// 在指定位置爆发
ParticleSystem.EmitParams emitParams = new ParticleSystem.EmitParams();
emitParams.position = hitPoint;
emitParams.applyShapeToPosition = true;
ps.Emit(emitParams, 10);
参数 说明
Rate over Time 每秒发射粒子数
Rate over Distance 每移动单位距离发射
Bursts 爆发(一次性发射一批)

Shape 模块

形状 适用效果
Sphere 爆炸、魔法光环
Cone 火焰喷射、手电筒光柱
Box 雨、雪(区域覆盖)
Circle 光环、环形特效
Mesh 从模型表面发射
Donut 甜甜圈形状烟雾

18.4 进阶模块配置

Color over Lifetime

  • 添加颜色渐变关键帧
  • 支持透明度渐变(粒子淡出)
  • 常用于:火焰(黄→红→淡出)、魔法(蓝→紫→透明)

Size over Lifetime

  • 曲线控制粒子大小变化
  • 常用于:烟雾逐渐膨胀、火花逐渐缩小消失

Velocity over Lifetime

  • 添加方向速度变化
  • 搭配 Random Between Two Constants 实现随机漂移
  • 常用于:烟雾向上飘散、火星随机飞溅

Noise 模块(增添自然感)

  • 添加随机扰动,模拟风或湍流
  • 适用于:烟雾、火焰、魔法粒子
  • 开启后粒子运动更自然不规则

18.5 粒子碰撞与触发

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class ParticleCollisionHandler : MonoBehaviour
{
private ParticleSystem ps;

void Start()
{
ps = GetComponent<ParticleSystem>();

var collision = ps.collision;
collision.enabled = true;
collision.type = ParticleSystemCollisionType.World;
collision.mode = ParticleSystemCollisionMode.Collision3D;
collision.sendCollisionMessages = true;
}

// 粒子碰撞回调
private void OnParticleCollision(GameObject other)
{
Debug.Log($"粒子击中:{other.name}");

if (other.CompareTag("Player"))
{
other.GetComponent<PlayerHealth>().TakeDamage(5);
}
}

// 粒子触发回调
private void OnParticleTrigger()
{
List<ParticleSystem.Particle> enter = new List<ParticleSystem.Particle>();
int numEnter = ps.GetTriggerParticles(ParticleSystemTriggerEventType.Enter, enter);

for (int i = 0; i < numEnter; i++)
{
ParticleSystem.Particle p = enter[i];
// 处理进入触发器的粒子
}
}
}

18.6 性能优化

1
2
3
4
5
6
7
8
9
10
11
12
13
// 限制最大粒子数
var main = ps.main;
main.maxParticles = 100;

// 使用简单的粒子纹理
// 推荐使用小尺寸纹理(32x32 或 64x64)

// 关闭不必要的模块
// 不需要时禁用 Collision、Sub Emitters、Noise 等模块

// 使用 GPU 粒子
var renderer = ps.GetComponent<ParticleSystemRenderer>();
renderer.renderMode = ParticleSystemRenderMode.Billboard;

18.7 本章小结

  • Particle System 由多个模块组成,按需启用
  • Main 模块控制基础属性,Emission 控制发射方式
  • Color/Size/Velocity over Lifetime 创造动态变化
  • Noise 模块增加随机自然感
  • 粒子碰撞用于实现与游戏世界的交互
  • 控制最大粒子数和使用简单纹理是优化的关键

练习题

  1. 制作一个火焰粒子效果(锥形发射 + 黄到红渐变 + 随机速度)
  2. 制作一个爆炸特效(球状爆发 + 粒子膨胀 + 子发射器火花)
  3. 使用粒子碰撞实现:粒子击中地面时在落地位置生成一个印记
  4. 制作一个下雨效果(Box Shape + 速度方向 + 粒子碰撞地面溅射)
ByteFisher
分享编程技术 · 记录钓鱼乐趣
扫码关注
▸ 扫码关注 ◂
Unity3D开发基础教程 系列
第 18/20 篇
分享: