Skip to content

Latest commit

 

History

History
282 lines (183 loc) · 10.5 KB

09.Playing with particles.md

File metadata and controls

282 lines (183 loc) · 10.5 KB

< 前一篇 后一篇 >

Playing with particles 使用粒子

我们的射击游戏开始有了一个好的样子,接下来,我们会使用粒子增强一下效果。

粒子是(基本上)指在非常短的一段时间里重复和显示的简单sprites(精灵)。

想想爆炸,激光,烟等等效果,它们都是用粒子做的---在大多数情况下(爆炸效果可以是一个简单的动画精灵)。

Unity为粒子提供了一个强大的内置编辑器,使用的是Shuriken Engine

让我们看看能用它做些啥。

爆炸 PREFAB

我们将制作一个爆炸效果,它会在enemy或player被摧毁时用到。这会包含以下内容:

  1. 为爆炸效果制作一个粒子系统 (做成prefab)
  2. 在需要的时候,实例化并播放它。

一个爆炸效果通常需要两个东西:火和烟。

烟粒子

创建一个新的“Particle System” ("Game Object" -> "Effects" -> "Particle System")。

小巧门:我们建议你在场景的空旷位置进行(或者在一个空场景里),以便你可以看得更清楚它是什么样子的。

如果你想在场景里把焦点放到对象上,你可以在"Hierarchy"里double-click它或者在“Scene”视图里按F

放大这个粒子系统,你会看到这个粒子对象在连续的发出火花:

Creating a new particle system

观察在“Scene”视图中的新窗口 (有"Pause"和"Stop")或"Inspector"方框。在"Inspector"里已经有一打相关参数了。

这就是有趣的地方!

:当你从"Hierarchy"里选择一个粒子系统时,它会开始模拟运行,当你不选择它时模拟会停止。当你构思的时候,它真的非常实用,让你看看它是什么样子的 (而且立即可以看到)

我们将使用下面这个sprite (精灵) 来做为烟粒子:

Cloud sprite

(右键点击图片,并保存它)

小巧门:如果你在使用自己的素材时有透明度的问题,请确认透明像素是0alpha的黑色像素。确实,即使一个像素不可见,但它仍然是有值的。这是计算机使用的。

复制这图片到"Textures"目录里。将"Texture Type"设置为"Default",选上"Alpha Is Transparent"。像下在这样:

Cloud settings

将这个texture设置到粒子对象上:

  1. 拖动texture到粒子系统的"Inspector"里,或者在"Hierarchy"的粒子对象上,它会将texture设置到右侧"Inspector"的属性里。
  2. 设置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

N1 - Color Over Lifetime

在最后面设置一个透明点用来创建淡出效果

Fade out particles

N2 - Size Over Lifetime

选择减少的曲线:

Curve editor

译者注:双击线的中间,创建一个点,按图上的样子拖动3个点

最后差不多是这样:

凭感觉去微调一下,在编辑器里运行,看看它是什么效果,它将是你游戏里的效果。:)

当你满意的时候,取消"Looping"。

看看效果:

它很清楚,却不完美,但它却是非常容易制作的。添加粒子效果可以让游戏更有趣,而不会那么的无聊。

将它保存成prefab。你可以创建一个目录"Prefabs/Particles"来存放粒子prefab,并将我们的烟粒子命名为"SmokeEffect"。

火粒子

它并没有什么不同。

  1. 创建一个粒子系统,就像前面那样。
  2. 使用默认的素材 (将"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

N1 - Color Over Lifetime

创建一个从黄色到橙色的渐变,并在最后淡出:

Fire gradient

效果:

Fire effect

将它保存为"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调用它。

单例:单例是一个设计模式,用以保证一个对象只实例化一次。我们在脚本中与经典的实现略有不同:然而,原则仍然在。

  1. 在"Hierarchy"里创建一个空对象,命名为"Scripts"。
  2. 在"Inspector"中将对应的prefabs拖到字段里。

Filling the script with prefab

炸掉那个东西

最后调用那个脚本。

开始"HealthScript",在我们销毁游戏对象的时候,我们将展示我们的甜蜜爆炸。

我们只需要添加一行代码:

SpecialEffectsHelper.Instance.Explosion(transform.position);

添加到Damage方法里:

public Damage(int damageCount)
  {
    // ...

    if (hp <= 0)
    {
      // 'Splosion!
      SpecialEffectsHelper.Instance.Explosion(transform.position);

      // Dead!
      Destroy(gameObject);
    }

    // ...
  }

运行游戏,试着射击敌人,或者让player去死。

Explosions in action

(点击图片,查看效果)

还不错,对吧?但可能会更好。

但是,你应该用粒子做出更漂亮的爆炸效果,现在你已经知道如何让它工作了。:)

下一步

我们已经学习了如何使用Unity内置引擎创建粒子,正如你看到的,非常简单,而且它们增加了乐趣和反馈到你的游戏里。

但要小心!它可能会慢慢变得耗时,因为你可能更喜欢调整效果而不是像高分这样无聊的功能。

就像James Silva在Building XNA 2.0 games里写的那样,你应该在开发结束的时期处理粒子,不然你将很快的对其它事情失去兴趣。

像使用粒子,也有一些别的方法可以在游戏里增加反馈:声音!这便是我们下一章节将要学习的内容。

< 前一篇 后一篇 >