期末作业——Unity粒子系统烟花
1 目标
粒子系统效果制作,必须带一个控制组件,控制粒子呈现效果。
本作业中完成的是使用粒子系统制作烟花效果,并且带一个控制组件。
2 烟花预设
烟花预设主要根据参考博客进行制作。将烟花粒子分为三个部分:
- 上升粒子Spindle:烟花上升阶段
- 伴随粒子Around:在烟花上升阶段伴随闪烁的粒子
- 爆炸粒子Blast:上升粒子达到最高后的爆炸效果
预设模块属性的设置与参考博客基本一致,因此不再重复。主要设置是将上升粒子的形状设置为锥形,并在上升粒子开始时添加子粒子系统伴随粒子,死亡时添加子粒子系统爆炸粒子。给上升粒子和爆炸粒子添加拖尾,适当添加重力修订。所有粒子系统都是unity基础属性设置完成的,没有使用其他资源。将摄像头的背景设置为深色。最终效果如下:

3 烟花频率控制
控制组件之一是烟花频率控制,可以通过对烟花预设的父粒子系统修改Emission模块的Rate over Time进行设定。在这里通过UGUI中的滑动条Slider进行控制。首先创建画布Canvas,在画布中添加一个空对象RateModifier,空对象中有滑动条Slider和文本Text。结构如下图:

其中,RateModifier锚点设置是top-right,Slider和Text的锚点设置是middle-center,这样能够保证文本和滑动条总是显示在画面右上角。效果如下:
对烟花频率的修改也很容易,根据滑动条的值线性增加。
public class RateController : MonoBehaviour
{
public Slider rateslider;
public ParticleSystem particlesystem;
public ParticleSystem.EmissionModule emisssion;
// Start is called before the first frame update
void Start()
{
rateslider = GameObject.Find("Canvas/RateModifier/Slider").GetComponent<Slider>();
}
// Update is called once per frame
void Update()
{
int app =(int) rateslider.value * 4;
emisssion.rateOverTime = 1+app;
}
}
4 烟花颜色控制
烟花颜色控制也是使用滑动条进行控制,与频率控制类似。不同的是颜色由RGB控制,需要使用三个滑动条。UI对象的放置与前面的类似,最后得到的面板如下:
控制颜色的脚本也较为简单,通过滑动条获取RGB值,再直接调用函数设定即可,这里改变的是爆炸粒子的颜色。
public class ColorModifier : MonoBehaviour
{
ParticleSystem blaster;
FirstSceneController fcon;
Slider r;
Slider g;
Slider b;
// Start is called before the first frame update
void Start()
{
fcon = SSDirector.getInstance().currentSceneController as FirstSceneController;
GameObject fa = fcon.psys.gameObject;
blaster = fa.transform.GetChild(1).GetComponent<ParticleSystem>();
// mainmu.startColor = new Color(0,1,0);
// Debug.Log("变成绿色");
r = GameObject.Find("Canvas/ColorModifier/r").GetComponent<Slider>();
g = GameObject.Find("Canvas/ColorModifier/g").GetComponent<Slider>();
b = GameObject.Find("Canvas/ColorModifier/b").GetComponent<Slider>();
}
// Update is called once per frame
void Update()
{
ParticleSystem.MainModule mainmu = blaster.main;
mainmu.startColor = new Color(r.value,g.value,b.value);
}
}
5 代码解析
主要涉及6个代码文件,ColorModifier.cs用于控制烟花颜色,RateController.cs用于控制发射频率,SSDirector.cs是导演类,Singleton.cs是单实例类,ISceneController.cs是场景控制器接口,FirstSceneController.cs是场景控制器。其UML图如下:
单实例类、导演类、场景控制器接口与之前作业的都类似,FirstSceneController控制场景中的各种逻辑,在Awake函数中加载资源并初始化各种属性,从而使得频率控制和颜色控制可以进行。
public class FirstSceneController : MonoBehaviour, ISceneController
{
GameObject pre;
public ParticleSystem psys;
RateController rateCon;
ColorModifier colmod;
void Awake(){
SSDirector director = SSDirector.getInstance();
director.currentSceneController = this;
gameObject.AddComponent<RateController>();
gameObject.AddComponent<ColorModifier>();
LoadResources();
}
public void LoadResources(){
rateCon = Singleton<RateController>.Instance;
colmod = Singleton<ColorModifier>.Instance;
pre = (GameObject)Resources.Load("Spindle");
pre = Instantiate(pre);
psys = pre.GetComponent<ParticleSystem>();
rateCon.particlesystem = psys;
rateCon.emisssion = psys.emission;
}
void Update(){
}
}
6 展示与链接
效果展示:
代码链接:https://gitee.com/k_co/final-firework
视频展示链接:https://www.bilibili.com/video/BV1jW4y1374Y/
参考链接:https://blog.youkuaiyun.com/m0_37602827/article/details/126576281