Space Shooter之随机生成敌人及其优化

 准备工作

在Space Shooter之子弹和敌人碰撞检测、爆炸特效以及敌人的运动这篇文章中,创建好了具有碰撞检测、爆炸特效以及敌人从上往下的运动。下面创建敌人(陨石)的随机生成,一波一波的生成。注意:具有上述性质的陨石已被设置为Prefab,下面直接使用陨石的Prefab。

随机生成敌人

1. 在Hierarchy中新建一个空的GameObject,并命名为GameController,它的作用是我们创建随机生成敌人脚本的载体;
2. 为GameController创建C#脚本,并命名为GameController;
3. 打开脚本,编写代码,保存。清单如下:
using UnityEngine;
using System.Collections;

public class GameController : MonoBehaviour {

    public GameObject enemySpawn;// 存放陨石prefab
    public int enemyCount;// 每一波陨石的个数

	void Start () {
        for (int i = 0; i < enemyCount; ++i)
        {
            Vector3 spawnPosition = new Vector3(Random.Range(-6, 6), 0, 12);
            Quaternion spawnRotation = Quaternion.identity;
            Instantiate(enemySpawn, spawnPosition, spawnRotation);
        }
	}
返回Unity,把陨石预设赋值给enemySpawn,并设置每一波的陨石的数量enemyCount 为6,运行,效果如下图:
Space Shooter之随机生成敌人及其优化_第1张图片

虽然随机的生成了陨石,但显然不是我们想要的效果,那么问题来了?怎样才可以是使敌人不相撞以至于不被摧毁?注意到我们是用循环来生成的陨石,并且是一个一个的,但由于计算机运行速度很快,所以就发生了碰撞。为避免这种问题,我们可以在循环中加入一个等待等待一小会(比如0.5s就可以 )再生成敌人,这需要协同函数的帮助,代码清单如下:
using UnityEngine;
using System.Collections;

public class GameController : MonoBehaviour
{

    public GameObject enemySpawn;// 存放陨石prefab
    public int enemyCount;// 每一波陨石的个数
    public float startWait;// 开始游戏后玩家的准备时间
    public float spawnTime;// 生成下一波敌人的时间间隔

    public float waveWait;// 生成下一波敌人的等待时间

    void Start()
    {
        StartCoroutine(spawnWaves());
    }

    // 协同函数
    IEnumerator spawnWaves()
    {
        // 开始游戏后,不会立即有敌人,需要给玩家一些准备时间waitTime
        yield return new WaitForSeconds(startWait);
        // 循环生成一波一波的敌人
        while (true)
        {
            for (int i = 0; i < enemyCount; ++i)
            {
                Vector3 spawnPosition = new Vector3(Random.Range(-6, 6), 0, 12);
                Quaternion spawnRotation = Quaternion.identity;
                Instantiate(enemySpawn, spawnPosition, spawnRotation);
                // 加入生成一波子弹的时间间隔
                yield return new WaitForSeconds(spawnTime);
            }
            yield return new WaitForSeconds(waveWait);
        }
    }
}

返回Unity,设置相关参数,如下图:
Space Shooter之随机生成敌人及其优化_第2张图片
运行Unity,得到如下图效果:
Space Shooter之随机生成敌人及其优化_第3张图片

That is great!!!我们想要的效果!但是观察Hierarchy视图未免有点令人小失望!Hierarchy视图中产生了很多没有被销毁的陨石的Clone体,虽然这里的陨石体积很小,不会占用太多的系统资源,但有必要销毁没有被摧毁的陨石!
Space Shooter之随机生成敌人及其优化_第4张图片

优化

为避免上述问题,只需要在 陨石Prefab上 (因为要摧毁陨石)添加脚本—— 基于时间摧毁陨石——DestoryByTime,清单如下:
using UnityEngine;
using System.Collections;

public class DestoryByTime : MonoBehaviour {
    // 敌人的生存时间,超过生存时间,即使敌人没有被子弹打死,也会被Destory
    public float lifeTime;
    void Start() {
        Destroy(gameObject, lifeTime);    
    }
}

返回Unity,设置lifeTime为4s,运行Unity,测试结果如下图:
Space Shooter之随机生成敌人及其优化_第5张图片


很好,没有被子弹摧毁的陨石在超过生命周期后自动被Destory掉!


你可能感兴趣的:(Unity学习札记)