思考并回答以下问题:
本章涵盖:
- 策划
- 地图编辑器
- “格子”数据
- 在Inspector窗口添加自定义U控件
- 创建一个自定义窗口
- 游戏场景
- 制作UI
- 创建游戏管理器
- 摄像机
- 路点
- 敌人
- 敌人生成器
- 创建敌人生成器
- 遍历敌人
- 防守单位
- 生命条
- 小结
本章将使用Unity完成一款塔防游戏。我们将使用自定义的编辑器创建场景,创建路点引导敌人行动,对战斗进行配置、动画播放,还涉及摄像机控制和UI界面等。
策划
塔防游戏的基本玩法比较类似,在场景中我方有一个基地,敌人从场景的另一侧出发,沿着相对固定的路线攻打基地。我方可以在地图上布置防守单位,攻击前来进攻的敌人,防止他们闯入基地。
**场景**塔防游戏的场景有些固定的模式,它由一个二维的单元格组成,每个格子的用途可能都不同:
- 专用于摆放防守单位的格子。
- 专用于敌人通过的格子。
- 既无法摆放防守单位,也不允许敌人通过的格子。
摄像机始终由上至下俯视游戏场景,按住鼠标左键并移动可以移动摄像机的位置。
**胜负判定**我方基地有10点生命值,敌人攻入基地一次减少一点生命值,当生命值为0,游戏失败。
敌人以波数的形式向我方基地进攻,每波由若干个敌人组成。在这个实例中,一关有10波,当成功击退敌人10波的进攻则游戏胜利。
**敌人**敌人有两种:一种在陆地上行走;另一种可以飞行。每打倒一个敌人会奖励一些铜钱,用来购买新的防守单位。
**防守单位**塔防游戏会有多种类型的防守单位。本游戏有两种类型的防守单位:一种是近战类型;另一种是远程。每造一个防守单位需要消耗相应数量的铜钱。
**UI界面**游戏中的UI包括防守单位的按钮、敌人的进攻波数、基地的生命值和铜钱数量。
当防守单位攻击敌人时,在敌人的头上需要显式一个生命条表示剩余的生命值。
当游戏失败或胜利后显示一个按钮重新游戏。
地图编辑器
在正式开始制作游戏之前,我们有必要先完成一个塔防游戏的地图编辑器。Unity编辑器的自定义功能非常强大,几乎可以把Unity编辑器扩展成任何界面。在示例中,我们将完成一个“格子”编辑系统,帮助我们输入塔防游戏的地图信息。
“格子”数据
新建工程,在Hierarchy窗口中创建一个空对象,然后创建脚本TileObject.cs指定给这个空对象,这里将空对象命名为Grid Object,这个类主要用于保存场景中的“格子”数据,代码如下所示。
TileObject.cs
1 | using UnityEngine; |
在Inspector窗口添加自定义UI控件
Unity提供了API可以扩展Inspector窗口中的UI控件。
(1)以本示例的地图编辑器为例,为了扩展TileObject这个类的Inspector窗口,我们创建了脚本TileEditor.cs,继承自Editor。因为它是一个编辑器脚本,所以必须放到Editor文件夹中,代码如下:
TileEditor.cs
1 | using UnityEngine; |
(2)
(3)
(4)
游戏场景
创建游戏管理器
GameManager.cs
1 | using UnityEngine; |
敌人生成器
塔防游戏的敌人通常是成批出现,一波接着一波,因为敌人的数量众多,多以需要一个生成器按预先设置的顺序生成不同的敌人。
创建敌人生成器
(1)创建WaveData.cs,它定义了战斗时每波敌人的配置。
1 | using UnityEngine; |
(2)创建EnemySpawner.cs,代码如下所示。因为是每隔一定时间根据配置生成敌人,这里使用协程完成了这个功能。
1 | using UnityEngine; |
(3)创建一个空游戏体作为敌人生成器放置到场景中,为其指定EnemySpawner.cs脚本。在m_startNode中设置起始路点,在Waves中配置敌人的生成,这里配置了10波,如下图所示。
遍历敌人
1 | void Start () |