汽车和许多其他车辆在将燃料转化为动力时会产生排气烟雾。可以使用粒子系统为车辆添加排气效果以作为巧妙的点睛之笔。
排气烟雾从管道中快速排出,但随后与大气接触时会迅速减慢速度。在减速过程中,排气烟雾会扩散,变得稀薄,很快消散在空气中。由于排气温度很高,当它通过周围较冷的空气时,还会略微上升。
排气烟雾的粒子在开始时不得超过管道宽度,但随后会在其短暂的生命周期内显著增大。它通常在开始时为部分透明状态,随后与空气混合后逐渐淡化至完全透明状态。在动态性方面,粒子将以相当快的速度发射,但随后迅速减速,并还会略微上升。
在 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 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;
}
}
// JS
var engineRevs: float;
var exhaustRate: float;
var exhaust: ParticleSystem;
function Start() {
exhaust = GetComponent.<ParticleSystem>();
}
function 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.