小汽车等许多其它车辆在将燃料转化成动能的过程中都会排出尾气。你可以使用粒子系统来创建一个尾气排放的效果,作为一辆车的完美收尾。
![](https://i-blog.csdnimg.cn/blog_migrate/6351c8fb57661d756112f781c81b79d5.png#pic_center)
粒子的时间线
尾气非常快速地从尾气喷管中发出,在与大气接触的过程中速度会快速降低。随着速度降低,粒子会向四周扩散,变得非常微弱,不久就会消散在空中。因为排出的废气是热的,所以在周围空气较冷的环境中它还会缓慢上升。
尾气粒子在开始的时候大小一定不能超过发动机喷管的宽度,但是在短暂的生存期内,它可以适当地进行扩大。通常情况下,它在刚开始的时候是部分透明的,随着与周围空气混合它最终会完全透明并消失。考虑到动力学因素,粒子在起初会被快速发出随后缓慢减速,同样还会缓慢向上移动。
操作实现
在Shape模块中,选择Cone,并将其Angle属性设为0;Cone实际上是一个圆柱形的管道。管道的Radius设置取决于车辆的大小,但是通常可以通过在场景视图中匹配半径Gizmo来设置到车辆模型中(例如,在一个汽车模型的后面通常会有一个排气管或者一个洞,其大小可以自己调整)。半径实际上决定了很多的属性,比如说粒子大小和发射速率。为了实现本案例中的目标,我们设定模型就是一辆小汽车,它遵循一个世界单位就是一米的Unity标准单位转换规则;因此半径就被设为0.05或者5cm。参数设定如图2所示。
尾气粒子使用的材质是在标准组件中提供的Smoke4标准材质。如果你之前没有安装标准材质,就从菜单栏中选择Asset > Import Package > Particles,然后找到粒子系统的Render模块,设置Material属性为Smoke4。
(注:笔者在此处只是照文档进行翻译,但是笔者没有找到名为Smoke4的材质,所以采用了标准材质中的ParticleSmokeWhite材质进行替代,如图3所示。另外,在新版的Unity中并没有提供标准材质的安装包,自己可以到AssetStore中找到标准材质包进行下载和导入即可)
缺省的生命时间是5秒,通常这对于汽车尾气时间太长。因此需要打开Particle System模块,设置Start Lifetime约为2.5秒。同样在这个模块中,设置Simulation Space 为World,Gravity Modifier设为一个很小的负数,比如说-0.1。使用世界仿真空间可以使尾气即便是在车辆移动的时候也能够悬浮在产生烟雾的地方。负的重力效应会使得烟雾粒子上升,好像它们是由热气体组成的。使用Start Rotation旁边的小菜单箭头,并选择Random Between Two Constants。将两个值各自设置为0和360,烟雾粒子将会随着它们被发射而随机旋转。有许多排列一致的粒子是非常明显的,这会降低随机的、不成形的烟迹的效果。最终设置如图4所示。
在下面这个阶段,烟雾粒子将开始看起来更加真实,默认的粒子发射速率创造了非常棒的发动机引擎间歇工作(chugging)的效果。然而到现在来看尾气烟雾并没有向外翻腾和消散。打开Color OverLifeTime模块,点击梯度条的上端并将指针放到梯度条的最右边(这控制了颜色的透明度设定)。将alpha的值设为0,你将会发现烟雾粒子最终会消退不见。如图5所示。你也可能想要在开始时刻就减少alpha的值,这取决于汽车发动机的干净程度,黑色的烟雾通常表示发动机脏和燃烧不充分。
同消退一样,随着烟雾粒子的扩散,烟雾粒子也应该适当地增大,这种效果可以通过Size Over Lifetime进行设置。打开该模块,选中该曲线并滑动曲线的左端点,使粒子在开始时刻较小。大小的选择取决于尾气喷管的尺寸,比喷管尺寸稍大一些会产生很好的效果。(这是因为,如果将粒子在启动时刻的大小设成同尾气管道大小一样的话,就会表明尾气的外形是由管道设定的,但是,气体并没有一个特定的外形)。在场景视图中使用粒子系统仿真模块进行观察可以得到非常好的视觉效果。如果烟雾的分散达不到你想要的效果,可以在Partical System模块中增大Start Size的值。如图6所示。
最后,烟雾随着扩散,其速度也应该会降低。一种简单的方法是通过Force Over Lifetime模块进行设置。打开该模块,将Space选项设置为Local,Z设置为一个负值,表示粒子被该力推回(系统在物体局部坐标系中沿Z轴正方向发射粒子)。将该值设为-0.75将获得非常好的效果。如图7所示。
使用方式
可以通过将粒子系统放到汽车主体的子物体上来对其进行定位。对于简单的游戏来说,可以直接打开Play On Awake和Looping属性来让粒子系统运行。然而在大多数情况下,在汽车移动的时候可能会去更改粒子系统的参数。首先这是为了更加真实(比如说,在汽车发动机加速工作的时候引擎会产生更多烟雾),它还有助于防止烟雾粒子在车辆行驶时散开。一个快速移动的汽车带着发射速率非常慢的烟雾粒子,将会产生十分与众不同的烟雾,这其实是非常不真实的。
脚本中可以非常容易的改变粒子发射速率。脚本中如果有表示发动机转速或者汽车速度的变量,那么就可以非常简单的将该值乘以一个常数,再将结果赋值给粒子系统的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;
}
}
Javascript
var engineRevs: float;
var exhaustRate: float;
var exhaust: ParticleSystem;
function Start()
{
exhaust = GetComponent.<ParticleSystem>();
}
function Update ()
{
exhaust.emissionRate = engineRevs * exhaustRate;
}
知识进阶
本节的基本任务是创建一个逼真的汽车烟雾效果,但是我们可能会发现随着参数变化,发动机的属性也会随着改变。一个调校不当、效率低下的发动机往往不能完全燃烧燃料,会导致黑沉的烟雾长时间停留在空中。这种效果对于老式的农用拖拉机是非常好的,但对于高性能运动汽车绝不是一个很好的效果。对于一个清洁的发动机来说,应该使用较小的生命周期值,透明度和大小增加的颗粒。对于一个并不清洁的发动机来说,应该增加这些值或者使用Emission模块中的Burst属性,来创建发动机向外喷射气体的效果。