目录
粒子系统
粒子系统ParticleSystem用于在Unity中模拟无形的,流动的物质,例如液体,烟雾,火焰,爆炸,魔法等。在Hierarchy层级栏中可以添加粒子系统:Effects/ParticleSystem。
ParticleSystem会自动生成一个粒子发生器,Inspector中可以看到它包含一个主模块和22个子模块。
Scene中会出现粒子预览窗口,方便调节。
默认启用了Emission/Shape/Render三个模块,它们用来控制粒子的形状,速度,颜色等等。
对象的橘黄色框可以打开Gizmos,关掉SelectionOutline。字体可以通过Edit/Preferences/UIScaling调整
粒子预览窗口:
控制粒子发生的一些参数:
PlaybackSpeed:粒子总体速度(生成速度,移动速度)
PlaybackTime:已运行时间
Particles:当前在屏幕中的粒子数
SpeedRange:粒子速度上下限
模块Module:默认启动了主模块Main,发生频率Emission,发生器形状Shape,粒子的显示Renderer
粒子的基本参数
粒子形状
粒子的形状是在Render模块当中进行定义的,修改粒子的形状,需要先得到一份粒子的贴图,在Ps中制作或从浏览器寻找,将它制作成材质:
需要材质的Shader方式为Particles/StandardSurface,RenderingMode改为Additive(叠加型渲染模式)
进入ParticleSystem,将材质拖入即可完成粒子形状的修改。
粒子的大小在主模块当中进行修改,主模块当中的StartSize可以控制粒子初始的大小,也可以点击它右边的下拉栏让它变成在两个数的区间里随机的大小:选择RandomBetweenTwoConstants。可以明显看到粒子的大小变成了随机的。如果对粒子的形状仍然不满意的话,可以勾选3DStartSize来控制粒子在每个轴向的缩放大小。可以在Renderer模块下找到Pivot,修改每个粒子的轴心位置。
另外,粒子的大小与它所使用的贴图大小是无关的,一个100像素的贴图与一个500像素的贴图绘制出来的同种粒子几乎差不多大,由此可见,StartSize规定了这个粒子的直径,而不是贴图缩放。将材质的渲染方式设置成Opaque(不透明模式),可以发现两张这两种粒子的大小一样。
粒子默认是以BillBoard模式显示的(2D渲染),类似于Terrain中的花草。BillBoard(广告牌)会让物体永远正面对准镜头。
粒子的颜色也可以在主模块中StartColor处设定,这个值可以是两个颜色之间的区间,也可以是随机色彩。
值得注意的是,即便在StartColor中规定了粒子为绿色,显示出来的效果也不是纯绿色,粒子与粒子,天空,红色方块叠加的地方都变成了不一样的颜色,这是因为画面的最终显示效果是由着色器调控的,我们在设置粒子材质的时候,选择的RenderingMode为Additive(叠加的),所以最终显示效果会受到粒子背后传来的光的影响从而发生变色。可以尝试选择不同的着色器选项观察变化。
粒子移动
粒子初始速度是在主模块定义的,StartSpeed就是控制这个速度的值,它也可以使用下拉栏,像规定粒子初始大小一样变成在两个数的区间里随机的速度。粒子的移动可以受到重力影响,同样在主模块中,可以使用GravityModifier规定这个粒子受到重力影响的系数(粒子无刚体,只能模拟),同样它也可以被设定成两个数的区间里随机的系数。这样可以简单的达到有些粒子曲线移动的效果。
粒子的发射方向是由Shape模块决定的,打开Shape模块就可以看到现在的粒子是以什么方式发射的,是一个倒圆锥形向上发射的形式。
粒子的发生
在主模块中,找到PlayOnAwake,这个参数控制这个粒子系统是否在对象初始化时就开始运行。我们可以使用代码来完成这个过程
public class ParticleCtrl : MonoBehaviour
{
private ParticleSystem ps;
void Start()
{
ps = GetComponent<ParticleSystem>();
}
void Update()
{
if (Input.GetButtonDown("Fire1") && !ps.isPlaying)
{
ps.Play();
}
else if(Input.GetButtonDown("Fire1") && ps.isPlaying)
{
ps.Stop();
}
}
}
主模块中的Looping表示这个粒子是否循环播放,如果不勾选,单词运行情况下Duration表示这个粒子系统运行时长。
主模块中的StartLifeTime控制每个粒子的生命周期,也就是粒子发生多长时间后消失,它可以是两个数字之间的随机值。根据数学理论,当前在场的粒子数量的平均值会是这两个数字间的中位数。
Emission模块中的RateOverTime可以控制该粒子系统每秒钟发射的粒子数量(匀速),这个值也可以是两个数之间的随机值。
Emission模块中的Burst可以控制粒子爆发式产生:
Time表示第一次爆发在生命周期的第几秒开始(如果这个值大于生命周期,则全程不爆发)
Count表示每次爆发要生成多少粒子,它可以是两个数字之间的随机值
Cycles表示在整个生命周期中最多爆发多少次,Infinite表示无限次
Interval表示第一次爆发以后每次爆发的时间间隔
Probability表示本次爆发有多大概率发生,是个概率
主模块中的MaxParticles可以控制该粒子系统承受的最大粒子数量,粒子超过这个数量后,不会销毁先出现的粒子,而是停止发生更多新粒子。
主模块中的SimulationSpace模拟粒子在生成后跟随哪个坐标系移动:
Local:粒子生成后跟随粒子发生器坐标的移动而移动,这个模式下,粒子发生器的移动会表现在每个粒子上。
World:粒子生成后不跟随粒子发生器,直接在世界坐标系中移动。
粒子发生器的形状
粒子不可以只能向上发射,关于粒子发射的方向,坐标之类的设置是粒子发生器操控的,Shape模块控制了粒子发生器的形状,选中粒子系统,边缘