3D游戏编程大作业——粒子系统制作烟花

先将最终效果展示一下

最终效果图.gif

gif可能显示错误无法显示 可以跳转看视频
项目地址:endterm hw8 · 灬蔷薇绅士灬/3D - 码云 - 开源中国 (gitee.com)
演示视频地址:3d游戏编程期末作业-粒子系统制作烟花效果展示_哔哩哔哩_bilibili

首先我们先来了解一下粒子系统的各项数值。

(写在前面忘记了可以查)
Duration(持续):粒子发射的持续时间。值是秒。
Looping(循环):让粒子发射时间循环起来,一直发射粒子。
Prewarm(预热):开始播放粒子是已经是发射了一段时间的。只在looping循环时才有效。
Start Delay(开始延时):粒子系统创建后隔多久后才开始发射粒子。如果有Prewarm则没法设置延时。值是秒。
Constant(常量):固定的值,不会变化。
Curve(曲线):用曲线代表Duration时间内的变化。竖轴是这个值的变化、横轴是Duration时间。但注意的是初始的值,出生时的不同,一旦出生了,是其他值控制。
Random Between Two Constant(随机在两个常量间变化):随机值
Random Between Two Curve(随机在两个曲线间变化):随机曲线
Start Lifetime(初始生命):决定它将持续多少秒消失。
Start Speed(初始速度):运动快慢。它的单位是米/秒。(米是一格子的长度,并不是真的米,就是一个单位长度,说米是便于理解。)
3D Start Size(3D初始尺寸):可以让粒子在x、y、z三个轴上有不同的尺寸。当粒子是billboard模式时,z轴调节无意义。在粒子发是mesh且Render Alignment不朝摄像机时调节这个值,很有用。
Strat Size(初始尺寸):总体设置初始的尺寸。Xyz三轴同步大小。值米。
3D Start Rotation(3D初始旋转):粒子可以绕着XYZ三个设定不同的角度。
Start Rotation(初始旋转):默认是只设置z轴方向旋转角度。值是角度。
Flip Rotation (反跳旋转):主要针对设定的Start Rotation值进行反方向的变化。假如旋转是10。这个值设置为1,就会变成-10。设为0.5就会变成一个从-10~10的随机。
Start Color(初始颜色):出生时的颜色。
Gravity Modifier(重力修正器):粒子施加一个向下的力。负值是向上的。注意这个值是一个固定的值,他不随粒子系统缩放而改变。
Simulation Space(模拟空间):就是使用的空间坐标。粒子的运动所使用的空间坐标。
Simulation Speed(模拟速度):整体改变粒子的运动快慢,注意不只是粒子的速度。而是粒子总体属性,在空间位置中的变化,整体放慢或加快。
Delta Time(变量时间):Delta Time是一个函数。确切意思是上一帧的时间情况。因为设备刷新率的不同,所以一帧消耗的时间也是不一样的。这个Scaled是调节使用时间变化而非帧的变化。每帧走1米和每0.1秒走一米是不一样的。默认应该是Scaled(缩放的)是正确的。
Scaling Mode(缩放模式):缩放粒子系统时的状况。
Play On Awake(唤醒就播放):勾掉时,运行时出现粒子系统时并不会播放,直到在程序中够上这个勾,才会播放,便于程序控制。
Emitter Velocity(发射速率):是关于粒子移动方式。不太明白??transform能理解。Rigidbody啥含义?物理系统。
Max Particles(最大粒子数):为了节省开支设定粒子数量的上限。
Auto Random Seed(自动随机种子):粒子呈现的状态是由seed种子绝对的,相同的seed产生的结果是相同的。而seed数十分庞大,如果用了随机种子,你可能永远不会碰到数值一样,粒子状态一样的情况。
Random seed(任意种子):可以设置种子。Reseed(播种)可自动填写一个种子数。粒子不是每次产生的效果都是好看的,这里确保这个好看的粒子效果一直存在。
Stop Action(停止行动):当粒子系统发射完了所有粒子之后的程序的处理方式。跟消耗有关。

接下来我们开始制作烟花

最终完成后的Assets和对象如下:


Assets资源

游戏对象
1.先将天空盒设置成晚上,也可以添加一个黑色的Plane,以更好地展示烟花的效果
黑夜天空盒

只需要将天空盒Material中的Atmosphere Thickness拉低即可。


修改Atmosphere Thickness

添加一个Particle System 命名为Firework 开始修改面板属性

2.烟花直线飞升阶段 主体粒子系统Firework

基础属性如下:


基础属性

