Advertisement

unity3D烟花制作-来放烟花吧!

阅读量:

3D游戏第八次作业-烟花粒子效果实现

结果展示

先来个结果镇楼

下面是一个动画演示:

最终呈现效果

本次项目使用的资源:

《Unity Particle Pack》: 采用了火焰01号以及 twinkling 等 材料,并包含丰富实例

粒子效果制作

我们的烟花分为以下5个部分组成:

其中,
Firework主体可被视为一个包含5个独立功能模块的整体,
这些功能模块各自负责特定的功能操作。
通过调用 Sub Emitters 网络节点,
我们可以实现主粒体与相应子组件之间的高效交互。
实际上,
" Firework主体仅负责主粒体运动轨迹的设计与实现。
而具体而言,
" Firework主体仅负责主粒体运动轨迹的设计与实现。
" 具体而言,
" Firework主体仅负责主粒体运动轨迹的设计与实现。
" 而具体的渲染效果则由五个子组件独立完成。

我们将从各子组件的开发工作起步,在Firework平台中逐步整合所有粒子效果展示

trail子部件

即我们的烟花在爆炸之前飞行过程中产生的尾迹:

我们观察到,在运动过程中的尾迹中粒子经历了动态变化

  • size:粒子的大小经历了由小到大的增长阶段后再逐渐缩小;
  • color:颜色呈现出随时间演变的独特特征;
  • velocity:粒子从产生时开始向四周扩散形成逐渐扩大的尾迹;

那么我们如何创建这样一个trail粒子效果呢?

生成 named particle trail: 单击菜单中的 Right KeyEffectsParticle System 生成一个新的粒子系统,并为它起名为 trail

动态调节粒子尺寸:打开trail的粒子系统设置界面,在工具栏中找到并勾选[Size Over Lifetime]选项。随后,在界面下方绘制粒子大小随运动时间变化的趋势图以完成参数设置

通过我们设计的独特曲线图谱(图表),我们得以揭示了our trail发射出粒子大小的变化规律:该曲线呈现出以下特征性演变模式——逐渐增大→维持恒定→逐渐减小→突然放大→突然缩小。特别地,在最后一段中观察到一次快速放大紧接着快速缩小的现象是为了模拟微粒灰烬产生的闪烁效果。

配置粒子颜色动态变化: 进入trail的粒子系统面板并启用color over lifetime选项。请根据需求设置以下颜色参数:

该段文字呈现类似橙红色的色调,并与动态变化的最后一部分瞬间效果融合,从而呈现粒子灰烬般的闪动效果。

在Trail的粒子系统中配置粒子运动参数:首先,在 trail 的粒子系统面板中打开设置界面;其次,在界面中找到 Velocity over lifetime 选项并勾选;最后,在速度变化方式的选择框中将 Velocity over lifetime 设置为 Random between two curves

然后令x轴和z轴方向上的速度变化曲线如下:

而y轴方向上的速度变化不要改变,一直保持为0即可。

这样,在尾迹粒子被生成后会无规则地向四周延伸开来,并导致尾迹覆盖面积扩大以模拟烟雾的效果

配置粒子发射方向,请依次进行以下操作:首先,在trail软件中打开粒子系统设置界面;其次,在界面中找到并勾选[Shape]参数;接着,在其下拉菜单中选择[ sphere ]选项;这样可以使粒子在生成时均匀分布在烟花周围,并避免直接从烟花尾部垂直发散以达到更加真实的效果

设置Emission和粒子系统主模板

twinkle子部件

发光子组件在烟花爆炸发生时发出短暂的闪烁光芒,并模仿烟花爆炸瞬间产生的视觉效果。

从这段动画演示中观察到,在这一系列的变化过程中, 粒子从较小规模开始逐渐扩大, 接着突然缩小, 并在此过程中呈现出轻微的旋转运动. 这一变化现象被我们观察到, 并由此启发了我们对粒子系统设计的重要思考.

步骤:

