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,得到如下图效果:
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
- Space Shooter之随机生成敌人及其优化
- Space Shooter之控制陨石随机旋转
- Space Shooter之子弹和敌人碰撞检测、爆炸特效以及敌人的运动
- Space Shooter之子弹的运动
- unity3d 随机位置 随机时间生成一个敌人
- Unity3d 5.4-官方教程2之Space Shooter
- unity space shooter 学习
- SURVIVAL SHOOTER TUTORIAL之EnemyOne及其NavgitionMeshAgent [5]
- Unity官方实例教程 Space Shooter
- [初学Untiy]Space Shooter Tutorial
- 关于官方教程Space Shooter子弹生成部分提示MissingReferenceException的解决办法
- Space Shooter之飞船的运动、边界控制和运动旋转
- Unity官方教程—space shooter练习日记之脚色移动
- unity官方教程Space Shooter 学习笔记
- Unity笔记 SPACE SHOOTER 实例详解
- Unity3D学习笔记《Space Shooter》一
- Unity3D学习笔记《Space Shooter》二
- Unity3D学习笔记《Space Shooter》三
- HDU 1754 I Hate It
- 云管理平台(CMP)的概念与理解、发展趋势
- (2.2.10.1)gradl基本组件
- java web过滤器
- AngularJS快速入门
- Space Shooter之随机生成敌人及其优化
- Notepad++连接腾讯(阿里)云
- cin,cout与scanf,printf的速度到底相差多少
- Java输入输出深入序列化(5)
- (2.2.10.2)Gradle 工作流程
- vmware环境下centos软raid5+热备
- 新的挑战:期待、恐惧
- SQLZOO(SUM and COUNT)Writeup
- 未能从程序集“System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35