好,我们继续上节课的子模块讲。
Unity粒子系统(5.x)基础(三)
目录
1.External Forces
作用:此模板主要是增加风力对粒子的影响。
主要有三个参数:
(1)Multiplier:控制风力对粒子的影响程度。
我们可以做个实验:
首先,先建一个风,如图:
然后,播放粒子,发现Multiplier越大,粒子受风力影响就越大。
(2)Influence Filter:控制风力的影响对象,一般通过Layer Mask来控制。
比如我们把Influence Mask的Everything改成Nothing或者非Default层粒子就不会受粒子影响了。如图:
2.Noise module
作用:这个模块主要控制噪声对粒子运动的影响。
参数比较多,讲几个比较重要的。
(1)Separate Axes:分离轴,控制噪声在每个轴上对粒子的影响。
(2)Strength:控制粒子在其生命周期中的噪声效应的强弱。更高的值会使粒子移动得更快更远。如图
(3)Freqency:低值会产生柔和、平滑的噪音,而高值会产生快速变化的噪音。也就是说它可以控制粒子改变方向的频率。
(4)Position Amount:控制噪声对粒子位置的影响程度。
(5)Rotation Amount: 控制噪声对粒子旋转的影响程度,以每秒度为单位。
(6)Size Amount: 控制噪声对粒子大小的影响影响程度。
总结:可以用来模拟火灾余烬(强的高频噪声)。
3.Collision module
(1)Type:Planes 或者World如果是Planes的话,粒子只能与这些面碰撞,如图,我们可以点击+按钮添加Transform面。
注意面不一定非是标准的面,其它的诸如Cube等都可以。
好,下面我们就以World模式来讲下面的参数,一般Planes 有的World都有。
(2)Collision Mode:选择碰撞模式,有分2D和3D.
(3) Dampen:碰撞器表面的摩擦力大小,当粒子碰撞时,它将失去一部分速度。除非设置为0.0,否则粒子在碰撞后会变慢。
(4)Bounce:弹力。默认为1,如果为0的话,表示不能反弹,那么就只能沿着碰撞器表面滑行。
(5)Lifetime Loss:碰撞之后粒子生命周期减少的程度。
(6)Min Kill Speed:顾名思义。粒子碰撞后如果速度小于这个速度的粒子会销毁。
(7)大于 Kill Speed:同理。粒子碰撞后如果速度大于这个速度的粒子会销毁。
(8)Radius Scale:粒子碰撞的有效半径。
如图:
(9)Collision Quality:碰撞的质量。质量越高,粒子就穿过碰撞器的概率就越小。注意Medium (Static Colliders)和Low(Static Colliders)只适用于静态碰撞器。。科普一下什么是动态和静态碰撞器:简单来说具有刚体的游戏对象上的碰撞器称为动态碰撞器,没有刚体的游戏对象上的碰撞器称为动态碰撞器。
如下图:由于Cube加了刚体组件,然后又设置成了Medium (Static Colliders),所以没有碰撞效果。
(10)Collides With:设置碰撞所在的层级—Layer。
(11)Max Collision Shapes: 粒子碰撞可以考虑多少碰撞形状。多余的形状被忽略,并且地形优先考虑。
比如下面的这个例子:
在这里插入图片描述
Max Collision Shapes设置为了1,然后有球体和方体,优先考虑了球体碰撞,所以说不要轻易改变这里的值。
(12)Enable Dynamic Colliders:允许粒子也与动态对象碰撞(否则只使用静态对象)
(13)Collider Force :粒子碰撞后向物理对撞机施加力。这对于用粒子推动碰撞器是很有用。当然要其作用需要对碰撞器添加刚体组件。
下面这三个选项可以碰撞的角度,速度,大小,来对Collider Force产生影响。
1)Multiply by Collision Angle:正面垂直碰撞产生的力更大。
2)Multiply by Particle Speed:速度快的粒子产生的力更大
3)Multiply by Particle Size :较大的粒子会产生比小粒子更大的力。
(14)Send Collision Messages:这项主要是与程序的交互,检测脚本中的粒子碰撞。和第一节讲的Stop Action类似。
例如:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CollsionAction : MonoBehaviour
{
private void OnParticleCollision(GameObject other)
{
print(other.name);
}
}
这里不得不提到的是:每个粒子系统每帧最多只接收一条碰撞的消息。
4.Triggers module
第一个参数不用多讲,就是要传入一个触发器。
然后下面是粒子和触发器不同的状态:
Inside:在碰撞器内。
Outside:在碰撞器外。
Enter:粒子进入触发器。
Exit: 粒子退出触发器。
然后每种状态有三个选项,和第一节的Stop Action差不多。
1.Ignore:表示粒子不做任何处理。
2.Kill:表示粒子会消亡。
3.Callback:触发回调函数,需要我们添加相应代码。
如下面的例子:粒子进入触发器时变红,然后在离开触发器边界时变成绿色。注意:在Enter和Exit必须选择Callback,否则就会无法触发回调而没有效果
代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Trigger : MonoBehaviour
{
ParticleSystem ps;
List<ParticleSystem.Particle> enterParticle = new List<ParticleSystem.Particle>();//进入触发器的粒子列表
List<ParticleSystem.Particle> exitrParticle = new List<ParticleSystem.Particle>();//退出触发器的粒子列表
void Start()
{
ps = GetComponent<ParticleSystem>();
}
private void OnParticleTrigger()
{
print("Sd");
//获取进入触发器的粒子和退出触发器的粒子,检测间隔:每一帧
int enterNum = ps.GetTriggerParticles(ParticleSystemTriggerEventType.Enter, enterParticle);
int exitNum = ps.GetTriggerParticles(ParticleSystemTriggerEventType.Exit, exitrParticle);
//将进入触发器的粒子变为红色
for (int i = 0; i < enterNum; i++)
{
ParticleSystem.Particle newparticle = enterParticle[i];
newparticle.startColor = new Color32(255, 0, 0, 255);
enterParticle[i] = newparticle;
}
//将退出触发器的粒子变为绿色
for (int i = 0; i < exitNum; i++)
{
ParticleSystem.Particle newparticle = exitrParticle[i];
newparticle.startColor = new Color32(0, 225, 0, 255);
exitrParticle[i] = newparticle;
}
//将修改的粒子重新指定回粒子系统
ps.SetTriggerParticles(ParticleSystemTriggerEventType.Enter, enterParticle);
ps.SetTriggerParticles(ParticleSystemTriggerEventType.Exit, exitrParticle);
}
}
效果如下:
Visualize Bounds: 这个参数让粒子在Scene window(场景视图)中显示边界。上面的例子中,我最后演示了一下。
5.Sub Emitters:(子粒子发射器)
注意:所谓粒子是单个粒子,不是整个Particle System
1.Birth(父粒子出生的时候,那么子粒子会跟着本粒子出生),如图
2.Collision:本粒子碰撞的时候,会产生子粒子。
3.Death:父粒子死亡的时候,会产生子粒子,利用这个可以制作烟花效果,如图
父粒子系统参数:
子粒子系统参数:
效果如下:
4.Trigger:父粒子与触发器相互作用时,会产生子粒子。注意这里要结合Trigger模块。如图
效果如下:
5.Manual: 只有在通过脚本请求时才触发。
下面这个例子结合Trigger模块,实现粒子退出触发器时的爆炸效果。
脚本如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SubEmissionScript : MonoBehaviour
{
ParticleSystem ps;
private List<ParticleSystem.Particle> exitParticle = new List<ParticleSystem.Particle>();//退出触发器的粒子列表
int exitNum;
void Start()
{
ps = GetComponent<ParticleSystem>();
}
private void OnParticleTrigger()
{
exitNum = ps.GetTriggerParticles(ParticleSystemTriggerEventType.Exit, exitParticle);
if (exitNum != 0)
{
print(exitParticle.Count);
ps.TriggerSubEmitter(0, exitParticle);//使用索引获取ps粒子系统下的子发射器
exitNum = 0;
}
}
}
父粒子系统参数如下:
子粒子系统参数如下:
效果如下:
其它的没什么好讲的了。
总结:一颗子弹离开枪管时,可能伴随着喷出的烟粉,而火球在撞击时可能会爆炸等诸如此类的效果。而子发射器模板就可以实现这样的效果。
6.Texture Sheet Animation(序列帧动画)
注意:这个组件得配合下面的Renderer组件的Material(材质球)。因为我们的序列帧图片是从这里获取的。
链接:这是本节相应的材质贴图和相应的材质球
提取码:1111
好,下面来看看具体参数。
Mode:选择模式,一共两种模式,第一是Grid模式,另一种是Sprites模式,这里先讲第一种Grid模式。
(1)Tiles:这里是UV坐标,其实可以理解为xy分别表示把整张图切成几块,比如x等4,y等2,表示整张图切成了4列两行,一共八块,这样帧动画就拿着八个部分循环替换出现。
播放效果如下:
(2)Animation:(表示去哪个部分做帧动画)
(1-Whole Sheet:表示整张图,根据上面的UV)
(2-Single Row:单行播放,比如x=2,y=2就表示两行,row=0,就交替第一行的图片,row=1,就交替第二行的图片。
(3)Time Mode:播放时,帧的标准。
1)Lifetime: 播放的帧随在粒子的生命周期内变化,这个不难理解。
2)Speed:以Start Frame为起始帧,由粒子的速度,在给定的速度范围内指定播放的帧。
如下图所示:以0为Start Frame,在speed为0-7的范围内,如果粒子速度为0,则播放第1帧的动画,如果粒子速度为1,则播放第2帧的动画,…因为帧动画一共为8帧,如果speed大于7,那么它就会一直播放最后一帧。如下:
3)FPS:以Start Frame为起始帧,以FPS每秒播放多少帧(也就是播放速度)播放帧动画。如下:
(4)Frame over Time(lifetime模式下): 在粒子生命周期里面,播放第几帧的图片,就拿上面的来讲,总共有8帧图片,那么这里我写0的话,他会播放第一帧的图片,写1的话,播放第二帧的图片,如果是曲线的话,那么就会在生命周期里面,交替出现不同的帧图片,也就形成了帧动画。
(5)Cycle:在生命周期内循环播放次数,基本上为1,如果想要播放更快就需要调高它的值。
好,下面来讲一下Sprites模式模式。
此模式与Grid模式的区别是:Grid是对一张图片进行剪裁编辑,然后依次形成帧动画,而Sprites模式则是把把一张图片剪裁为图片集,然后可以手动添加,可以自由控制帧动画的播放顺序。
如图:
效果如下:
然后其它的和Grid模式模式差不多。
7.Renderer:(渲染组件,也就是渲染粒子的材质球)
参数有点多,主要讲讲渲染模式。
Renderer Mode:(渲染模式)
(1)Billboard:渲染出来的粒子永远朝向摄像机,也就是说摄像机无论在哪个角度,他都是表现材质球的正面。
(2)Stretched Billboard:渲染出来的粒子可以进行缩放,但是没有正面朝向摄像机。可以通过调整3D StartScale来调整拉伸.如图。
(3)Horizontal Billboard:渲染出来的粒子都是水平朝向。当粒子覆盖地面时(例如目标指示器和魔法咒语效果),或者当它们是与地面平行飞行或漂浮的扁平物体时,可以使用此模式
(4)Vertical Billboard:渲染出来的粒子都是竖直朝向。
(5)Mesh:渲染出来的粒子具有立体效果。可以提高物体的体积感。
好,差不多了,下一节我们开始实战。
另附上: