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 敌人生成器不断生成敌人