Unity 3D\2D手机游戏开发:从学习到产品(第3版)
上QQ阅读APP看书,第一时间看更新

2.9 敌人生成器

在现在的游戏中,只是随意放了几个敌人,将其消灭后就没有其他敌人了。接下来,我们将创建一个敌人生成器,使其不停地制造新的敌人,这样游戏才能一直玩下去。

步骤 01 创建EnemySpawn.cs脚本:

        [AddComponentMenu("MyGame/EnemySpawn")]
        public class EnemySpawn : MonoBehaviour
        {
            public Transform m_enemy;  // 敌人的Prefab
            protected Transform m_transform;
            // Use this for initialization
            void Start () {
              m_transform = this.transform;
              StartCoroutine(SpawnEnemy());  // 调用协程
            }
            IEnumerator SpawnEnemy()  // 使用协程创建敌人
            {
              yield return new WaitForSeconds(Random.Range(5,15));  // 每N秒生成一个敌人
              Instantiate(m_enemy, m_transform.position, Quaternion.identity);
              StartCoroutine(SpawnEnemy());  // 循环
            }
        }

m_enemy属性指向敌人的Prefab,我们当前只有两种敌人。

IEnumerator是协程函数的标识符,它的功能有些类似线程,这里使用WaitForSeconds,可以在不堵塞主线程的情况下,让函数进行等待,每隔几秒创建一个敌人,然后循环这个过程。调用协程函数一定要使用StartCoroutine函数。

Random. Range会在一定范围内生成一个随机数,在这个例子中,将会在5~14.9秒(最大值不包括)之间生成一个新的敌人。

步骤 02 在菜单栏中选择【GameObject】→【Create Empty】,创建一个空的游戏体作为敌人生成器,注意这个空游戏体是看不到的,但它确实存在,可以在Hierarchy窗口中通过名称选择它。

步骤 03 将EnemySpawn脚本指定给敌人生成器游戏体作为组件。

步骤 04 将敌人成生器制作为两个Prefab:一个Prefab的m_enemy属性与普通敌人的Prefab相关联;另一个与高级敌人相关联。

我们虽然不需要敌人生成器在游戏时显示出来,但如果在场景中也不能显示则不利于摆放它,所幸我们可以让它在场景中以图标的形式显示,在游戏时则看不到它。

步骤 05 在Project窗口的根目录创建一个名为Gizmos的文件夹,注意这个文件夹的名称必须为Gizmos。

步骤 06 在Project窗口中找到图片素材item.png,将其复制到Gizmos的文件夹中,这个图片将作为敌人生成器的图标使用,也可以使用任何其他图片。

步骤 07 打开EnemySpawn.cs脚本,添加用来显示图标的函数:

            void OnDrawGizmos()
            {
                Gizmos.DrawIcon (transform.position, "item.png", true);
            }

步骤 08 将敌人生成器摆放到场景上方,会看到敌人生成器的图标,但在游戏时它们是不显示的。运行游戏,屏幕上方会涌现大量敌人,如图2-38所示。

图2-38 敌人生成器不断生成敌人