Unity3D 5 官方教程:粒子系统 How-Tos

这部分解释了如何实现粒子系统的普遍类型。文档中所有的代码,你都可以免费使用于任何目的。

一个简单的爆炸

你可以用一个粒子系统来创造出一个逼真的爆炸,但动态效果在一开始可能看起来会更混乱。精髓之处在于,一个爆炸只是粒子群的向外爆发;但你可以做一些调整,让它看起来更真实。
一个正在开发的爆炸

粒子的时间线

一个简单的爆炸,产生一个向所有方向飞速扩散的球形火焰。初始的爆发拥有大量能量,因此非常炽热(即,明亮),并极快地移动。能量会迅速消散,让火焰的扩散减缓并冷却(即,变得不如原来那样明亮)。最后,随着所有能量燃烧殆尽,火焰停止,很快完全消失。
一个爆炸粒子通常只有短暂的生命期,你可以改动一些生命期的设置来模拟这一效果。粒子在开始应非常快地离开爆炸中心,但随着远离,它的速度应大幅降低。同时,颜色应从一开始为明亮的,之后变暗,最后褪色到透明。最后,在粒子的生命期内降低它的尺寸,会形成火焰随着燃料耗尽而分散的效果。

实现

从默认的粒子系统对象开始(菜单:GameObect->Create General->Particle System),进入Shape模块,设置发射器的形状为一个小的球体,比如半径为0.5个单位。标准资源库中的粒子包含了一个名为Fire Add 的材质,很适合用于爆炸(菜单:Assets->Import Package->Particles)。你可以将用于粒子系统的材质设置为使用Renderer模块。随着Renderer开启,你应同时关闭Cast Shadows(制造阴影)和Recieve Shadows(接受阴影),因为爆炸火焰应该是发出光而非接收光。
这一步,这粒子系统看起来像有许多小的火球被从一个中心点扔出来。爆炸当然应该同时产生大量粒子的爆发。在Emission模块,你可以设置Rate值为0,并在时间点0处添加单个粒子的Burst。爆发的粒子数量依赖于你所希望的爆炸强度,但50个粒子是个不错的开始。随着爆发设置完成,这个爆炸比之前像多了,但它相当地慢,并且火焰看起来耽搁很久。在Particle System模块中(与游戏对象会有相同的名字,例如“Explosion”),设置系统中粒子的Duration和Start Lifetime为两秒。
你也可以使用Size Voer Lifetime模块来创造“火焰耗尽燃料”的效果。将尺寸曲线设置为使用“ramp down”(即,尺寸从100%开始,降低至0)。为了让火焰黯淡、褪色,启用 Color Over Lifetime模块,并设置梯度从左边的白色开始,到右边的黑色结束。由于Fire Add材质使用附加的着色器来渲染,颜色属性的黯淡也控制了粒子的透明度;火焰的透明度会变得完全透明,随着颜色褪至黑。并且,当一个粒子被绘制在另一个之上时,附带的材质允许粒子的亮度“相加”。这进一步加强了在爆炸起始所有粒子相互间都很接近时,那刺眼夺目的效果。
按照现在的情况,爆炸正在成型,但它看着像是在外太空发生的。粒子在褪色之前,以不变的速度向外逸散,移动相当长的距离。如果你的游戏设定是在太空中,这大概是你想要的准确效果。然而,在大气层内发生的爆炸会被周围的空气所减速并抑制。开启Limit Velocity Over Lifetime模块,设置Speed为3.0,Dampen fraction 为0.4;你应该会看到爆炸随着进程而减少强度。
最后要注意的是,随着粒子从爆炸中心离开,它们个体的形状变得更容易辨认。特别地,相同尺寸、相同旋转的粒子让这个情况更明显,相同的图像被重复用于每个粒子。避免这一情况的一个简单办法,是在粒子生成时,对尺寸和旋转进行随机的变动。在Particle System模块中检视器的顶部,点击Start Size和Start Rotation属性的右向小箭头,都设置为Between Two Constants(在两个常数间随机)。对于尺寸,设置值在0.5到1.5,来产生一些变化,而没有出现太多巨大或微小粒子的风险。现在应该会看到,粒子图像的重复现象少多了。

