Unity3D游戏开发之塔防游戏项目讲解(上)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
[Unity3D]Unity3D游戏开发之塔防游戏项目讲解(上)
通常意义上讲,塔防游戏是指一类在地图上建造炮台或者类似建筑物来阻止敌人进攻
的策略类游戏。从这个概念中,我们可以快速地抽离出来三个元素,即地图(场景)、敌人、炮台(防守单位)。当我们抽离出来这样三个元素后,现在塔防游戏就变成了这样的一种描述,即敌人按照地图中设计的路径进攻,玩家利用防守单位进行防守的一类策略游戏。经
典的塔防游戏有哪些呢?比如我们最为熟悉的《植物大战僵尸》、《保卫萝卜》都是塔防
类游戏的经典游戏。如果我们将塔防游戏中的防守单位的范围扩大到玩家,那么像《英雄
联盟》这样的游戏同样是可以称之为塔防游戏的,因为敌我阵营的最终目的都是要摧毁敌
方的防御塔,只是敌我双方都从炮台或者怪物变成了有血有肉的人物,加之角色扮演(RPG)和即时战略(RTS)等元素的混合渗透,使得这样的游戏从单纯的塔防游戏变成了一款可玩
度极高的游戏(天啊,我居然在夸这个游戏.....)。好了,那么我们就来尝试着做出一个简单
的塔防游戏吧,注意是简单的塔防游戏哦,既然塔防游戏的三个要素是地图、敌人和防守
单位,那么我们就从这三个方面来着手设计这个游戏吧!在本篇文章中,我们将用到下面
的知识:
∙Unity2D中的Sprite动画
∙Unity3D中的可视化辅助类Gizmos
∙塔防游戏中敌人按路径寻路的实现
∙Unity3D uGUI的初步探索
∙简单的AI算法
一、地图篇
地图是一个塔防游戏中玩家最为关注的地方,因为地图和敌人将直接影响到玩家的策略。如图是从《保卫萝卜》游戏中提取的一张游戏地图。在这张地图中我们可以清楚看到
怪物进攻的路径,怪物将沿着地图中的路径向我方防守单位发起攻击。那么,在游戏中,
我们该怎样确定怪物的攻击路径呢?首先我们可以对地图进行下分析,在地图中基本上基
本上只有两种类型的区域,即可以放置防守单位的区域和不可放置防守单位的区域两种。
由此我们可以设计出下面的结构:
[csharp] view plaincopy
ing UnityEngine;
ing System.Collections;
3.
4.[SerializeField]
5.public class GridNode : MonoBehaviour
6.{
7.public enum NodeType
8.{
9.CanPlace,
10.CantPlace
11.}
12.
13.public NodeType GridNodeType=NodeType.CanPlace;
14.}
可以看出,我们在GridNode类中定义了一个称为NodeType的枚举类型,这个枚举类型有两个值,CanPlace表示可以放置防守单位,CantPlace表示不可以放置防守单位。在GridNode类中只有一个NodeType类型的成员变量GridNodeType,该成员变量的默认值
是CanPlace,即可以放置防守单位。那么,现在问题来了,我们找到了一种可以用来描
述地图中不同区域的方法,可是这些区域在哪里呢?所以我们需要一种方法来生成这些区域。这里隆重向大家介绍Gizoms类,Gizmo是Unity中一个用于在场景视图可视化调试
或辅助设置的工具类。简单的说,当我们需要在编辑器环境中实现某种可视化调试的时候,
我们就可以使用Gizmo类。所以的Gizmo绘制都需要在OnDrawGizmos或OnDrawGizmosSelected函数里完成。从这两个函数的名称我们就可以看出它们的区别,OnDrawGizmos在每一帧都调用,所有在Gizmos里渲染的Gizmo都将被渲染,而OnDrawGizmosSelected仅在脚本附加的物体被选中时渲染。好了,在了解了Gizmos的基本概念和用法后,我们回到我们的游戏中。我们刚刚提到,我们需要一种方法来生成区域以便于我们可以使用GridNode类来描述每个区域的属性,那么具体怎么做呢?其实思路就是在地图上画出网格,这样网格便可以将整个地图分割成不同的区域,然后我们就可以使用GridNode来描述每个区域的属性啦。好了,下面我们来看具体的脚本:
[csharp] view plaincopy
ing UnityEngine;
ing System.Collections;
3.
4.public class GridMap : MonoBehaviour {
5.
6.public static GridMap Instance=null;
7.
8.public int MapSizeX;
9.public int MapSizeZ;
10.
11.[HideInInspector]
12.public GameObject[] mNodes;
13.[HideInInspector]
14.public GameObject[] mPaths;
15.
16.void Awake()
17.{
18.Instance=this;
19.mNodes=GameObject.FindGameObjectsWithTag("GridNode");
20.mPaths=GameObject.FindGameObjectsWithTag("PathNode");
21.}
22.
23.void DrawGrid()
24.{
25.Gizmos.color=Color.blue;
26.for(int i=0;i<=MapSizeX;i++)
27.{
28.Gizmos.DrawLine(new Vector3(i,0,0),new Vector3(i,MapSizeZ,0));
29.}
30.for(int j=0;j<=MapSizeZ;j++)
31.{
32.Gizmos.DrawLine(new Vector3(0,j,0),new Vector3(MapSizeX,j,0));
33.}
34.}
35.