载具尾气

汽车和其他载具把燃油转换为动力时会排放废气。你可以使用粒子系统画龙点睛地为载具添加排气效果。

An exhaust generated by a particle system

粒子系统产生的排气效果

粒子的时间轴

废气烟雾从管道中快速排出,随后在与大气接触时迅速减慢移动速度。随着减慢,它向四周散开,并变得更加模糊,然后快速消散在空气中。因为废气是热的,所以在穿过周围的冷空气时会轻微地上浮。

废气烟雾粒子的初始大小不能大于排气管的宽度,但是在它短短的生命周期内,它的大小将大大增加。它通常从半透明开始,随着它与空气混合,将淡出到完全透明。至于动力学,粒子将非常快速地发射,然后快速减慢,并略微上浮。

实现

形状 Shape 模块中,选择 圆锥体 Cone 形状,并设置它的 角度 Angle 属性 为 0;这里的『圆锥体』实际上是圆柱形的管道。管道的 半径 Radius 取决于实际车辆的大小,不过,通常你可以在场景视图中,让半径线框与车辆模型相匹配(例如,汽车模型通常具有一个排气管,或是在后面有一个洞,从而你可以匹配排气管的大小)。半径实际上决定了很多属性的设置,例如粒子大小和发射率。在这个示例中,我们假设载具是一辆遵循 Unity 标准尺寸约定(1 单位等于 1 米)的汽车;因此设置半径为约 0.05 或 5 厘米。

标准资源提供的 Smoke4 材质很适合作为烟雾粒子的图形。如果尚未安装这些资源,那么从菜单中选择 Assets > Import Package > Particles。然后,进入粒子系统的 渲染器 Renderer 模块,设置 材质 MaterialSmoke4.

对于汽车尾气,默认的 5 秒生命周期通常太长了,因此你应该打开 Particle System 模块(与游戏对象同名,例如『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 值为 0,你应该在场景视图中看到烟雾粒子消失不见。根据发动机的清洁程序,你可能想要降低开始时的渐变透明度;厚重的、黑色的颜色暗示了肮脏的、低效的燃烧。

除了淡出,烟雾还应该在逃逸过程中增加大小,使用 随生命周期改变大小 Size Over Lifetime 模块可以很容易地创建这种效果。启用这个模块,选中曲线,滑动左端的曲线手柄,使粒子的初始大小为完整尺寸的一小部分。粒子的实际大小取决于排气管的大小,但是,比排气管稍大的值,可以创建更好的气体溢出效果。(如果粒子的初始大小与排气管相同,将暗示气体的形状被排气管所限制,但气体根本并没有固定的形状。)可以在场景视图中看到,粒子系统很好地模拟了烟雾的视觉效果。如果创建的烟雾扩散效果不符合预期,你可能还需要在粒子系统模块中增加 初始大小 Start Size

最后一个效果,烟雾将随着扩展而减慢速度。一个简单的实现方式是使用 随时间改变作用力 Force Over Lifetime 模块。启用这个模块,设置 空间 Space 选项为 本地 Local,设置作用力组件的 Z 为一个负值,表示粒子被作用力回推(系统沿着对象本地空间的正 Z 方向发射粒子)。如果按照前文所述设置其他参数,那么设置为约 –0.75,粒子系统将很好地运行。

用法

你可以将尾气粒子系统添加到载具的某个子对象上来定位它。对于简单的游戏,你可以开启 唤醒时播放 Play On Awake循环播放 Looping,让粒子系统开始运行。然而大多数情况下,你可能至少需要改变载具行驶时的发射率。这么做首先是为了真实性(例如,引擎在剧烈运转时将产生更多的烟雾),其次还可以避免烟雾粒子随着载具行驶而散开。一个快速移动的载具,如果发射率太低,将产生一股一股的烟雾,非常不真实。

通过脚本可以非常容易地改变发射率。如果脚本中的某个变量代表了引擎的转速或载具的速度,那么你可以简单地把它的值乘以一个常数,并把计算结果分配给粒子系统的 emissionRate 属性。

  1. // C#
  2. using UnityEngine;
  3. using System.Collections;
  4. public class PartScriptTestCS : MonoBehaviour {
  5. public float engineRevs;
  6. public float exhaustRate;
  7. ParticleSystem exhaust;
  8. void Start () {
  9. exhaust = GetComponent<ParticleSystem>();
  10. }
  11. void Update () {
  12. exhaust.emissionRate = engineRevs * exhaustRate;
  13. }
  14. }
  1. // JS
  2. var engineRevs: float;
  3. var exhaustRate: float;
  4. var exhaust: ParticleSystem;
  5. function Start() {
  6. exhaust = GetComponent.<ParticleSystem>();
  7. }
  8. function Update () {
  9. exhaust.emissionRate = engineRevs * exhaustRate;
  10. }

更进一步

基本方案创建了相当逼真的尾气效果,不过你可能已经注意到,引擎的『特性』随着参数的改变而改变。一个缺乏维护的、低效率的引擎将不完全地燃烧燃料,产生浓厚的、黑暗的烟雾,并长时间存在于空气中。这种效果很适合老旧的农用拖拉机,但是不适合高性能的运动跑车。对于清洁的发动机,你应该为粒子的生命周期、透明度和大小增量设置更小的值。对于『肮脏』的引擎,你应该增大这些值,可能还需要使用 发射 Emission 模块的 脉冲 Bursts 属性,来创建引擎噼啪响的效果。