汽车和许多其他车辆在将燃料转化为动力时会产生排气烟雾。可以使用 Unity 的内置粒子系统为车辆添加排气烟雾以作为巧妙的点睛之笔。
排气烟雾从排气管道中快速排出,但随后与大气接触时会迅速减慢速度。在减速过程中,排气烟雾会扩散,变得稀薄,然后最终消散在空气中。由于排气温度很高,当它通过周围较冷的空气时,还会略微上升。由于这些因素,为了产生逼真的效果,排气烟雾的粒子在其生命周期中应遵循以下规则:
首先,将 Shape 设置为 Cone,将 Angle 属性设置为 0。由此创建的“锥体”(Cone) 实际上是圆柱形管。
接下来,对于 Radius 属性,该值取决于车辆排气管的尺寸。要确保与车辆模型的排气管匹配,最简单的方法是在 Scene 视图中使用半径辅助图标。半径在很大程度上决定了属性设置的选择,例如粒子大小和发射速率。本示例假设车辆遵循 Unity 的标准尺寸惯例,即一个世界单位等于一米;因此,半径大约为 0.05 米或 5cm。
对于烟雾的视觉效果,Unity 的标准资源 (Standard Assets) 包中包含适合烟雾粒子的图形。如果还没有安装这些资源,请参阅标准资源 (Standard Assets)。
安装这个包后,请找到 Renderer 模块,并将 Material 属性设置为 StandardAssets/ParticleSystems/Materials 文件夹中的 ParticleSmoke 材质之一。要产生浓烟,请使用 ParticleSmokeBlack,要产生淡烟,请使用 ParticleSmokeWhite。
五秒钟的默认生命周期对于汽车尾气而言通常太长。要更改此值以及其他常规模拟属性,请打开主模块。这是 Particle System 组件顶部的模块,其名称与游戏对象相同。 在此模块中: 将 Start Lifetime 设置为 2.5 秒。 将 Simulation Space 设置为 World。通过使用世界模拟空间,即使车辆移动,烟雾也可停留在产生烟雾的位置。 将 Gravity Modifier 设置为较小的负值。本示例使用 –0.1。负重力效应会导致烟雾粒子上升,使它们看起来好像是由热气体组成的。 最后,单击 Start Rotation 旁边的小菜单箭头,然后选择 Random Between Two Constants。将两个值分别设置为 0 和 360。这会导致烟雾粒子在生成时随机旋转。大量排列方式相同的粒子看起来非常显眼,并会降低随机无形烟雾痕迹的效果。
在此阶段,烟雾粒子开始看起来很逼真了,而且默认的发射速率会产生很好的发动机“嚓嘎声”效果。接下来要做的是让烟雾逐渐消散。为此,请执行以下操作: 启用并打开 Color Over Lifetime 模块。 单击 Color 属性的拾色器。 在 Gradient Editor 窗口中,单击渐变右侧的上止点,然后将 Alpha 设置为 0。上止点控制的是 Alpha,下止点则控制的是颜色。现在应该会看到烟雾粒子在场景中淡出。根据发动机的洁净程度,您可能希望在开始时减小渐变的 Alpha 值;浓烟往往表示脏污、低效的燃烧物。
除淡化外,烟雾的大小也应增加。为此,请执行以下操作: 启用并打开 Size Over Lifetime 模块。 单击 Size 曲线,然后在 Inspector 底部的曲线编辑器中,垂直移动左侧的控制柄,使粒子以完整大小的某一比例开始出现。选择的确切大小取决于排气管的大小,但略大于管道的值会产生良好的气体飘散效果。 最后,在 Scene 视图中使用粒子系统的模拟功能可获得出色的烟雾外观视觉效果。如果烟雾消散程度达不到期望的效果,可能需要在主模块中更改 Start Size 选项。
最后,烟雾在消散过程中也会减慢速度。为此,请执行以下操作: 启用并打开 Force over Lifetime 模块。 将 Space 设置为Local。 将力的 Z 分量设置为负值,以指示力应推回粒子(系统沿对象的本地空间中的正 Z 方向发射粒子)。本示例使用值 –0.75,因为该值对于以上设置的属性效果很好。
在定位了排气粒子系统之后,首先,将此粒子系统设为主车辆的子游戏对象。这样会使粒子系统随车辆一起移动。对于只需要效果即可运行的简单应用程序(无变化),可以启用 Play On Awake 和 Looping 属性。但是,有时可能希望在车辆移动时让某些属性(比如发射速率)发生变化。更改发射速率将有助于确保真实性,因为发动机工作强度提高时产生更多烟雾,但也有助于防止烟雾粒子在车辆移动时散开。如果快速移动的车辆的发射速率太低,看起来会产生明显的“一股股”烟雾,而这是非常不真实的。
可以通过脚本轻易改变发射速率。如果脚本中有一个表示发动机转速或车辆速度的变量,则可简单地将该值乘以一个常量,然后将结果分配给 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;
}
}
基本方案可产生相当逼真的排气烟雾效果,但可以注意到,当改变粒子系统的属性时,发动机的“特性”会发生变化。调整不当、效率低下的发动机往往不能完全燃烧燃料,因此会导致浓黑的烟雾在空气中持续弥漫很长时间。这种效果对于老旧的农用拖拉机来说是完美的,但对于高性能的跑车则不行。对于“洁净”的发动机,请使用较小的值来表示粒子的生命周期、不透明度和大小增加量。对于“脏”发动机,应增大这些值,可能还要使用 Emission 模块的 Bursts 属性来创建发动机噗噗声效果。