用法

在测试时,将Looping属性开启,有助于重复地观看爆炸;但在最终的游戏里,应该将它关掉,让爆炸仅发生一次。当爆炸是为有爆炸可能的对象(比如油箱)而设计时,可能希望将粒子系统组件添加到对象上,并让Play On Awake属性关闭。之后可以在脚本中于必要之时启动爆炸。
void Explode() {
var exp = GetComponent();
exp.Play();
Destroy(gameObject, exp.duration);
}
在其它情况下,爆炸发生在撞击产生的位置。如果爆炸来自于一个物体(例如,一颗手榴弹)那么你可以在一个延时之后、或当它碰撞到目标后,调用上方所示的Explode函数。

// Grenade explodes after a time delay.
public float fuseTime;

void Start() {
    Invoke("Explode", fuseTime);
}

// Grenade explodes on impact.
void OnCollisionEnter(Collision coll) {
    Explode();
}

对于游戏里不被实际表现的物体(例如,一个运动速度太快而无法被看到的抛射体)所产生的爆炸,可以仅仅在合适的位置实例化一个爆炸。可以从例如光线照射的结果,来决定(爆炸)接触点(从而在接触点实例化爆炸)。

// On the explosion object.
    void Start() {
        var exp = GetComponent<ParticleSystem>();
        exp.Play();
        Destroy(gameObject, exp.duration);
    }

// Possible projectile script.
public GameObject explosionPrefab;

void Update() {
    RaycastHit hit;

    if (Physics.Raycast (Camera.main.ScreenPointToRay (Input.mousePosition), out hit)) {
        Instantiate (explosionPrefab, hit.point, Quaternion.identity);
    }
}

更深入的想法

这里开发的爆炸很基础,但可以修改它的很多部分,来达到在游戏中所希望看到的实际效果。
你使用的粒子图像将对玩家如何“阅读”爆炸产生很大的影响。小型的粒子多,那么分散可见的火星一边燃烧一边逸散。不会完全分散开的更大粒子更像是个被毁坏的油箱产生的火球。尤其是,将需要一并改变部分属性来完成效果。例如,火球会坚挺更久,并且在它消失前会扩张得更少;而一个猛烈的爆炸会将燃烧的部分撒布到相当远的距离外。
这里有一些属性用随机值设置,但其它大量属性有“在两个常数/曲线之间随机”的选项,可以使用这些来增加各种各样的变化。改变尺寸和旋转来避免明显的粒子雷同效果;考虑在Start Delay、Start Speed 属性增加一些随机。少量的变化有助于加强爆炸的效果显得更“自然”及难以预料,而不是有控制的机械过程。更大量的变化导致一个“脏(dirty)”爆炸。例如,改变Start Delay将产生一个不猛烈但更慢的爆炸,可能是因为车辆里的油箱是被分别点燃的。

车的尾气

轿车和许多其它类型的车辆在将燃料转化为动力时,会排除尾气。可以用粒子系统来增加一个排气为车辆增加漂亮的最后一笔。
An exhaust generated by a particle system

粒子的时间线

尾气从排气管飞快地出现,但随后接触空气后迅速减缓。随着缓慢,尾气扩散,变得模糊,很快消散在空气中。由于尾气是热的,在它经过周围的冷空气时,也有轻微的上升。
尾气粒子初始时,直径不应大过排气管;但在短暂的生命期里可以在尺寸上有合理的增长。通常初始时有一些透明,随着与空气混合褪至完全透明。考虑到动态性,粒子会被非常快地发射,但之后迅速减缓,并且轻微地上升。

实现

