Version: 2017.2
简单爆炸
粒子系统顶点流和标准着色器支持

车辆的排气烟雾

汽车和许多其他车辆在将燃料转化为动力时会产生排气烟雾。可以使用粒子系统为车辆添加排气效果以作为巧妙的点睛之笔。

由粒子系统生成的排气效果
由粒子系统生成的排气效果

粒子的时间轴

排气烟雾从管道中快速排出,但随后与大气接触时会迅速减慢速度。在减速过程中,排气烟雾会扩散,变得稀薄,很快消散在空气中。由于排气温度很高,当它通过周围较冷的空气时,还会略微上升。

排气烟雾的粒子在开始时不得超过管道宽度,但随后会在其短暂的生命周期内显著增大。它通常在开始时为部分透明状态,随后与空气混合后逐渐淡化至完全透明状态。在动态性方面,粒子将以相当快的速度发射,但随后迅速减速,并还会略微上升。

实现

Shape 模块中,选择 Cone 形状并将其 Angle 属性设置为零;在这种情况下,“锥体 (Cone)”实际上是圆柱形管。该管道的 Radius 自然取决于车辆的大小,但通常可通过将 Scene 视图中的半径辅助图标与车辆模型相匹配来设置值(例如,车辆模型通常在尾部有排气管或孔,可与其大小进行匹配)。半径实际上在很大程度上决定了属性设置的选择,例如粒子大小和发射速率。在本示例中,假设车辆遵循 Unity 的标准尺寸惯例,即一个世界单位为一米;因此,半径设定为约 0.05 或 5cm。

标准资源中的 Smoke4 材质提供了烟雾粒子的合适图形。如果尚未安装这些资源,请从菜单中选择 Assets > Import Package > Particles。然后,选择粒子系统的 Renderer 模块,并将 Material 属性设置为 Smoke4

五秒的默认生命周期通常对于汽车尾气而言太长,因此应打开粒子系统模块(其名称与游戏对象相同,例如“Exhaust”),并将 Start Lifetime 设置为大约 2.5 秒。同样在此模块中,将 Simulation Space 设置为 World_,并将 Gravity Modifier_ 设置为较小的负值,例如约 –0.1。通过使用世界模拟空间,即使车辆移动,烟雾也可停留在产生烟雾的位置。负重力效应导致烟雾粒子上升,使它们看起来好像是由热气体组成的。一个很好的额外做法是使用 Start Rotation 旁边的小菜单箭头选择 Random Between Two Constants 选项。将两个值分别设置为 0 和 360,烟雾粒子将在发射时随机旋转。大量排列方式相同的粒子看起来非常显眼,并会降低随机无形烟雾痕迹的效果。

在此阶段,烟雾粒子开始看起来很逼真了,而且默认的发射速率会产生很好的发动机“嚓嘎声”效果。然而,烟雾并没有向外翻腾并消散。打开 Color Over Lifetime 模块,然后单击渐变右端的顶部渐变色标(此控件将控制颜色的“Alpha”值透明度)。将 Alpha 值设置为零,应该会看到场景中的烟雾粒子渐渐消失。根据发动机的洁净程度,可能还希望在开始时减小渐变的 Alpha 值;浓烟往往表示脏污、低效的燃烧物。

除了淡化外,烟雾在逃逸时还应该增大,可以使用 Size Over Lifetime 模块轻松创建这种效果。打开此模块,选择曲线并滑动左端的曲线控制柄,使粒子以最大大小的一个比例开始发射。选择的确切大小取决于排气管的大小,但略大于管道的值会产生良好的气体飘散效果。(发射与管道相同大小的粒子表明气体通过管道保持形状,虽然气体没有确定的形状。)在 Scene 视图中使用粒子系统的模拟功能可获得烟良好的雾外观视觉效果。此外,如果烟雾消散程度达不到期望的效果,可在此时增大粒子系统模块中的 Start Size

最后,烟雾在消散过程中也会减慢速度。实现这一目标的一种简单方法是使用 Force Over Lifetime 模块。打开此模块,将 Space 选项设置为 _Local_,并将力的 Z 分量设置为负值,以指示粒子被力推回(系统沿对象的局部空间中的正 Z 方向发射粒子)。如果其他参数已按上述方式设置,则此处约 –0.75 的值对于系统便会非常有效。

用途

可以将排气粒子系统放置在主车辆的子对象上。对于简单游戏,可仅启用 Play On AwakeLooping 属性,然后让系统运行。但是,在大多数情况下,可能希望至少在车辆移动时改变粒子发射速率。这样做首先是为了真实性(即,发动机工作强度提高时产生更多烟雾),但也有助于防止烟雾粒子在车辆移动时散开。如果快速移动的车辆的发射速率太低,看起来会产生明显的“一股股”烟雾,而这是非常不真实的。

可以通过脚本轻易改变发射速率。如果脚本中有一个表示发动机转速或车辆速度的变量,则可简单地将该值乘以一个常量,然后将结果分配给 ParticleSystem 的 emissionRate 属性。

    // C#

        using UnityEngine;
        using System.Collections;

        public class PartScriptTestCS : MonoBehaviour {

            public float engineRevs;
            public float exhaustRate;

            ParticleSystem exhaust;


            void Start () {
                exhaust = GetComponent<ParticleSystem>();
            }
    

            void Update () {
                exhaust.emissionRate = engineRevs * exhaustRate;
            }

        }



        // JS

        var engineRevs: float;
        var exhaustRate: float;

        var exhaust: ParticleSystem;


        function Start() {
            exhaust = GetComponent.<ParticleSystem>();
        }


        function Update () {
            exhaust.emissionRate = engineRevs * exhaustRate;
        }

思路拓展

基本方案可产生相当逼真的排气烟雾效果,但可以注意到,当改变参数时,发动机的“特性”会发生变化。调整不当、效率低下的发动机往往不能完全燃烧燃料,因此会导致浓黑的烟雾在空气中持续弥漫很长时间。这种效果对于老旧的农用拖拉机来说是完美的,但对于高性能的跑车则不行。对于“洁净”的发动机,应使用较小的值来表示粒子的生命周期、不透明度和大小增加量。对于“脏”发动机,应增大这些值,可能还要使用 Emission 模块的 Bursts 属性来创建发动机噗噗声效果。

简单爆炸
粒子系统顶点流和标准着色器支持