我们的射击游戏开始有了一个好的样子,接下来,我们会使用粒子增强一下效果。
粒子是(基本上)指在非常短的一段时间里重复和显示的简单sprites(精灵)。
想想爆炸,激光,烟等等效果,它们都是用粒子做的---在大多数情况下(爆炸效果可以是一个简单的动画精灵)。
Unity为粒子提供了一个强大的内置编辑器,使用的是Shuriken Engine。
让我们看看能用它做些啥。
我们将制作一个爆炸效果,它会在enemy或player被摧毁时用到。这会包含以下内容:
- 为爆炸效果制作一个粒子系统 (做成prefab)
- 在需要的时候,实例化并播放它。
一个爆炸效果通常需要两个东西:火和烟。
创建一个新的“Particle System” ("Game Object" -> "Effects" -> "Particle System")。
小巧门:我们建议你在场景的空旷位置进行(或者在一个空场景里),以便你可以看得更清楚它是什么样子的。
如果你想在场景里把焦点放到对象上,你可以在"Hierarchy"里
double-click
它或者在“Scene”视图里按F
。
放大这个粒子系统,你会看到这个粒子对象在连续的发出火花:
观察在“Scene”视图中的新窗口 (有"Pause"和"Stop")或"Inspector"方框。在"Inspector"里已经有一打相关参数了。
这就是有趣的地方!
注:当你从"Hierarchy"里选择一个粒子系统时,它会开始模拟运行,当你不选择它时模拟会停止。当你构思的时候,它真的非常实用,让你看看它是什么样子的 (而且立即可以看到)
我们将使用下面这个sprite (精灵) 来做为烟粒子:
(右键点击图片,并保存它)
小巧门:如果你在使用自己的素材时有透明度的问题,请确认透明像素是0alpha的黑色像素。确实,即使一个像素不可见,但它仍然是有值的。这是计算机使用的。
复制这图片到"Textures"目录里。将"Texture Type"设置为"Default",选上"Alpha Is Transparent"。像下在这样:
将这个texture设置到粒子对象上:
- 拖动texture到粒子系统的"Inspector"里,或者在"Hierarchy"的粒子对象上,它会将texture设置到右侧"Inspector"的属性里。
- 设置shader,"Legacy Shaders" -> "Particles" -> "Alpha Blended"
为了做出完美的烟粒子,我们还需要对粒子系统的"Inspector"做一些设置。
在本教程,我们推荐这样:
类型 | 参数 | 值 |
---|---|---|
General | Duration | 1 |
General | Max Particles | 15 |
General | Start Lifetime | 1 |
General | Start Color | Gray |
General | Start Speed | 3 |
General | Start Size | 2 |
Emission | Bursts | |
Shape | Shape | Sphere |
Color Over Lifetime | Color | 见下面的N1 |
Size Over Lifetime | Size | 见下面的N2 |
在最后面设置一个透明点用来创建淡出效果
选择减少的曲线:
译者注:双击线的中间,创建一个点,按图上的样子拖动3个点
最后差不多是这样:
凭感觉去微调一下,在编辑器里运行,看看它是什么效果,它将是你游戏里的效果。:)
当你满意的时候,取消"Looping"。
看看效果:
它很清楚,却不完美,但它却是非常容易制作的。添加粒子效果可以让游戏更有趣,而不会那么的无聊。
将它保存成prefab。你可以创建一个目录"Prefabs/Particles"来存放粒子prefab,并将我们的烟粒子命名为"SmokeEffect"。
它并没有什么不同。
- 创建一个粒子系统,就像前面那样。
- 使用默认的素材 (将"Renderer/Material"设置为"Default-Particle"),它已经满足要求。
其它参数,我们建议如下:
类别 | 参数 | 值 |
---|---|---|
General | Looping | false |
General | Duration | 1 |
General | Max Particles | 10 |
General | Start Lifetime | 1 |
General | Start Speed | 0.5 |
General | Start Size | 2 |
Emission | Bursts | |
Shape | Shape | Box |
Color Over Lifetime | Color | 见下面N1 |
创建一个从黄色到橙色的渐变,并在最后淡出:
效果:
将它保存为"FireEffect" prefab。
接下来,我们将在脚本里使用这些prefabs。
实例化粒子prefabs同实例化player和射击是完全一样的。
然后,你需要记住,它们将在不再用到的时候被删除掉。
而且,我们将把火粒子和烟粒子结合起来,做为我们的爆炸效果。
让我们创建一个"SpecialEffectsHelper"脚本:
using UnityEngine;
/// <summary>
/// Creating instance of particles from code with no effort
/// </summary>
public class SpecialEffectsHelper : MonoBehaviour
{
/// <summary>
/// Singleton
/// </summary>
public static SpecialEffectsHelper Instance;
public ParticleSystem smokeEffect;
public ParticleSystem fireEffect;
void Awake()
{
// Register the singleton
if (Instance != null)
{
Debug.LogError("Multiple instances of SpecialEffectsHelper!");
}
Instance = this;
}
/// <summary>
/// Create an explosion at the given location
/// </summary>
/// <param name="position"></param>
public void Explosion(Vector3 position)
{
// Smoke on the water
instantiate(smokeEffect, position);
// Tu tu tu, tu tu tudu
// Fire in the sky
instantiate(fireEffect, position);
}
/// <summary>
/// Instantiate a Particle system from prefab
/// </summary>
/// <param name="prefab"></param>
/// <returns></returns>
private ParticleSystem instantiate(ParticleSystem prefab, Vector3 position)
{
ParticleSystem newParticleSystem = Instantiate(
prefab,
position,
Quaternion.identity
) as ParticleSystem;
// Make sure it will be destroyed
Destroy(
newParticleSystem.gameObject,
newParticleSystem.startLifetime
);
return newParticleSystem;
}
}
注:因为在同一时间,场景里会有很多的粒子,我们每次都被迫去创建新的prefab。如果我们可以确认在同一时间里只会用到一个粒子系统,我们每次将使用相同的引用。
我们创建了一个单例,你可以在任何地方直接使用SpecialEffectsHelper.Instance
调用它。
单例:单例是一个设计模式,用以保证一个对象只实例化一次。我们在脚本中与经典的实现略有不同:然而,原则仍然在。
- 在"Hierarchy"里创建一个空对象,命名为"Scripts"。
- 在"Inspector"中将对应的prefabs拖到字段里。
最后调用那个脚本。
开始"HealthScript",在我们销毁游戏对象的时候,我们将展示我们的甜蜜爆炸。
我们只需要添加一行代码:
SpecialEffectsHelper.Instance.Explosion(transform.position);
添加到Damage
方法里:
public Damage(int damageCount)
{
// ...
if (hp <= 0)
{
// 'Splosion!
SpecialEffectsHelper.Instance.Explosion(transform.position);
// Dead!
Destroy(gameObject);
}
// ...
}
运行游戏,试着射击敌人,或者让player去死。
(点击图片,查看效果)
还不错,对吧?但可能会更好。
但是,你应该用粒子做出更漂亮的爆炸效果,现在你已经知道如何让它工作了。:)
我们已经学习了如何使用Unity内置引擎创建粒子,正如你看到的,非常简单,而且它们增加了乐趣和反馈到你的游戏里。
但要小心!它可能会慢慢变得耗时,因为你可能更喜欢调整效果而不是像高分这样无聊的功能。
就像James Silva在Building XNA 2.0 games里写的那样,你应该在开发结束的时期处理粒子,不然你将很快的对其它事情失去兴趣。
像使用粒子,也有一些别的方法可以在游戏里增加反馈:声音!这便是我们下一章节将要学习的内容。