- 1、本文档共10页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
UnityD技术之塔防类项目详解一
Unity3D技术之塔防类项目详解(一) 通常意义上讲,塔防游戏是指一类在地图上建造炮台或者类似建筑物来阻止敌人进攻的策略类游戏。从这个概念中,我们可以快速地抽离出来三个元素,即地图(场景)、敌人、炮台(防守单位)。当我们抽离出来这样三个元素后,现在塔防游戏就变成了这样的一种描述,即敌人按照地图中设计的路径进攻,玩家利用防守单位进行防守的一类策略游戏。经典的塔防游戏有哪些呢?比如我们最为熟悉的《植物大战僵尸》、《保卫萝卜》都是塔防类游戏的经典游戏。如果我们将塔防游戏中的防守单位的范围扩大到玩家,那么像《英雄联盟》这样的游戏同样是可以称之为塔防游戏的,因为敌我阵营的最终目的都是要摧毁敌方的防御塔,只是敌我双方都从炮台或者怪物变成了有血有肉的人物,加之角色扮演(RPG)和即时战略(RTS)等元素的混合渗透,使得这样的游戏从单纯的塔防游戏变成了一款可玩度极高的游戏(天啊,我居然在夸这个游戏.....)。好了,那么我们就来尝试着做出一个简单的塔防游戏吧,注意是简单的塔防游戏哦,既然塔防游戏的三个要素是地图、敌人和防守单位,那么我们就从这三个方面来着手设计这个游戏吧!在本篇文章中,我们将用到下面的知识:Unity2D中的Sprite动画Unity3D中的可视化辅助类Gizmos塔防游戏中敌人按路径寻路的实现Unity3D uGUI的初步探索简单的AI算法一、地图篇?地图是一个塔防游戏中玩家最为关注的地方,因为地图和敌人将直接影响到玩家的策略。如图是从《保卫萝卜》游戏中提取的一张游戏地图。在这张地图中我们可以清楚看到怪物进攻的路径,怪物将沿着地图中的路径向我方防守单位发起攻击。那么,在游戏中,我们该怎样确定怪物的攻击路径呢?首先我们可以对地图进行下分析,在地图中基本上基本上只有两种类型的区域,即可以放置防守单位的区域和不可放置防守单位的区域两种。由此我们可以设计出下面的结构:[csharp] view plaincopyusing UnityEngine;?using System.Collections;?[SerializeField]?public class GridNode : MonoBehaviour?{?public enum NodeType?{?CanPlace,?CantPlace?}?public NodeType GridNodeType=NodeType.CanPlace;?} 可以看出,我们在GridNode类中定义了一个称为NodeType的枚举类型,这个枚举类型有两个值,CanPlace表示可以放置防守单位,CantPlace表示不可以放置防守单位。在GridNode类中只有一个NodeType类型的成员变量GridNodeType,该成员变量的默认值是CanPlace,即可以放置防守单位。那么,现在问题来了,我们找到了一种可以用来描述地图中不同区域的方法,可是这些区域在哪里呢?所以我们需要一种方法来生成这些区域。这里隆重向大家介绍Gizoms类,Gizmo是Unity中一个用于在场景视图可视化调试或辅助设置的工具类。简单的说,当我们需要在编辑器环境中实现某种可视化调试的时候,我们就可以使用Gizmo类。所以的Gizmo绘制都需要在OnDrawGizmos或OnDrawGizmosSelected函数里完成。从这两个函数的名称我们就可以看出它们的区别,OnDrawGizmos在每一帧都调用,所有在Gizmos里渲染的Gizmo都将被渲染,而OnDrawGizmosSelected仅在脚本附加的物体被选中时渲染。好了,在了解了Gizmos的基本概念和用法后,我们回到我们的游戏中。我们刚刚提到,我们需要一种方法来生成区域以便于我们可以使用GridNode类来描述每个区域的属性,那么具体怎么做呢?其实思路就是在地图上画出网格,这样网格便可以将整个地图分割成不同的区域,然后我们就可以使用GridNode来描述每个区域的属性啦。好了,下面我们来看具体的脚本:[csharp] view plaincopyusing UnityEngine;?using System.Collections;?public class GridMap : MonoBehaviour {?public static GridMap Instance=null;?public int MapSizeX;?public int MapSizeZ;?[HideInInspector]?public GameObject[] mNodes;?[HideInInspector]?public GameObject[] mPaths;?void Awake()?{?Instance=this;?mNodes=GameObject.FindGame
文档评论(0)