使用Unity粒子系统放烟花

1.前言

本博客是中山大学3D游戏编程与设计大作业

2.作业要求

1.按参考资源要求,制作一个粒子系统

2.使用3.3节介绍,用代码控制使之在不同场景下效果不一样。

3.用到的资源

3.1 基础资源,主要用于烟花弹的外观以及烟花弹爆炸后产生的烟雾。

3.2地图资源,从assets store中下载的免费资源,让最后展示烟花效果更好看。

4.制作过程

4.1 烟花弹的制作

要制作烟花,需要先制作烟花爆炸前的烟花炮弹。

首先在场景中添加一个粒子系统,然后将该粒子系统transform的rotation设置为(-90,0,0),这样粒子系统就会向上发送粒子。

然后设置该粒子系统的基础设置,首先把Start Size和Start Speed等设置为合适的值,而Start Lifetime为粒子的存活时间,这里设置为Random Between Two Constants,规定为2-4之间的随机数,这样烟花就会在发射后不同时间爆炸,同时将Gravity Modifier设置为0.3,这样烟花发射后就有抛物线的弧度。

将粒子系统的粒子发射速率设置为1。

将粒子系统的发射半径设置为0.01,发射角度规定为35°以内,这样看起来就有个漏斗形状,更符合烟花弹发射的效果。

                                           shape设置

                    粒子系统形状效果

勾选Size over Lifetime,设置粒子的大小随时间而改变,这样烟花弹就有一个忽明忽暗的效果,更加逼真,如图所示。

再把基础资源中的火焰材料拖到粒子系统的Renderer中的material中,让烟花弹更加好看。

 

烟花弹效果如下,可以看到烟花弹忽大忽小。

4.2烟花弹拖尾制作

为了让烟花弹的效果更加逼真,给烟花弹添加一个拖尾效果。勾选Sub Emitters,并添加一个子发射器命名为tail。

设置tail的基础设置,拖尾粒子的存活时间应该比较短,设置为1-2之间的随机值,大小也比较小,设置为0.5,并且也需要添加重力效果,设置为0.2。

将tail粒子的形状设置为球形,并将半径设置为0.003。

为了使拖尾效果更加炫酷,需要勾选Color over Lifetime,使得粒子颜色随时间的变化而改变。

同时为了拖尾粒子消失不那么突兀,勾选Size over Lifetime,使得粒子大小随着时间推移变小,最终消失。

拉长粒子,设置Speed Scale为0.15,Length Scale为2,这样粒子就会边长,让拖尾效果更加逼真。

为了使拖尾效果更加明显,给tail添加一个子发射器tails'tail,该子发射器设置与tail大同小异,这里不再详细介绍。

 烟花弹拖尾最终效果如下所示

4.3 增加烟雾效果

拖尾效果做完,我们还需要增加烟花爆炸的效果,在这之前我们先添加一个爆炸时产生的烟雾效果。首先我们要在烟花弹的Sub Emitters添加一个子发射器smoke,在death时触发。

然后设置smoke的属性,首先也要设置基本设置,其中值得关注的是Start Size设置为40-70之间的随机值,这是因为烟雾大小不是一定的,而Start Rotation设置为0°-180°之间的随机值,这是为了让烟雾看起来每一次都不一样。

 然后再设置Emission,由于每次爆炸烟雾只要出现一次就行,所以设置为只进行一轮爆炸且爆炸只产生一个粒子。

然后再设置Size over Lifetime,设置烟雾大小随时间变大,这样就有烟雾扩散的效果。

  

 最后选择一个烟雾材料并拖动到Renderer的material中,这里用的是3.1中说到的资源中的烟雾(选中的那个烟雾)。

 最终烟雾效果如下所示(为了使效果更加明显这里把背景调回了默认背景)

4.4 增加烟花爆炸的效果

在smoke上增加三个子发射器,在烟雾产生的时候这三个子发射器也同时发射粒子,这三个发射器分别发射红色,蓝色,绿色粒子,这样能让烟花更加好看。

这里只详细介绍红色的子发射器,其他颜色的发射器只是颜色不同,其他都一样。

首先设置基本设置,每个烟花粒子的存活时间,初始速度,大小都不同,所以都设置为两个常数之间的随机值。颜色设置为红色,重力设置为0.2。

 

 设置Emission,由于烟花每次爆炸都会产生大量粒子,且粒子的数量不定,所以就将粒子数量设置在700-900之间。

 设置Size over Lifetime ,让粒子大小随时间变小,营造烟花逐渐熄灭的效果。

 最后跟拖尾效果一样,为了让爆炸更加炫酷,再添加一个子发射器redflame,设置与父发射器相似,只是把粒子大小调小了一些。

 添加了三个不同颜色的子发射器后效果如下(这里为了使效果更明显,将烟花弹发射速率调为原来的3倍)

 4.5 控制脚本

编写一个含两个按钮的脚本,两个按钮分别使烟花发射开始和暂停。编写完将脚本挂载在空物体上,然后将粒子系统拖到该脚本上即可控制粒子系统。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class mono1 : MonoBehaviour
{
    public ParticleSystem particleObject1; 
    public GUIStyle buttonstyle;
    string str="";
    void OnGUI(){
        if (GUI.Button (new Rect (0,Screen.height-55,55,55), "放烟火")) {
            particleObject1.Play();   
        }
        if (GUI.Button (new Rect (55,Screen.height-55,80,55), "停止烟火")) {
            particleObject1.Stop();
        }
    }

    // Start is called before the first frame update
    void Start()
    {
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

添加后效果如下(记得把粒子系统的play on awake取消勾选,这样烟花就会等按下按钮之后才开始放)

5. 应用到场景

将制作完的烟花应用到3.2中下载的资源场景中。

因为这里有六个粒子系统,需要稍微修改下脚本代码,如下。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class mono2 : MonoBehaviour
{
    public ParticleSystem particleObject1; 
    public ParticleSystem particleObject2;
    public ParticleSystem particleObject3;  
    public ParticleSystem particleObject4;  
    public ParticleSystem particleObject5;  
    public ParticleSystem particleObject6;  
    public GUIStyle buttonstyle;
    void OnGUI(){
        if (GUI.Button (new Rect (0,Screen.height-55,55,55), "放烟火")) {
            particleObject1.Play();
            particleObject2.Play();
            particleObject3.Play();
            particleObject4.Play();
            particleObject5.Play();
            particleObject6.Play();
        }
        if (GUI.Button (new Rect (55,Screen.height-55,80,55), "停止烟火")) {
            particleObject1.Stop();
            particleObject2.Stop();
            particleObject3.Stop();
            particleObject4.Stop();
            particleObject5.Stop();
            particleObject6.Stop();
        }
    }

    // Start is called before the first frame update
    void Start()
    {
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

最终结果如下。

6.代码下载 

代码仓库 将代码下载后替代掉原来的assets文件夹,然后打开myscene->Scene->flamescene,运行即可。

7.演示视频

演示视频

猜你喜欢

转载自blog.csdn.net/weixin_52801288/article/details/128541769