「Unity2D」使用Unity创建一个2D游戏系列-7

本文由泰然教程组成员 betterdenger 翻译,原文请参阅「Playing with particles」

玩玩粒子效果

我们的发射的子弹,弹道是很飘逸,但是我们也该给它加点粒子效果来增强它们的视觉效果了。

粒子算是一种很小的sprite,它通过短时间的重复的生成和显示来生成一种酷炫的视觉效果。

我们想想爆炸,激光,烟雾的效果。它们大多数时候都是用粒子来实现的(爆炸也可以用简单的动画来实现)。

Unity内置了一个强大的基于Shuriken引擎的粒子编辑器。现在我们来学习一下怎么用它。

爆炸prefab

我们会创建一个爆炸效果来应用于敌人或者玩家死亡的时候。需要做的:

  1. 创建一个爆炸粒子系统(作为一个prefab)
  2. 在需要的时候演示播放这个粒子效果

一个爆炸效果通常由两部分构成: 火焰和烟雾

烟雾粒子

创建一个新的"Particle System" ("Game Object" -> "Create Other" -> "Particle System")。

提示: 我们推荐你在一个场景的空白部分或者直接在一个空场景测试,这样你可以直观清楚的看到效果。

如果你想在一个有很多对象的场景看清某一个,你只需要在"Hierarchy"里双击这个对象, 或者这"Scene"视图里按F键。

如果你放大粒子系统的视图,你可以看到一个持续不断喷射火花的粒子游戏对象:

Creating a new particle system

在"Scene"视图里观察这个新窗口(带有"Pause"和"Stop"), 或者在"Inspector"面板里看。你没看错,后者现在新出现了一堆跟粒子系统相关的编辑框了。

这才是最有趣的!

注意:但你在"Hierarchy"里选中一个粒子系统的时候, 他就开始模拟了运行了。如果你取消选中,它就停止运行。这确实很实用,你可以一边设计一边实时的观察实现的效果。

我们会用会用这个sprite来做烟雾粒子效果:

Cloud sprite

(右键保存本图)

提示: 如果你实用自己的图片的时候涉及到透明度问题, 请确保透明像素是黑色并且alpha值是0。即使一个像素是不可见的,它也会有值的,电脑是可以"看见"这个颜色的。

拷贝图片到"Textures"文件夹。改变"Texture Type"为"Texture", 同时设置"Alpha Is Transparent"。 像这样:

Cloud settings

注意: 我们使用了一个Unity 3D里面的特征,不是2D了哦。实际上,这完全没关系。当你使用"2D"工具的时候, 你使用的其实是一个Unity的子集。所以Unity的完整功能可以随时被导入使用。

指定粒子的纹理:

  1. 拖拽纹理到"Inspector"里面的粒子系统(或者拖拽到"Hierarchy"里的粒子对象上, 这个操作会把纹理指定到右边"Inspector"里的属性里)。
  2. 修改渲染器"Particles" -> "Alpha Blended":

Cloud shader

为了创建一个完美的烟雾粒子, 我们必须在"Inspector"里粒子系统里设置一些东西。

对于本教程,我们推荐这样设置:
| Category | Parameter name | Value |
| ----------|:-------------:| -----:|
| 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 | 0 : 15 |
| Shape | Shape | Sphere |
| 生命周期内的颜色 | Color | 下见(N°1) |
| 生命周期内的大小 | Size | 下见(N°2) |

N°1 — 生命周期内的颜色

在结束位置设置一个alpha值,创建一个渐隐渐变:

Fade out particles

N°2 — 生命周期内的大小

选择一个下降趋势曲线:

Curve editor

同时你要这样设置:

Full settings

随便调整这个系统,来看看它是怎样运行的,这可是你的游戏诶。

当你觉得满意了,取消勾选"Looping"。

观察结果:

Smoke effect

这显然不完美,但是注意我们创建的方式如此简单。添加粒子效果可以很清楚的看到一个无聊的游戏和一个看起来很有趣的游戏的区别。

把它作为一个prefab保存。你可以组织一下文件目录,放到"Prefabs/Particles"目录,同时命名为"SmokeEffect"。

火焰粒子

这个跟之前的差不多。

  1. 如刚才那般创建一个粒子系统。
  2. 使用默认的材质作为火焰(选择"Renderer/Material"到"Default-Particle")。这足够我们使用了。

推荐设置:

| Category | Parameter name | Value |
| ----------|:--------------:| ------:|
| 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 | 0 : 10 |
| Shape | Shape | Box |
| 生命周期内的颜色 | Color| 下见(N°1) |

N°1 — 生命周期内的颜色

创建一个从黄色到橘色的颜色渐变,同时设置淡出效果。

Fire gradient

得到的效果是这样:

Fire effect

同样保存为一个prefab,名为"FireEffect"。

现在我们要在脚本里使用这些prefab了。

辅助脚本

实例化这些粒子跟实例化玩家或者子弹一样。

当然,你得记住在不需要的时候删除它们。

我们会在脚本里通过联合火焰粒子和烟雾粒子来实现爆炸效果。

创建一个名为"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. 检查设置,在对应区域选上对应的prefab。

Filling the script with prefab

炸起来!

终于到了调用脚本的时候了。

打开"HealthScript", 我们要在里面检查游戏对象是不是被摧毁了,如果是的话,我们就显示我们亲爱的爆炸特效。

我们只需要添加一行就好了:

    SpecialEffectsHelper.Instance.Explosion(transform.position);

添加到"HealthScript"的OnTriggerEnter()方法里:

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

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

      // Dead!
      Destroy(gameObject);
    }

    // ...
  }

现在开始游戏,先攻击敌人,然后让玩家被敌人打死。

Explosions in action

(点击查看结果)

哎哟,不错哟。当然还可以更不错哒。

这可都是你通过粒子完成的美丽爆炸效果,现在你知道它们是怎么做的了吧。;)

下一步

我们已经学习到了怎样通过Unity的内置引擎创建粒子效果。如你所见,灰常简单。不仅如此,这些效果给你的游戏反馈了"情绪"

但是也要小心!你可能会更加倾向于去调整效果而不是无聊的编码,但是调整效果是非常费时间的!

正如James Silva在Building XNA 2.0 Games写到:"你应该在开发的最后再来调整粒子效果,否则你会很快失去开发其他任务的兴趣。"

就像使用粒子效果,这里还有另外的方法让你的游戏反馈"情绪":声音! 这就是我们要在下一章学的东西。

标签: unity2d, 教程

?>