阅读 209

Unity粒子系统(5.x)基础(三)

好,我们继续上节课的子模块讲。

Unity粒子系统(5.x)基础(三)

  • Unity粒子系统(5.x)基础(三)

  • 1.External Forces

  • 2.Noise module

  • 3.Collision module

  • 4.Triggers module

  • 5.Sub Emitters:(子粒子发射器)

  • 6.Texture Sheet Animation(序列帧动画)

  • 7.Renderer:(渲染组件,也就是渲染粒子的材质球)

  • 上两节基础课的衔接:

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:粒子碰撞的有效半径。  如图:Collision Quality (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:渲染出来的粒子具有立体效果。可以提高物体的体积感。

在这里插入图片描述


作者:不动明王
链接:https://juejin.cn/post/7031073592213241869


文章分类
代码人生
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