汽车和许多其他车辆在将燃料转化为动力时会产生排气烟雾。可以使用 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 属性来创建发动机噗噗声效果。
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.