Looping需要关掉,因为我们之后会设置一个发射按钮,如果不关掉Looping粒子系统会自己循环
Start Lifetime:烟花存活时间,我们需要在烟花到达最高空的时候即速度刚好减为0的时候让粒子死亡,调整为1
Start Speed:烟花飞上高空时需要一个较大的初始速度,设置为200
Start Color 更改一下颜色
其余属性几乎没做更改,有需要再微调即可

Emmision如下:


Emmision

将Rate over Time设置为0,添加一个Bursts。因为每次点击按钮仅发射一个烟花,所以只需要将Count设置为0即可

Shape属性如下,修改例子发射区域的形状:


Shape

我们希望烟花是在一个锥形区域内随即发射,所以只需要将角度Angle设置为60,Shape设置为Cone即可

Limit Velocity over Lifetime如下,控制例子发射的速度变化:


Limit Velocity over Lifetime.png

类似于一个减速度。我们希望烟花飞到最高空爆炸前速度正好为0,故将Dampen设置为0.1即可

Trail属性如下,打开后可以显示粒子属性:


Trail

粒子轨迹不能显示全程,所以Lifetime要比粒子本身短,此处设置为0.5。
同时这里设置一个粒子轨迹颜色渐变,是的前端为黄色后端为红色
效果图:


拖尾轨迹效果图

Renderer属性如下:


Renderer

主要是给粒子系统添加两个Texture,分别为Lizi和Trail,代表粒子本身的闪亮材质与轨迹的材质。粒子本身的材质用unity自带的即可,而轨迹需要一个拖尾,因此需要用PS制作一个黑色背景闪亮半圆的tga文件拖入项目(如图所示),这样才可以形成一种拖尾的效果。

3.light灯光设置

需要先再Package Manager中添加Post Processing(unity自带),然后再Main Camera中添加这几个Component即可。我在这里只是将亮度调整的更亮一些而已,对粒子系统本身的运动轨迹无影响。


添加Post Processing
Main Camera添加两个组件
4.两个子粒子系统TrailBlow和DeathBlow

首先我们要知道,粒子系统有个属性叫Sub Emitters,它的作用就是使别的粒子系统附加在原有的粒子系统中。


Sub Emitters

我们设置了两个子粒子系统,TrailBlow即烟花在直线飞行途中沿着轨迹四散溅出的烟花,绑定在Birth上即粒子生成的过程中;DeathBlow即直线飞行到达顶端后爆开来的烟花,绑定在Death上即粒子死亡后。

首先我们来看TrailBlow。它其实是由Firework粒子系统复制而来。因为四散溅射的火花应该是不规律的,所以我们将初速度调小减速度和存在时间调整合适之后,我们把他的初速度设置成一个随机数,这样子会体现出随机效果。最重要的是,我们需要将TrailBlow的Shape设置成Sphere,这样粒子的运动轨迹会设置成一个球体,符合爆炸效果。属性如下:


TrailBlow属性

效果图:


TrailBlow效果图

然后是DeathBlow。DeathBlow实际上也是由Firework复制而来。它需要更改的数据也不多。
首先同样将Shape改成Sphere,设置一个合适的初速度和减速度(因为是轨迹空间是球体所以此处不需要随机数了)。它的轨迹材质我们设置的比竖直轨迹部分要细一点,具体看博客开头的Assets截图。
最重要的是,每次射出的粒子数我们需要在Emission中增加的多一点,同时设置一个合适的重力Gravity使其下坠,看起来更像烟花。属性如下:


DeathBlow属性1
DeathBlow属性2
DeathBlow属性3

效果如下:


DeathBlow效果图

5.制作一个简单的发射GUI
代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Shoot : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        var Firework = GetComponent<ParticleSystem>();
        Firework.Pause();//粒子系统在start之后默认运行一次,所以需要Pause掉它
    }

    // Update is called once per frame
    void Update()
    {
        
    }
    private void OnGUI()
    {
        if(GUI.Button(new Rect(5, 395, 100, 50), "发射"))//设置点击事件
        {
            var Firework = GetComponent<ParticleSystem>();
            Firework.Play();
        }
    }
}

效果图如下:


UI效果图

最终效果如下:


最终效果图.gif

gif可能显示错误无法显示 可以跳转视频观看

至此烟花就已制作完成
项目Assets地址:endterm hw8 · 灬蔷薇绅士灬/3D - 码云 - 开源中国 (gitee.com)
演示视频地址:3d游戏编程期末作业-粒子系统制作烟花效果展示_哔哩哔哩_bilibili

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容