本节要点
游戏控制器用于定时随机批量生成敌人。
本节要点如下:
-
使用
Random.Range()
生成一定范围内的随机数,用于生成敌人的x坐标 -
使用
Quanternion.identity
生成一个没有旋转的四元数 -
使用
coroutine
(协程) -
使用
Destroy()
在指定时间内销毁对象
一、随机生成敌人
Hierarchy中创建一个新的游戏对象,名为Game Controller,重置transform,tag设置为GameController新建脚本名为GameController.cs,脚本代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GameController : MonoBehaviour {
public GameObject hazard;
public Vector3 spawnValues;
void Start () { SpawnWaves(); }
void SpawnWaves() {
Vector3 spawnPosition = new Vector3(Random.Range(-spawnValues.x,spawnValues.x), spawnValues.y, spawnValues.z);
Quaternion spawnRotation = Quaternion.identity;
Instantiate(hazard, spawnPosition, spawnRotation); } }
Spawn Values设置为X=6, Y = 0, Z = 16
进入游戏,发现已经成功实现了随机生成敌人:
二、批量生成敌人
增加hazardCount, spawnWait, startWait, waveWait变量,分别用于表示敌人数量,敌人生成的间隔时间,游戏一开始的暂停时间,两批次敌人的间隔时间。使用coroutine(协程),使得
SpawnWaves()
方法既可以等待,又不会导致游戏暂停。要让该方法成为coroutine
,就要让该方法返回IEnumberator
,而不是使用void
。同时WaitForSeconds()
方法要写成yield return new WaitForSeconds(spawnWait);
。最后使用StartCoroutine(协程名)来启动该协程。GameController.cs脚本如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GameController : MonoBehaviour {
public GameObject hazard; public Vector3 spawnValues;
public int hazardCount; //一批敌人的数量
public float spawnWait; //一批中,单个敌人生成的间隔时间
public float startWait; //开始的暂停时间
public float waveWait; //两批敌人之间的间隔时间
void Start () {
StartCoroutine(SpawnWaves()); }
IEnumerator SpawnWaves() {
yield return new WaitForSeconds (startWait);
while(true) { for(int i = 0; i < hazardCount; i++) {
Vector3 spawnPosition = new Vector3(Random.Range(-spawnValues.x,spawnValues.x), spawnValues.y, spawnValues.z);
Quaternion spawnRotation = Quaternion.identity;
Instantiate(hazard, spawnPosition, spawnRotation);
yield return new WaitForSeconds(spawnWait); }
yield return new WaitForSeconds(waveWait); } } }
运行游戏,可见每一批敌人有10个,每一批时间的间隔为4秒:
三、清除残留的explosion
由于离开边界和碰撞都无法清除残留的explosion对象,因此我们用时间来销毁这些explosion对象。
创建脚本DestroyByTime.cs,代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DestroyByTime : MonoBehaviour {
public float lifetime;
void Start () {
Destroy(gameObject, lifetime); } }
写在最后
如果你一路跟着做到了这里,Unity基本上可以算是入门了,官网还有一个坦克大战的教程跟这个思路其实差不多,把坦克大战里面的摄像机再弄懂了就可以做第一人称、第三人称的游戏,搞个demo出来应该可以稍微应付一下面试了。但前面还有很多路要走,还有很多坑要踩。我只能帮你到这里了。
后面的几节教程(音频、计分板、编译打包)懒得写了,有兴趣的话可以上官网或者b站看看,b站有中文翻译,链接放在后面参考资料了。
一开始写这个飞机大战教程也是打算总结一下自己,顺便帮助刚刚入门Unity开发的小伙伴们,毕竟看视频太冗长,看我写的教程几分钟就好了。中途断了好久没更新,没想到真的有人看,于是这两天有空就更新了一波。如果以后我不做游戏了,我写的这些还能给对游戏开发有兴趣的朋友们提供一些帮助,节约一些时间,那就足够了。