生成一个名为twinkle的新粒子系统。首先点击右键菜单中的Effect选项,在下拉菜单中选择Particle System来创建一个新的粒子系统。接着为这个新生成的粒子系统命名为Twinkle。

生成一个名为twinkle的新粒子系统。首先点击右键菜单中的Effect选项,在下拉菜单中选择Particle System来创建一个新的粒子系统。接着为这个新生成的粒子系统命名为Twinkle。

请配置粒子渲染图片属性为Twinkle。请在 Render 选项卡中点击“参数设置”按钮,在材料类型下选择Twinkle作为材质。

为使粒子大小动态变化

开启动态旋转效果:在Twinkle的粒子系统界面中找到并选择参数设置项"Lifetime rotation effect"即可完成配置;无需进行额外的配置或调整。

设置Emission和粒子系统主模板

在这里

Explore子部件

即烟花爆炸的时候产生的球型光雨:

在图中,我们可以看到球型光雨的运动特性:

  • size:类似于 trail 的粒子,在变化时逐渐变大和缩小两次完整的周期以模仿灰烬的闪烁效果;
    • color:与 size 相似的是 color 的变化模式;
    • 发射方向:所有粒子以球形向外辐射;

根据以上效果,我们就可以开始我们的设计;

步骤:

Generate an instance of the Particle System under Effects, then name it Explore.

size over lifetime

在explore的粒子系统设置界面中打开【size over lifetime

基本上和trail的粒子的size变化一样;

在explore的粒子系统面板中,在color over lifetime 选项前打钩,并按照以下方式设定颜色:将红色、绿色、蓝色按顺序循环使用。确保每个粒子在整个生命周期内都能保持动态色彩变化以实现平滑渐变效果。

与 trail 的流程几乎完全相同,仅在色彩选择上存在细微差别.你可以根据个人偏好设置 preferred gradient motion.

请设置粒子发射的方向:首先打开explore中的粒子系统面板。然后勾选带有Shape属性的选项,并将形状参数设置为sphere。这样就能形成均匀分布,并朝着上下左右四个方向扩展。需要注意的是,在trail效果中没有呈现球形分布的原因在于我们在trail参数中选择了带有Velocity over lifetime效果的选项,并在此基础上增加了四周扩散的因素

设置Emission和粒子系统主模板

