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,运行即可。文章来源:https://www.toymoban.com/news/detail-481370.html
7.演示视频
演示视频文章来源地址https://www.toymoban.com/news/detail-481370.html
到了这里,关于使用Unity粒子系统放烟花的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!