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

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

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

在这里插入图片描述

好,差不多了,下一节我们开始实战。
另附上:

上两节基础课的衔接:

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

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值