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

来源:互联网 发布:广州医院挂号软件 编辑:程序博客网 时间:2024/04/26 17:58

 准备工作

在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,运行,效果如下图:


虽然随机的生成了陨石,但显然不是我们想要的效果,那么问题来了?怎样才可以是使敌人不相撞以至于不被摧毁?注意到我们是用循环来生成的陨石,并且是一个一个的,但由于计算机运行速度很快,所以就发生了碰撞。为避免这种问题,我们可以在循环中加入一个等待等待一小会(比如0.5s就可以)再生成敌人,这需要协同函数的帮助,代码清单如下:
<pre name="code" class="csharp">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,设置相关参数,如下图:
运行Unity,得到如下图效果:

That is great!!!我们想要的效果!但是观察Hierarchy视图未免有点令人小失望!Hierarchy视图中产生了很多没有被销毁的陨石的Clone体,虽然这里的陨石体积很小,不会占用太多的系统资源,但有必要销毁没有被摧毁的陨石!

优化

为避免上述问题,只需要在陨石Prefab上(因为要摧毁陨石)添加脚本——基于时间摧毁陨石——DestoryByTime,清单如下:
using UnityEngine;using System.Collections;public class DestoryByTime : MonoBehaviour {    // 敌人的生存时间,超过生存时间,即使敌人没有被子弹打死,也会被Destory    public float lifeTime;    void Start() {        Destroy(gameObject, lifeTime);        }}

返回Unity,设置lifeTime为4s,运行Unity,测试结果如下图:



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


0 0
原创粉丝点击