在Shape模块,选择圆锥形状并将Angle属性设置为0;这里的“圆锥”将实际上作为一个圆柱形的排气管。排气管的半径理应取决于车辆的尺寸,但通常可以通过匹配场景视角中的车辆模型来设置(例如,一个轿车模型的背后通常会有一个你可以匹配尺寸的排气管)。关于你选择的属性设置,半径实际上决定了相当多,比如粒子的大小和发射速率。处于本例的目标,我们假设车辆是个小轿车,在Unity世界坐标下的标准尺寸为1米,排气管的半径则是0.05或者说是5厘米。
对烟雾粒子,一个适合的图像是在标准资源库中提供的Smoke4材质。如果尚未拥有,从菜单中的Assets->Import Package->Particles导入。然后,转至粒子系统的Renderer模块,设置材质属性为Smoke4。
默认的5秒生命期通常对于车辆尾气来说太长了,所以应当打开粒子系统模块(与游戏对象有相同的名字,例如,“Exhaust”)并设置Start Lifetime为2.5秒。同样也在这个模块里,设置Simulation Space to World和Gravity Modifier 为小的负值,比如-0.1。使用世界模拟空间能让烟雾垂悬在它产生的地方,哪怕车辆在移动。负的重力影响引起烟雾粒子上升,仿佛他们是由热气组成的。一个很棒的额外效果是使用Start Rotation旁边的菜单箭头,选择在两个常数间随机的选项。分别设置两个值为0和360,烟雾粒子在被发射时会随机地旋转。许多一致对齐的粒子存在容易被察觉,减损本应是随机、无定型的烟迹。
在这一步,烟雾粒子开始看起来真实可信,默认的发射速率创造了引擎间歇性燃烧的“噗噗”效果。然而,烟雾还没有向外翻滚和消散。打开Color Over Lifetime模块,点击顶部在右边的梯度停止(这控制了颜色的“alpha”值透明度)。设置alpha值为0,可以看到烟雾粒子在场景中褪至无形。取决于引擎有多清洁,可能也希望降低开始时梯度的alpha值,黯淡的烟代表着脏、低效率的燃烧。
在褪至透明的同时,烟也应该随着逸散而在尺寸上增加,可以在Size Over Lifetime模块中很容易地创造出这个效果。打开这个模块,选择曲线,滑动曲线块到左边,使粒子以完整尺寸的部分值开始。你选择的实际值取决于排气管的尺寸,但比排气管尺寸稍大一点点的值,会产生很棒的气体逸散效果。(用排气管的尺寸作为粒子的起始,意味着气体被排气管限制而保持形状,可是,气体当然没有既定的形状 呀 !)使用粒子系统在场景视图中的模拟来得到烟雾好的视觉效果。如果烟没有散播到你希望的足够远那种效果,可以在在粒子系统模块中增加Start Size。
最后,烟雾应当随着它散播而减速。让这发生的简单办法是Force Over Lifetime模块。打开这个模块,设置Space选项为本地,力的Z方向分量设置为一个负的值,标明粒子被这个力推向后方(系统沿着物体本地空间的Z轴正方向发射粒子)。大约为-0.75的值会表现得很好,如果其他参数也如之前建议那样的设置。

使用

可以将这个尾气粒子系统放在车辆对象的一个子物体下。对于简单的游戏,可以开启 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;
    }

}



// JS

var engineRevs: float;
var exhaustRate: float;

var exhaust: ParticleSystem;


function Start() {
    exhaust = GetComponent.<ParticleSystem>();
}


function Update () {
    exhaust.emissionRate = engineRevs * exhaustRate;
}

更深入的想法

基本方案已然创建了一个逼真的车辆尾气。但你可能注意到了,你修改参数时,引擎的“特点”改变了。一个缺少调教、燃烧率低的引擎会不完全地燃烧燃料,导致浓密、黑漆漆的烟雾,在空气中挥之不去。这完美地契合了老旧农场拖拉机,但绝不适合高性能运动跑车。对于一个“清洁”的引擎,应当对生命期、不透明性和尺寸的上升,使用小的数值。对于一个“脏”的引擎,应当增加这些值,试试使用Emission模块的Bursts属性来产生引擎噼里啪啦的效果。

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值