最近看了下Unity3d的粒子系统的相关视频,并且动手操作了下,感觉自己的美工技能又增进了下(开个小玩笑),发现粒子系统所需要记忆的东西还是有点多的。
所以为了不让自己遗忘某些知识点,我准备发布成博客,以便以后能够查阅回忆。
OK,废话不多说,马上进入Particle System,相对程序员来说的噩梦:
我们先来看看Particle System在Inspector视窗中的属性:
可见,粒子总共有个Transform组件和Particle System组件。
1.Transform:可以控制粒子在世界或者本地坐标的改变。但是有点注意的是,如果你改变Scale属性值是不会影响粒子的大小缩放的。所以我们想改变粒子大小不能这么改。
2.Particle System:改变粒子的属性,比如大小,发射速度等等。这个也是我们制作粒子的核心组件。
OK,来看看这些属性值的作用。
我们先在Scene中创建一个新的Particle System,然后到Inspector视窗中。
1.我们先来学下他的基本属性:
(1)Duration:粒子持续的时间,什么意思?就是你发射器发送粒子持续的时间。可能还有些绕,举个例子,比如你打火机打开,点个烟。从打开到熄灭火这个过程火焰持续在燃烧,那么这个时间段就是Duration。再举个例子,你煤气在烧两壶水,一个烧水10分钟,一个烧水5分钟。那么煤气灶是粒子发射器,火焰是粒子,10分钟和5分钟就是持续时间。
我们做个小实验,我们把loop勾去掉,因为这个会影响Duration,如果是loop循环发射那么Duration就为无穷大,没有意义。把Duration改成5和1分别试下。
5秒:
可以看到5秒之后呢,粒子就不再发射了。
1:
可以看到1秒之后,粒子就不再发射。
(2)Looping:循环发射粒子。我们打钩之后,粒子发射器就会不断的持续的发射粒子,不管你的Duration调成多少,他都是一成不变的管自己发射。
(3)Prewarm:预热粒子发射。什么意思,当我们开始发射粒子的时候,是不是粒子数量从0开始,然后才慢慢增多,可看到上面额gif。但是当我们勾选这个,他就会在我们点击发射的时候,他不是从数量0开始,而是像已经发射一个周期一样。(注意他只是在Looping打钩的情况下才能使用)
可以看到我一点发射,他数量就已经是发送一个周期的数量。
(4)Start Delay:延迟多长时间开始发射粒子。也就是说我们点击开始发射,他会暂停这么多时间后,然后才开始发射粒子。
(5)Start Lifetime:开始粒子的生命周期。这个值就是单个粒子的生命周期。就像我们人类的寿命一样,比如有个人的寿命80,过了80年,他就从世界上消失了。那么如果一个粒子的开始生命周期是5秒,那么这个粒子发射到Unity3d的World中,过了5秒之后,这个粒子就消亡了,道理是一样的。
那么我们想让不同的粒子有着不同的生命周期,那么怎么弄?放心,在unity中我们生命周期的值是可以设置随机不同的值。具体看下Inspector视窗中的属性:
可以看到他支持4中不同类型的值:
(1.Constant:常量。也就是每个生命周期都一样。
(2.Curve:曲线。
举个例子,假如我Duration是3秒,生命周期钥匙曲线值,那么我弄得曲线是如图。
那么这个曲线是什么意思呢,纵坐标表示生命周期的值,横坐标表示Duration的值。
假如我们在点(0.5,4)做文章,也就是说在一个粒子在粒子发射器已经持续发射0.5秒后发射出来,那么他对应的生命周期就是是4秒,所以越往后面发射生命周期越小,消亡越快。
(3.Random Between Two Constants:随机在两个常量之间。也就说粒子生命周期定在这两个常量中间。比如我定的两个常量是1,10。那么粒子生命周期可能是1,可能是3,可能是10,反正不会超过或者小于两个值。
(4.Randow Between Two Curves:随机在两条曲线之间。
这个也是类似的,但是取值就是两条曲线之间的取值,比如我在图中已经画出了一条直线,如果Duration刚好是图中直线的x坐标值,那么这条直线和两条曲线相交的两个值,那么这个生命周期就会随机从这两个中取一个。
OK,终于讲完了取值。接着我们看。
(6)Start Speed:开始速度。粒子出生具有的速度,这个值也是可以有4中类型的,因为有些粒子速度快点,有些慢点。
(7)Start Size:开始大小。粒子出生具有的大小。跟速度一样,也是4种类型的。
(8)Start Rotation:开始旋转方向。粒子出生具有的旋转方向。也是4种类型的值。
(9)Start Color:开始颜色值。粒子出生具有的颜色。
在第二种我这里讲下,这个是颜色渐变值,什么意思?当我们选择Gradient渐变的模式时:
会出现这编辑器,那么怎么制作呢?很简单,我们只要在空白双击就会出现指标,然后不同的指标改变不同的颜色,那么怎么会有上下浮标。
这里上面是Alpha的值,下面是Color的值。
修改完颜色之后,我们来看看效果。
可以看到颜色先是红色,再是紫色,然后蓝色,最后白色,是不是我们上面调的颜色顺序,也就是说他是根据Duration然后改变不同的颜色。
(9)Gravity Multiplier:受重力影响的值。也就是说这个值越大,那么受到重力越大。我们做个小实验,我们修改Start Speed大一点,为10,然后修改这个值为2。发射粒子:
可以看到发射出去的粒子都受到重力影响往下落。
(10)Inherit Velocity:继承速度。也就是说这个值是影响粒子受到发射器速度的影响。一般来说我们这个值是设为0.这里参数我们不管,因为我也不怎么懂。=_=!
(11)Simulation Space:发射坐标。什么意思?这里有两个参数可供选择。第一个是Local(默认),第二个是World,这两个有什么区别呢?
区别还是蛮大的,首先我们知道粒子是从粒子发射器里面发射出来的,但是粒子发射出来后是属于粒子发射器还是世界的?这里如果是Local的话,也就是说粒子还是属于本地粒子发射器的,粒子发射出来后,粒子发射器在哪里粒子就在哪里。
但是World就截然不同,它表示发射出来的粒子是属于世界的,已经不是属于粒子发射器的,所以当你移动粒子发射器,已经发射的粒子还是留在原地。
我们来看下实验结果:
(12)PlayOnAwake:是否在激活就播放。
(13)Max Particles:最多粒子数。就是一个duration内发射粒子最多数量。如果是1的话,一个duration只发射1.
OK,讲完基础属性,我们接着讲各个比较重要的属性:
发射器相关的属性,可以看到第一个属性Rate:
1.Rate:每秒发射多少粒子(简称发射速率)。什么意思,比如你的Duration是5秒,Max Particles是50的话,你Rate为10,那么就是每秒发射10个粒子,5秒就发射50个。但是现在如果把Rate改成50的话,那么一秒一次性发射50个粒子,也就是说把所有的发射完了,那么就下来的4秒就没有粒子可以发射了。
2.Bursts:粒子集。可以看到粒子集右边有个+号的按钮,我们点击就会出现Time和Particles的参数选择。
那么这两个参数是干嘛用的,其实就是在0.00时刻,发射30个粒子,结合上图显示的参数。
我们还可以点击+号继续添加不同时刻发射不同数量的粒子。比如我继续添加在4.00时刻发射30粒子。
这里注意下,这个Time时刻是不能超过Duration持续时间,不然的话是没有效果的,还有发射粒子的总数和不能超过Max Particles,不然的话发射总数还是Max Particles,只不过超过的部分自动被截断了。还有得吧Rate改成0,因为没有速率可言。
然后观察下效果:
可以看到在0.00时刻发射30个,在4.00时刻发射20,为什么因为Max Particles才50,面前已经30,所以最后50-30=20个。
这节我们继续上节没讲完的Particle参数。
上节我们讲了Emission发射器参数,我们接着往下讲Shape:
可以看到这个子模块的参数是跟形状有关:
1.Shape:发射形状。粒子被约束在这个形状中发射。我们看看效果图就知道了。就拿这个Cone锥形来看:
可以看见粒子发射总是被约束在这个锥形中。
我们看看总共有几种形状:
1.Sphere:球体。粒子被约束在这个球体中发射。
(1.Radius。球体半径。
(2.Emit from Shell:是否粒子发射是在圆形的表面发射。默认是圆形体内任意位置。
(3.Random Direction:是否是随机方向。默认是跟形状相关的从中心向外发散方向,比如球体就是爆炸方向。如果是随机方向的话,就是胡乱发射。但是他还是被约束在球体里面发射。只不过发射的方向变了而已。
2.HemiSphere:半球体。粒子被约束在这个半球体内发射。
(1.Radius:半球体的半径。
(2.Emit from Shell:是否粒子发射是在半球体的表面发射。默认是半球体内任意位置。
(3.Random Direction:跟球体类似。本来是从球体中心发散出去,但是勾选这个之后,就随机方向发射。
3.Cone:椎体。粒子被约束在这个椎体中发射出去。
(1.Angle:锥形斜面和垂直方向的夹角。如0度就是圆柱。90度就是跟平面类似。
(2.Radius:锥形底面的半径。
(3.Length:底面和顶面的距离。也就是圆锥的高。这个参数是受第4个参数的影响,如果是从Base(底面)发射,那么Length就没有用。如果是Volume(体积)发射,那么Length就有用。因为体积肯定和高度有关嘛。
(4.Emit form:从哪里发射:总共有4种:
1.Base:圆锥底面。粒子是从圆锥体的底面的任意位置沿着体积方向发射出去。
2.BaseShell:圆锥底面周长边。粒子是从圆锥底面的周长边沿着侧表面的方向发射。与Base唯一的区别就是一个是沿体积,一个是沿侧面。
3.Volume:体积。粒子是从圆锥体内的任意位置沿着体积的方向发射出去。
4.VolumeShell:体积侧面。粒子是从圆锥体的侧面的任意位置沿着侧面方向发射出去的。
(5.Random Direction:与上面讲的随机类似。
4.Box:长方体。粒子被约束在长方体内发射。
(1.Box X:x方向上的长度。
(2.Box Y: y方向上的长度。
(3.Box Z:z方向上的长度。
默认发射粒子是在长方体内的任意位置沿着z方向(与xy平面垂直)发射。
(4.Random Direction:类似不讲了。
5.Mesh:网格。粒子被约束在网格里面发射。
可以看到我这里选择了一个Plane网格,那么上面的参数Triangle是什么鬼。这个参数是表示粒子在哪里反射。总所周知,网格由顶点,线段,面构成。那么Triangle代表是三角面。
他这里有三个选择:
1.Vertex:粒子就是从网格的顶点发射出去。
2.Edge:粒子是从网格的边长发射出去。
3.Triangle:粒子从网格的面发射出去。
OK,经过长篇大幅,终于把Shape这个组件讲完了。我们来总结下这个Shape的作用,他主要是约束粒子发射的形状,比如火焰当然得用Cone锥形,然后夜明珠就得用Sphere球体。
行,我们讲下个组件:Velocity over Lifetime 速度受粒子的生命周期影响。
假如说我们将x改成4,那么粒子在x方向的速度是4,那么在粒子的生命周期内,他的x方向速度是4,其他方向速度是0。也就是说他会偏向x方向移动。
同理,y和z方向也是类似的。
那么下面的Space是什么,就是这个x方向的速度是受父类速度影响(Local)还是不受父类影响(World)。我具体研究了下,发现根本没啥屌用。主要还是看前面的Simulation Space的参数。所以这个参数我们暂时不管他。
我们总结下,这个组件有啥用,主要是根据不同类型粒子改变不同方向上的速度。如下雨,肯定不是直直的下着带有点倾斜的下着,所以这里改变下方向速度就可以实现。
OK,我们继续下个组件:Limit Velocity over Lifetime 限制粒子速度
这个组件其实没啥屌用,就是限制粒子发射速度。
(1.Separate Axis:是否限制3个方向的速度。当我们打钩之后,会有x,y,z三个方向的速度限制。
(2.Speed:总体限制的速度。
(3.Dampen:速度限制倍数。我发现永远为1,不懂为什么。
OK,这个组件其实就是为了防止在其他地方修改导致粒子速度过快或者过慢。
进入下个组件:Force over Lifetime 粒子在不同方向受力
这个组件其实就是改变粒子不同方向上的加速度。感觉类似于上面讲的两个组件,这里我不详细介绍。
主要应用场景很多,比如喷泉,我们在z方向施加往下的力,类似的场景很多,凡是跟重力相关的都可以用上。
Color over Lifetime:(粒子颜色随着生命周期的改变而改变)
这个组件是用来改变粒子颜色,但是这个颜色变化是根据粒子的生命周期而变化的,如下如所示:
我在生命中期的颜色改为红色,可见粒子发射出来的时候在中间位置颜色变成红色。
Color by Speed:(粒子颜色随着速度的变化而变化)
这个组件也是用来改变粒子颜色的,只不过这次是根据粒子的实时速度来变化的。
见下图:
粒子的速度为5,
1.Color:我选择在速度范围的中间设置为红色。
2.Speed Range:速度范围。这里我选择0-10,那么粒子的速度落在了范围的中部,所以整体粒子的颜色改变为红色。
Ok,接下来几个组件与上面几乎一致,分别是:
1.Size over Lifetime:(粒子大小随着生命周期而变化)
2.Size by Speed(粒子大小随着速度而变化)
3.Rotation over Lifetime(粒子旋转方向随着生命周期而变化)
4.Rotation by Speed(粒子旋转方向随着速度而变化)
External Forces:(这个组价我一直搞不懂,但是几乎没怎么用到,先跳过等我研究透了再来写)
接下来:
Collision:(粒子碰撞效果)
这个组件用来处理粒子与其他碰撞器之间的碰撞检测。
1.Planes Or World(第一个参数是其他碰撞体类型,
(1-Planes)如果是Planes的话,那么规定死了,粒子只能与这些Planes,也就是面碰撞,如上图,我们可以点击+按钮添加Transform面)
(2-Visualization)可视化类型,有分Grid和Solid:
Grid:(网格,在编辑过程中可以看见具体的碰撞器边界)
Solid(实体),没有边界,但是他的实体就是边界,没啥差别。
(3-Scale Plane)面的缩放大小,也就是碰撞器的缩放大小。
(4-Dampen)碰撞器表面的摩擦力大小。如果大于0的话,表明粒子碰到碰撞器后速度会减少。
(5-Bounce)弹力。默认为1,如果为0的话,表示不能反弹,那么就只能沿着碰撞器表面滑行。
(6-Lifetime Loss)碰撞之后粒子生命周期减少。
(7-Min Kill Speed)顾名思义。粒子碰撞后如果速度小于这个速度的粒子会销毁。
(8-Particle Radius)粒子半径。
(1-World)如果是World的话,我们可以选择在世界坐标下所有的碰撞的layer来剔除。在参数中多了个Collides With,这里选择我们需要的layer。
其他大致参数与上述Planes一致。
Sub Emitters:(自粒子发射器)
分为三个阶段:
1.Birth(本粒子出生的时候,那么子粒子会跟着本粒子出生)
2.Collision(本粒子碰撞的时候,会产生子粒子)
3.Death(本粒子死亡的时候,会产生子粒子)
这里注意所谓粒子是单个粒子,不是整个Particle System。可能读者会误以为整个本体Particle死亡的时候才产生粒子,这里是个误区,其实是Particle的单个小粒子。
比如我在出生的搞个子粒子。那么每发射一个小粒子,会持续产生子粒子,注意持续。因为我没有在本体粒子Death处理任何事,也就是说本体粒子没有消亡之前,一直会产生子粒子。
接下来:
Texture Sheet Animation:(序列帧动画)
这个组件得配合下面的Renderer组件的材质球。因为我们的序列帧图片是从这里获取的。
这里我搞了个帧贴图材质,赋给Renderer组件里面的Material。
OK,我们看下Texture Sheet Animation的参数:
1.Tiles :(这里是UV坐标,其实可以理解为xy分别表示把整张图切成几块,比如x等1,y等2,表示整张图,x部分整张,y部分被切成两块,这样就表示整张图被切成上下两个部分,这样帧动画就拿着两个部分循环替换出现,如果x等2,y等2,那么就整张图被切成四块,帧动画取四块交替)
2.Animation:(表示去哪个部分做帧动画)
(1-Whole Sheet:表示整张图,根据上面的UV)
(2-Single Row:单行)比如x=2,y=2就表示两行,row=0,就交替第一行的图片,row=1,就交替第二行的图片。
3.Frame over Time: 在粒子生命周期里面,播放第几帧的图片)就拿上面的来讲,总共有4帧图片,那么这里我写0的话,他会播放第一帧的图片,写1的话,播放第二帧的图片,如果是曲线的话,那么就会在生命周期里面,交替出现不同的帧图片,也就形成了帧动画。
4.Cycle:在生命周期内循环播放次数)基本上为1,特殊情况自己搞。
接下来的组件是与之息息相关的:
Renderer:(渲染组件,就是渲染粒子的材质球)
1.Renderer Mode:(渲染模式)
(1-Billboard):渲染出来的粒子永远朝向摄像机,也就是说摄像机无论在哪个角度,他都是表现材质球的正面。
(2-Stretched Billboard):渲染出来的粒子可以进行缩放,但是没有正面朝向摄像机。什么叫正面,就是说他原先发射的粒子什么方向就是什么方向。
调整Scale来拉伸粒子,这三个参数随便改动那个都行。
(3-Horizontal Billboard):渲染出来的粒子都是水平朝向。
(4-Vertical Billboard):渲染出来的粒子都是竖直朝向。
(5-Mesh):渲染出来的粒子的Mesh。注意这个会和Texture Sheet Animation发生冲突。也就是说规定了粒子的mesh之后就不会有帧动画产生。
Ok,剩下的你们自己去理解,看看名字其实就知道咋用。