前言
曾经我们是不是以为跟粒子系统打交道多的是特效美术?曾经我们是不是以为改变粒子的位置是不是只要设置transform的position?曾经我们程序对粒子系统做的最多的操作是不是只要加载显示就OK了?曾经我们想要一次又一次的播放粒子特效是不是显示隐藏再显示父节点?曾经我们想要改变一下粒子特效的参数是不是先获取ParticleSystem组件然后修改里面的参数?曾经…,现在我才知道原来ParticleSystem有个Emit的接口,来改变粒子发射器。之前对粒子特效理解不深或许因为公司有特效美术,或许因为需求简单,或许自己没深入研究一下,不过亡羊补牢,为时不晚。我们都知道Unity的粒子很耗,能少用就少用,Unity也推出一款新的粒子系统,需要在Unity2018.3的版本之后使用。新的粒子系统是可视化的并且运行在GPU上的粒子系统,性能和效果大幅度提审,不过是基于HDRP的高清渲染管线,这就意味着大多数移动设备可能不支持。Unity还专门为了介绍这个新的粒子系统出了一款FPS的Demo,画质特别高清,有点像守望先锋的赶脚。
效果
- 1.改变粒子发射位置
- 2.改变粒子发射角度
粒子系统常见的参数和接口
- StartLifetime 粒子生命时长
- StartSpeed 粒子初始速度
- 变量的四种类型
- Constant 数值类型
- Curve 曲线类型
- Random Between Two Constants 两个数值之间的随机类型
- Randoom Between Two Curves 两个曲线之间的随机数值类型
- Play On Awake 是否一开始就播放
- Emission 勾上能在Scene中直接点Play看到效果,如果不勾选就看不到效果
- Emission / Bursts 几个粒子
- EmitParams 粒子参数改变类
注意事项
在测试两个Curve曲线取值的时候发现跟实际想要的值不一样,两个曲线的范围值只是-1~1,然后需要乘上系数SpeedCurve.curveMultiplier,其他模式却不需要这样乘以系数就能获取到Curve的值,感觉像是bug一样的存在,获取Curve的四种类型的值的方法如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22public float GetCurrentSpeed()
{
switch (mSpeedCurve.mode)
{
case ParticleSystemCurveMode.Constant:
mCurrentSpeed = mSpeedCurve.constant;
break;
case ParticleSystemCurveMode.TwoConstants:
mCurrentSpeed = Random.Range(mSpeedCurve.constantMin, mSpeedCurve.constantMax);
break;
case ParticleSystemCurveMode.Curve:
mCurrentSpeed = mSpeedCurve.Evaluate(Random.value);
break;
case ParticleSystemCurveMode.TwoCurves:
{
float t = Random.value;
mCurrentSpeed = Random.Range(mSpeedCurve.curveMin.Evaluate(t), mSpeedCurve.curveMax.Evaluate(t)) * mSpeedCurve.curveMultiplier;
}
break;
}
return mCurrentSpeed;
}
代码
- ParticleEffectsEmitter
1 | using System.Collections; |
//宏定义替换成XXX #避免跟MD语法冲突
- Emitter
1 | using DG.Tweening; |
新的粒子系统
更多关于新粒子系统的介绍链接
工程下载
https://github.com/Unity-Technologies/FPSSample