同样地,在爆炸发生时才会生成球型光雨。我们的要求是,在时间上考虑效率的情况下(或为了效率),我们将其设置为零。相比之下,在这种模式下(或在这种模式中),我们选择使用Bursts模式来实现高效的粒子释放效果。与twinkle不同,在每次生成时会释放大量粒子,并且count的数量设置为1,000(即每个爆炸都会发射1,

Fire samll子部件

即我们飞行中的烟花:

从烟花的飞行过程中我们可以看出:

  • 在飞行过程中出现尾部抖动的现象;
    • 烟花其本质是一个动态过程,呈现出火焰从产生到消逝的过程;

根据这些,我们开始我们的制作:

生成小型火焰:

将粒子的渲染图像设定为Flame 01:在Fire small的粒子系统面板中选择 Render 选项,并将其材质参数更新至Flame 01。

复制代码
* Flame 01为一组火焰的图片;

启动动画效果:在Fire small的粒子系统界面中找到并启动Texture sheet animation选项;随后按照以下步骤配置:

其中Mode被设置为Grid模式,默认情况下无需更改。
在Tiles布局中设置为x=7, y=7时,则表示将Flame 01图像分割成一个由49个相等大小的小块构成的网格。
每个小块对应一帧动画画面。
整个动画序列从初始状态(即第一帧)逐步过渡到最终状态(即第49帧)。
其余所有参数均采用默认设置即可;
这样一来,在运行后会生成一个动态变化的粒子群。

配置粒子发射方向: 在Fire small的粒子系统面板中找到并勾选'Shape'选项。将形状设为cone形,并选择从锥体底部或顶端发射。设置具体如下:

其中:

  • Angle:发射粒子所在平面即为Angle所指之轴对称平面,并定义其相对于该平面对张角的角度参数为Angle值(当Angle值为0时,则与该平面对张角相同)。值得注意的是,在Fire small中所使用的锥体形状呈现圆柱形特征。
  • Radius:该圆锥体底部圆形截面上任一点至中心轴线的距离的一半长度被称为Radius。

建议其他参数保持默认设置即可;但由于锥体的上底面原本的方向并非直接指向下方的原因,则需要对粒子系统执行旋转变换,请参考Fire small的transform定义:

设置粒子的抖动:观察到烟火在运动时不断发生抖动。这一现象是为了模仿烟花飞行时因气流影响火焰产生的振荡效果。操作方法是只需勾选带有 Noise 标记的选项即可完成设置。

配置粒子颜色动态变化: 在Fire small的粒子系统面板中打开"Color Over Lifetime"选项,并配置颜色如下: 红、绿、蓝;黄、品红。

由于原图片在动态展示时存在较大的闪烁效果,在后续的动画播放中将所有动画的透明度统一设置为1

设置Emission和粒子系统主模板

在Fire small中的Emission方面,在采用Rate_{over~Distance}之前,并未采用 Rate_{over~time} 或 Burst 这两种方法。 Rate_{over~Distance} 指的是每单位移动距离所发射出的数量。换句话说,在这种情况下我们的 Fire small 仅会在运动过程中才会释放出粒子

Explore2子部件

即四散的光雨效果:

看到我们的Explore2其实就是一些颗粒呈放射状排列,并且每一个颗粒都携带了我们之前制造好的tail轨迹(trails)。从实现的角度来看并不复杂,并且tail部分基本上与我们之前所做的tails基本相同,在粒径大小以及发射颗粒的数量等因素上有细微差别,并且这些细节会在后面进行说明。主要的工作还是围绕Explore2这一部分进行设计

同样的开始

为项目创建一个命名为Explore2的粒子系统,在菜单栏中选择【

将粒子渲染图设置为Twinkle风格:在Explore2的粒子系统界面中打开 Render 选项,并进入 Render 选项卡后将material属性设置为Twinkle。其中部分材质可直接复用现有Twinkle材质;

请在软件中打开Explore2的粒子系统面板,并勾选Shape选项。随后,请选择形状为sphere,并以球型发射粒子。其他设置无需更改;

配置粒子动态旋转:

配置粒子动态旋转:

请进入Explore2软件中的粒子系统配置界面,请在该界面中找到并勾选右侧弹出窗口中的 Velocity over lifetime 参数项进行配置。具体设置步骤如下:

我们主要仅对选项内容进行微调,并且仅对speed Modifier这一项进行调整。该参数决定了粒子运动的速度。爆炸时以较快的速度爆发,在随后迅速减速,并且随后又缓慢减速的过程当中,因此我们需要在speed Modifier中体现出这种速度变化规律;

将粒子系统的重力功能启用,并选择带有Force over lifetime标记的选项。随后,在爆炸事件发生后向下坠落至地面位置之前将其合力减少到零,并将z轴方向上的合力设置为-20单位以实现对粒子施加竖直向下的拉扯力量从而实现对 particles 在爆炸事件发生后向下坠落至地面位置的同时保持其整体轨迹稳定运行的目的

设置trail: 为了赋予每个粒子独立的尾迹,在Explore2的粒子系统面板中打开子部件管理器并勾选 子_emitter_选项。将一个已完成的trail组件添加至Explore2中,并将其设为该父粒子系统的子部件。随后,在rail属性设置界面下配置rail的相关参数设置为父参数值乘以0.5即可实现rail与parent之间的比例缩放效果。

配置trail在Explore2 Birth事件启动时同步配置,并将其粒子效果集成到每个Explore2粒子中以生成轨迹;

设置Emission和粒子系统主模板

trail的改动:

  • 主界面中的起始大小设置为 start\_size = 1 调整至 start\_size = 2
  • 主界面中的最大粒子数调整为 max\_particles = 3
  • Emission 中的时间速率设置为 rate\_over\_time = 4 调整至 rate\_over\_time = 5

Firework主体

Firework主体的作用仅限于为烟花提供动力运动。因此不会生成任何粒子。各种粒子效果将由上文所述的各个组件部分完成。

步骤:

生成 Firework 效果:单击右键,在 Effects 选项中选择 Particle System ,然后启动一个新粒子系统,并将其命名为 Firework。

将以上创建成功的组件按照开篇的组成加入到Firework中。

指定粒子发射的方向:进入Firework的粒子系统设置界面,在形状选项中选择Box型作为发射形状,并将其设置为正方形以实现方块状的射出效果;由于Box类型的默认射出方向指向z轴正方向,请对Firework模型进行适当旋转以适应不同场景的需求

Firework的粒子被配置为非渲染状态

请设置子粒子系统:类似于Explore2的操作流程,在此界面中找到并勾选 Sub Emitters 选项。接下来,请将Firework的所有子粒子系统包含进去,并按照以下步骤进行配置。

在已经介绍过的Birth阶段之外,在粒子完成消亡过程时才会触发的事件中可以看出:当粒子完成消亡过程时(即死亡事件触发时),我们的Twinkle、Explore以及Explore2这三个效果将会同时呈现出来;这种现象表现为烟花以爆炸的方式绽放;

设置Emission和粒子系统主模板

最终的效果:

制作放烟花场景:

代码:

复制代码
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class FireFirework : MonoBehaviour
    {
    // Start is called before the first frame update
    public ParticleSystem[] firework;
    public ParticleSystem.Particle[] m_Particles;
    void Start()
    {
        GameObject[] temp;
        // 获取场景中所有的Firework,即烟花发射器;
        temp = GameObject.FindGameObjectsWithTag("firework");
        firework = new ParticleSystem[temp.Length];
        Debug.Log(temp.Length);
        // 将烟花发射器赋予firework数组;
        for(int i = 0; i < temp.Length; ++i)
        {
            firework[i] = temp[i].GetComponent<ParticleSystem>();
            firework[i].Stop();
        }
        if (m_Particles == null)
        {
            m_Particles = new ParticleSystem.Particle[firework[0].main.maxParticles];
        }
    }
    
    // Update is called once per frame
    [System.Obsolete]
    void Update()
    {       
        if (Input.GetButtonDown("Fire1"))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//从摄像机发出到点击坐标的射线  
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit)) {
                
                // 在随机选择场景中的一个Firework;
                int id = Random.Range(0, firework.Length);
                // 利用该Firework发射一个粒子,即烟花;
                firework[id].Emit(1);
                // 获取场景中属于firework[id]的运行中的粒子;
                int count = firework[id].GetParticles(m_Particles);
                // 根据鼠标点击位置计算烟花的飞行时间;
                float life_time = (hit.point.y - gameObject.transform.position.y) / firework[id].startSpeed;
                // 根据鼠标点击位置和烟花飞行时间计算烟花的水平速度;
                float x_v = (hit.point.x - gameObject.transform.position.x)/life_time;
                // 设置刚刚发射的粒子的飞行时间;
                m_Particles[count - 1].lifetime = life_time;
                // 设置刚刚发射的粒子的速度;
                m_Particles[count - 1].velocity = new Vector3(x_v, m_Particles[count - 1].velocity.y, m_Particles[count - 1].velocity.z);
                // 将改动应用到场景中;
                firework[id].SetParticles(m_Particles,count);
            }
        }
    }
    }

在场景中布置了四个不同颜色的 Firework。每个 Firework 都具有独特的烟花色彩。每次发射时会从四个预设的发射装置中选择启动其中一个,并可设置其飞行持续时间和速度参数。以确保所有焰火按照预设路径准确触发爆炸。

以下是最终的效果展示:

最终效果演示

项目地址

项目入口

全部评论 (0)

还没有任何评论哟~