




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于Unity3D战争模拟策略游戏的设计与实现DesignandImplementationofWarSimulationStrategyGameBasedonUnity3D内容摘要互联网时代中,科技产物正是最被人们所关注和喜爱的,科技的飞跃发展让曾经天马行空的幻想事物一点点地挤进了人们的快节奏的生活。忙碌严肃的生活需要放松和娱乐,因此促进了娱乐类事业的发展,而电子游戏作为科技结合娱乐的产物,以难以置信的速度风靡了全世界,而能够得到科技发展反馈的电子游戏,在硬件水平提升的加持下,在画面上、流畅性以及可玩性上仍在不断地提升。与当前主流的注重操作与考验反应速度的刺激型游戏不同,慢节奏的策略类游戏对更多的游戏受众群体更为友好。本论文将基于Unity3D游戏开发引擎,结合刺激型战斗类游戏的趣味性以及策略型益智游戏的休闲性,开发即时战争模拟策略型游戏。多单位型游戏对比普通游戏需要更大的计算量,在单个单位的逻辑中细微的漏洞在数量的加持下也很容易成为无法处理的累赘,因此也考验着开发者的逻辑能力。本文记录了探索过程中涉及到的各领域的原理以及遇到的难点及其解决方案,希望能给到后来的开发者提供借鉴与参考。关键词:Unity3D3D视角战争模拟趣味策略
AbstractIntheInternetera,theproductsofscienceandtechnologyaretheonesthatpeoplepaythemostattentiontoandlove.Therepiddevelopmentofscienceandtechnolgyhas
promotedtheonceunrestrainedfantasiesgraduallybeingsqueezed
intopeople'sfast-pacedlife.Thebusyandseriouslifeneedsrelaxations
andentertainments,inconsequence,it
promotedthedevelopmentoftheentertainmentbusiness.Atthesametime,
videogames,
asaproductofscienceandtechnologycombinedwithentertainment,swepttheworldwithincrediblespeed.Foritcangetfeedbackfromtechnologicaldevelopments,thevideogamesarestillimprovingingraphics,fluency,andplayabilityunderthesupportofhardwarelevelimprovement.
Incontrasttothecurrentmainstreamofstimulatinggamesthatfocusonoperationandtestreactionspeed,slow-pacedstrategygamesaremorefriendlytomoregameaudiences.Thispaperwilldevelopreal-timewarsimulationstrategygamesbasedonUnity3Dgamedevelopmentengine,combiningthefunofstimulatingcombatgamesandtheleisureofstrategypuzzlegames.Multi-unitgamesrequiremorecomputationthannormalgames,envena
smallbuginthelogicofasingleunitcaneasilybecomeanunmanageableburdenwiththeabundant
ofthenumber,
therefore,theprocessofdevelopmentalso
trials
thelogicofdevelopers.Inthehopeofprovidingconsultsandreferencesforfuturedevelopers,thispaper
will
keeparecordoftheprinciplesofvariousfieldsinvolvedintheprocessofexplorationandthedifficultiesencounteredandtheirsolutions.Keywords:Unity3D3DViewSimulationoftheWarFunnyStrategy
目录TOC\o"1-1"\h\z\t"二级标题,2,三级标题,3"第一章 绪论 绪论概括伴随着三次工业革命,人类在探索的道路上获得了前所未有的发展,时至今日,科技依然在飞速发展着。于20世纪四十至五十年代启动的第三次工业革命,人类在电子计算机微电技术领域上取得了开拓性的突破,这一突破孕育了为电子游戏诞生的温床。再随着时代齿轮的推进,机械精度的不断上升,更快更小芯片的产生,更低成本的生产技术出现,高科技产品现在已经普及化,不再是上流社会的奢侈品。电子设备的普及让电子游戏的风波卷席了全世界,五花八门的游戏横空出世,受到了人们的喜爱和追捧,闲暇时间一起玩电子游戏已经成为了当代的一种流行的娱乐消遣方式。选题的意义和目的游戏开发技术愈来愈成熟,市面上已经有了许许多多完善的游戏开发引擎。而在鼓励开源,技术分享的时代里,门槛更低的开发引擎往往更容易受到追捧。在这样的环境下,Unity3D向全世界的初级游戏开发者提供了免费精简的开发平台,呼吁更多热爱游戏的人加入到游戏开发行业中来。随着时间的推移,Unity3D的高容纳性使得其受欢迎程度已力压曾经的主流开发引擎虚幻,成为世界用户数量最为庞大的游戏开发引擎。富有想象力与创造了的开发者前辈们,结合着自己的想法与技术在电子游戏的发展史上划上色彩斑斓一笔又一笔。如今技术日愈成熟,硬件设备基础不断提升,使得在游戏开发过程中能够在功能实现后仍留有余力去保证精美的画面,从而获得视觉上的冲击力提升。而曾经称霸了电子游戏领域的多单位型游戏碍于性能方面的缺憾,锋芒逐渐消散,如今有着更成熟的开发技术以及性能更优的硬件条件。为了让在游戏中分析战场局势、率领军队战斗的雄伟设想得到更好的传承,以及在开发过程中依靠多单位行动带来的性能制约磨练自身的逻辑整理能力,本设计将基于Unity3D游戏开发引擎完成一款模拟战争的策略型游戏,以在踏足新的过程中不断探索获得积累。国内外的发展及现状新兴的商业娱乐产物电子游戏,自从诞生以来便受到人们的关注并迅速地发展着,历时18年,电子游戏就成为了世界上科技水平较为发达的国家的电子娱乐工业基石。直到美国电子游戏业发生了雅达利震荡,电子游戏市场遭到世界性的重创,全世界都对电视电子游戏失去信心,在这之后的两年,北美地区游戏市场上再也没有具有划时代意义的电子游戏出现,电子游戏的发展遇到了最大的瓶颈,直到1985年日本公司任天堂打破僵局使得游戏事业得以重生,电子游戏产业一跃成为可以与当时最受欢迎的电影业竞争获利最高的娱乐产业。直至今日,电子游戏产业一直在飞跃发展,受到先进的开发引擎兼完善的游戏交易平台加持,在娱乐产业中以不可阻挡的势头占据着领军地位。国外拥有着最高开发预算和推广级别的电子游戏,在游戏开发中伴随着高额的经济风险,大量的开发成本的投入让国外游戏理所当然地拥有着最高的研发水准。无论是玩法上地创新还是视觉上的震撼体验都能让玩家惊叹,下至剧情及配音,无一不体现超高的开发水准。在各领域的游戏制作上都遥遥领先,出名的游戏研发厂商有“游戏界航空母舰“之称的EA、任天堂、索尼娱乐、育碧等。游戏引擎方面,位于游戏引擎之首的虚幻引擎(Unreal)5年前在开放世界游戏领域上产出了惊世之作《GTA5》,以丰富巧妙的规则设定还原了一个虚拟的现实城市;Gamebryo、Creation引擎,创造了运动模拟类的大作《极品飞车》《NBA》等,将赛车篮球等运动体验真实的还原到了游戏中;起源引擎(Source)则是创造了MOBA类竞技游戏玩法的顶尖作品《Dota2》;创建了世界上数一数二的Havock物理引擎的IWEngine引擎,其优秀的物理引擎甚至用于好莱坞电影制作,作品《使命召唤》也是无比优秀的作品。自主研发的游戏引擎也孕育了不少风靡世界的作品:暴雪的《守望先锋》和Riot的《英雄联盟》。“国外的游戏越做越真,国内的鲲越吞越大”,这句在网络上令人啼笑皆非的玩笑话无法概括国内所有的游戏产业环境,但是在一定程度上体现了玩家群体对国内的游戏开发技术的蔑视与讥讽。但是事实并不是这样,当前国产的网络研发引擎主要为自行研发。首先开发了《魔域》、《征服》、《投名状Online》等优秀游戏作品的C3、S3游戏引擎就是网龙公司的自主研发的;其次产出了《天骄3》的OverMax游戏引擎也是由国内自主研发的杰作;最后是完美时空公司自主研发的游戏引擎Angelica,代表作品《完美世界》,以上的作品都是优秀且受玩家追捧的,可以看出国内游戏发开企业在游戏开发的核心技术方面已经具备了强大的能力,但在产品研发的方面的创新思想较为薄弱,一味效仿,追随其后,后续产出的作品同质化强。腾讯公司出自Unty3D引擎的MOBA类手游《王者荣耀》,在2018年以19.3亿美元的的年收入登上全球收入第一手机游戏的宝座,更是在2019年免费游戏年收入排行榜上,以一亿的年收入差距压制了网游巨头《英雄联盟》,同期挤入了前十的游戏还有出自虚幻4引擎的手机游戏《和平精英》,亦出于是经营模式的不同,国内虽拥有制作优秀游戏的水平,但是在以盈利为主要目的游戏产业里,国内的游戏厂商更倾向于避开高额的经济风险降低开发成本,着重于获得用户后的运营管理,依靠着巨大的玩家基数和优秀的运营模式获得巨额利润,在经营上取得巨大的成功,从而作品本身缺乏新鲜感与冲击力。设计思路本设计计划基于Astar寻路算法,以观察战略形式决定士兵落点及进攻方向的操作方式,在士兵部署后通过Astar寻路算法自动寻找距离最近的攻击目标进行寻路及攻击。制定多个士兵状态互相协调的AI系统,完成防御建筑与士兵之间的包围盒互相检测与自动攻击,制作不同的兵种AI与防御建筑类型来提高可玩性,初步设想兵种分为普通战士、拥有高额生命值的兽人族佣兵、拥有在远程攻击能力的射手或法师;防御建筑类型分为单体攻击的弓箭发射塔及范围伤害的炮塔。在士兵部署后玩家可以通过使用通关后获得的辅助魔法辅助场上的士兵进行作战。每一关根据持有的金币雇佣不用费用和属性的兵种进行战斗。让玩家在观察进攻地形的同时思考优势兵种以及进攻思路从而获得战斗奖励,在战斗中让防御类建筑概率掉了辅助魔法药水,增加战斗的多样性和未知性,从而增添游戏的趣味性。在场景中使用火焰、雷电、爆炸等粒子效果增加游戏的视觉冲击力。
游戏开发工具介绍游戏引擎游戏引擎是将游戏开发过程中常用的模块组建在一起的工具,能够减少游戏开发中花在基础部分建设的时间,通常包括物理引擎、音效、脚本引擎、渲染引擎、动画系统、碰撞检测系统几个部分,是当下游戏研发过程中必备的重要工具。优秀的游戏开发引擎往往可以更好地孕育优秀的游戏。Unity3D游戏开发引擎Unity3D的logo由三个互相连接着的箭头组成,正如Unity这个名字一样寓意着团结。Unity公司在游戏开发成本高昂的背景下,发布了功能强大的免费独立版Unity2.6,且依靠着对iOS和Wii(任天堂电视游戏主机)平台的支持的在众多游戏引擎中脱颖而出。本设计使用的版本为Unity2019.2.19。Unity3D游戏开发引擎(以下简称U3D)是世界上用户量最多的游戏开发引擎,拥有适合新手学习的免费个人版和深度开发的专业版,引擎中集成了一系列用于游戏开发的模块化工具,凭借着强大的跨平台特性在顶尖游戏开发引擎里占据了一席之地,时至今日,U3D所支持的研发平台已超过30个,强大的跨平台特性意味着使用该引擎将能够大量减少开发过程中用于解决平台差异的时间。U3D在集合多种开发工具的同时拥有着个性化的人机交互界面,具备着视觉化编辑(Scene视图)和预览动态游戏的特性(Game视图),动态监测资源占用状况的性能分析器(Profiler),同时拥有可以在游戏运行图中实时修改参数的属性编辑器(Inspector视图)。有了跨平台及用户基数大的基础,使得U3D在资源的获取以及导入上也尤为方便,U3D几乎能够支持所有的主流三维格式,且能够将贴图材质自动转换为能与相关应用程序协调工作的U3D格式,U3D还拥有着官方的资源商店AssetStore,用户能够在AssetStore上发布或下载导入各种需要的资源。在脚本编译上,U3D中的MonoDeveloper编译环境支持本设计使用的C#语言,此外还支持Boo、JavaScript。A*PathFinding组件本设计中引入了AssetStore中的AstarPathFindingProject(A*寻路插件),用于辅助游戏中的寻路逻辑。该插件中定义了三种网格类型:第一种是可实现精确的移动,高速度且占用内存最小的Navmeshes(导航网络),Navmeshes是基于三角形构建的导航网络,每个三角形都制定了AI可以行走的区域,因为导航网格可以构建出带有很少三角形的大区域的缘故,使得Navmeshes适合在在包含的开放区域少的游戏里使用;第二种是能够快速更新、具有更高灵活性的GridGraphs(网格图),GridGraphs通过将节点像网格一样排列的模式来构建网格图,每一个节点都被放置在场景中并且在网格坐标处采样收集信息,这样的规则结构让GridGraphs能够更快速地更新,适合需要频繁更新地图建筑物状态地游戏,常用于TD类游戏和RTS类游戏;第三种是灵活性最高且能够实现自定义的PointGraphs(点图),能够从向其抛出的任何点列表中构造点图。本设计采用的网格类型为GridGraphs。AstarPathFinding组件可以同时支持大量的代理寻路,能够管理巨大的游戏世界。同时项目中含有丰富实用的API接口,帮助开发者实现一些常用的功能,如在网格图中添加建筑物生成障碍物、在导航网格中生成随机点等功能,还有最重要的该插件支持发行到U3D支持的任何平台。物理引擎3D游戏在体验上本质区别于2D游戏的关键是物体的物理真实互动效果,U3D在原有的PhysX物理引擎外,在去年还加入了Havok物理引擎,两款物理引擎的加持使U3D能够非常出色地模拟物理效果,但是需要注意的是,Physx物理引擎使用的摩擦模型是针对性能和稳定性的模拟,摩擦力计算在两个面接触的时候会被计算成现实物理学的两倍,需要调整摩擦系数才能还原更真实的结果。许多优秀的游戏大作及电影都会使用物理引擎,在U3D中可以给游戏物体添加Rigidbody组件来赋予物体物理效果。相似的组件还有CharacterControllers、Collider等,开发者可以调节组件中的参数来实现预期的物理效果。任何一个游戏的设计都需要其物体特性的合理性,这样才显得真实可信。粒子效果系统现实世界中的水流、烟雾、火焰、浮云、星辰、光线、爆炸等抽象的视觉效果,这些抽象的视觉效果很难用传统的渲染技术达到很高的真实感,而粒子系统则是模拟这些特定的模糊现象的计算机图形学技术,通过粒子的模糊性和制定的特定运动规律和边界参数描述粒子,使得粒子系统能够帮助开发者在游戏世界中制造现实中的模糊事物。粒子系统的核心为用于控制共享时间轴的ParticleSystem,场景中可以拥有多个粒子系统,并且每一个粒子系统都有自己单独的时间轴,发射后通过ParticlePainter对粒子进行可视化显示,粒子可以被赋予逐渐透明化的贴图材质和粒子渲染参数来达到模糊的视觉效果。粒子系统与物理引擎互相辅助可以还原出以假乱真的游戏世界,给玩家带来震撼的视觉体验。C#C#是微软公司发布的高级程序设计语言,拥有面向对象的特性,与Java有着相似的编译成中间代码再运行的流程和编辑语法,和Java有很大的相似之处。C#并不是跨平台语言,只有运行于.NETCore平台(微软官方的开源计算机软件框架)上时才能实现跨平台,本设计的C#语言运行于.NETFramework4.7之上,而能够在U3D中使用C#编辑脚本的原因是在U3D中Mono对C#语言进行了重新实现,使得U3D能够使用C#语言来进行开发。而选择C#作为开发语言的原因是C#比起需要频繁拆装箱操作的UnityScript速度更快,U3D的C#语言的开发文档也是最完善的,在遇到问题的时候更容易解决。VSVS全称MircrosoftVisualStudio,是在编程行业内非常常用的一套开发环境,包括了开发一个软件所需要的绝大部分基本工具,编辑的代码程序能够在微软支持的所有平台运行,本设计中采用的VS版本为VisualStudio2017,.NET版本为.NETFramework4.7。AudacityAudacity是一款流行于Linux系统的的免费跨平台音频处理软件,具有小体积、开源、操作简单、功能丰富等特点,本设计中将使用Audacity裁剪制作游戏内需要用到的音频资源,使用的版本为Audacity2.3.2。VLCVLC是一款开源的跨平台多媒体免费软件,这款软件支持众多的音频与视频解码器,能够对音频或视频文件进行格式转换,同时还有体积小巧的特点,本设计中将使用VLC将视频素材.flv文件转换成U3D使用的的.ogg格式音频文件供Audacity裁剪使用,使用版本为VLC-3.0.6。GIMPGIMP全称GNUImageManipilationProgram,是一款免费开源的跨平台图像处理软件。不得不说的是,这些开源免费的软件通常直接就把软件的功能精简后作为软件的名称,GIMP拥有不逊于图像处理巨头Photoshop的功能的同时,拥有比Photoshop更简洁的界面,外加上软件体积小及免费开源的特点,GIMP在Linux系统下深受欢迎,拥有Linux系统的Photoshop称号,本设计将使用GIMP裁剪修改UI图片的素材,使用版本为GIMP2.10.12。
游戏设计目标和任务撒本设计将完成一款缓解生活中快节奏状态的休闲即时战略游戏,用于调整工作生活中的不良情绪,同时在闲暇时间感受游戏的带来的快感,体验用领袖的玩家视角调遣战士进行攻击的感觉,从而达到在游戏后心旷神怡的良好状态的目的。亦能在游戏中锻炼到玩家的、判断能力和逻辑思维能力和对环境的观察能力,发挥策略型游戏的良性功能。功能需求分析能够获取鼠标点击信息的按钮以及在游戏场景中再次点击后能够在鼠标指针处生成对应兵种的士兵。生成的士兵能够自动寻找距离最近的敌方目标绕开障碍物进行寻路。敌方建筑能够被士兵攻击并破坏消除。士兵破坏首要目标后能够自动寻找下一个攻击目标并自动寻路。士兵需要能够被防御型建筑物攻击造成伤害并消除。拥有远程攻击能力的士兵需要能够隔着城墙攻击墙内的建筑物。防御型建筑需要选中进入范围的士兵进行攻击。防御型建筑在消灭当年攻击目标前不能将火力转向其他目标。需要有选定防御建筑为攻击目标的兵种。需要有范围攻击的防御建筑。攻击目标消灭后能够自动选择下一个目标,直到范围内没有目标为止。带有生命值的游戏物体在受到伤害时候需要能够显示血条。血条需要以不同的颜色来动态地反映游戏物体的生命状况。构建金币系统,玩家通过使用拥有的金币雇佣士兵,进行游戏获得金币。构建根据破坏程度来对游戏结果进行评分的评分系统。声音开关选项按钮、暂停按钮、认输按钮和重新开始按钮。需要有开始界面、兵力储备界面、加载界面、结束界面。性能需求分析士兵生成按钮点击后响应时间在0.2秒以内。士兵寻路AI响应时间在0.2秒以内,寻路过程中除非目标丢失不得停顿。士兵在抵达攻击范围处在0.2秒内需要做出攻击。士兵目标丢失后停顿时间在0.5秒内需要做出寻找新目标行为。防御塔在目标进入范围的响应时间在0.2秒内。防御塔丢失当前目标后重新选择攻击目标的响应时间在0.2秒内。在场景中存在50个或以上AI同时自动行动时候保持流畅。在场景中连续使用10个以上法术召唤大量陨石时需保存流畅。数据需求分析建筑物在游戏中拥有最高的生命值。单体攻击型建筑在游戏中拥有最高的攻击距离。单体攻击建筑攻击力数值需要高于范围攻击建筑的攻击力数值。肉盾战士在士兵中拥有最高的生命值体现肉盾价值。肉盾战士只能拥有最低的移动速度。远程士兵只能拥有较少的最大生命值和攻击力。远程士兵的攻击距离应小于任何防御型建筑物的攻击距离。总体设计
游戏功能图游戏内的对象大致分为三种:士兵、防御塔和法术药水,士兵功能包括选择目标、寻路移动、攻击和死亡;防御塔功能包括选择攻击和受损;法术药水功能包括碰撞伤害和粒子效果,整个游戏的大体功能图如下。图3-1游戏功能图
游戏流程图玩家在进入游戏后在士兵购买页面购买士兵进入游戏场景,在场景中点击士兵选择按钮部署士兵,士兵AI开始行动,AI全部阵亡则游戏失败,摧毁所有目标则游戏胜利,整个运作过程如下。图3-2游戏流程图
E-R图E-R图中展示了士兵实体、法术药水实体及陨石实体的基本属性及与建筑物实体之间的联系,士兵实体中包含了两个特殊实体弓箭兵和肉盾战士,分别拥有远程攻击距离和优先攻击防御建筑的特性,图示如下。图3-3E-R图
游戏素材模型获取在中下载的人物模型和贴图:士兵、弓箭兵、肉盾战士。图4-1肉盾战士图4-2弓箭兵图4-3士兵给人物模型配置模型贴图。图4-4贴图配置在AssetStore中下载的模型资源:lowpolymedieevalbuildings资源包,包含房屋模型、弓箭塔模型、炮塔模型。图4-5资源包 Floormaterialspack资源包,包含地板材质贴图。 YughuesFreeGroundMaterials资源包,包含草皮地板材质贴图。 SkyboxSeriesFree资源包,包含天空盒子材质贴图。 DreamForestTree资源包,包含树木贴图、草丛贴图。 RockyMeadowAsset资源包,包含石头模型与贴图。图4-6资源包免费的中世纪武器资源包,包含弓箭模型与贴图。Potion,CoinAndBox资源包,包含法术药瓶、宝箱模型与贴图。Fire&SpellEffect资源包,包含陨石模型与贴图。图4-7资源包动画获取在中下载普通骨骼的动作素材包,分段裁剪出角色的基本行为动画:步行、跑步、闲置、攻击、死亡、欢呼。粒子效果获取使用Fire&SpellEffect资源包中内汉的爆炸粒子效果及火焰粒子效果。布置场景和预制体将下载的模型资源导入到游戏目录下,配置贴图测试完毕后打包成预制体供游戏逻辑使用。
游戏设计搭建场景场景设计游戏中包含两种场景:兵力准备阶段的雇佣士兵场景1(游戏准备阶段界面)和下落士兵的游戏进行场景2。场景1将在Game视窗中向玩家展示兵种的外观及其属性面板以及价格,在展示的兵种下方放置购买按钮,当按钮被点击时、玩家能够在场景2种使用该兵种的数量增加1,同时扣除兵种价格对应的金币。场景2为游戏场景,包含以下模块:供士兵移动寻路导航的战斗地面(以下称导航地形)。安置树木、草丛、石头等周边环境游戏对象的边缘缓冲地面(以下称环境地形)布置外景环境的天空盒子。敌方建筑与城墙。放置于Game视图底部的玩家剩余可使用士兵/物品的UI面板。能够自由移动转向且能够切换2D/3D(正交/透视)视图模式的摄像机。场景制作场景1制作思路:使用GIMP裁剪购买界面UI图片至包含三个透明窗口,将摄像机模式调整为Othographic(以下称为正交)模式,将三种兵种放置于对应的透明窗口之后,设置三种兵种的默认动画为闲置,这样在玩家在此界面中就可以观察到兵种动态的活动画面。在兵种的购买按钮上链接上兵种购买的函数,将兵种数量及对应种类存入一个数据在各个场景种互相连通的脚本中并在加载游戏场景时将兵种数量数据传递出去,具体实现逻辑见5.6.4其他界面。场景2制作:在测试各模块功能的时候均使用最基本的Plane平面来模拟导航地形,而在正式的合成各模块的场景中,使用U3D的地面建造系统Terrain来搭建地形,直接右键Hierarchy面板中的空白部分创建3DObjectTerrain。在Inspector视窗中选择Terrain组件中的TerrainSettings按钮处设置地形的大小限制,设置TerrainWidth及TerrainLength为160,设置此组件的Layer为Ground。再创建环境地形,设置TerrainWidth及TerrainLength为180,调整导航地形位置Transform组件的Position属性至环境地形的中央。通过Window下的Rendering打开LightingSettings窗口,将准备好的天空盒子素材拖入Environment下的SkyboxMaterial中,在场景中完成主要地面及外景的搭建,在Terrain地形外圈使用PaintDetails组件与PaintTrees组件铺设草坪与植株模型贴图完成周边环境的搭建。图5-1游戏主地面整体图5-2地形边缘不可移动区域植被士兵脚本士兵基本属性基类士兵基类脚本ArmyController:为所有士兵类型定义了受到伤害的函数,在不同类型兵种受到伤害时均调用此函数完成士兵生命值的衰减。图5-3士兵基类脚本AStarPathfinding插件实现寻路实现原理与使用A*寻路算法是一种基于静态位置的高效搜索算法,使用A*寻路算法来搜索路径一般有两个条件:第一是场景有静态路网,即地图中的地理属性是设计好的静态属性;第二个是已知出发点和目标点,A*寻路算法的结果是通向目标点的最短路径,采用启发式搜索的方式一步步地判断出发点邻近方格到达目标点及出发点的成本,选择成本最低的方格作为移动方向,在此方格中再次判断临近方格到达目标点及出发点的成本选处下一个最低成本的方格作为移动方向,直到到达目标点。贪婪且高效的搜寻方式使得A*寻路算法成为了游戏开发最常用的寻路算法,没有之一。通过阅读A*PathfindingProject的官方文档及资源包中自带的示例场景中演示的各种环境下的寻路脚本,了解到该资源包实现A*寻路的方法,开发者可以在场景中挂载AstarPath组件(如图5-4所示)进而在导航地形上生成不同种类的导航网格,在Graphs下定义及修改网格的大小及位置,同时可以在Collisiontesting下的ObstacleLayerMask中定义不可以作为移动区域的障碍物层。在需要寻路的游戏物体上挂载Seeker组件及AIPath组件(如图5-5所示),Seeker组件将计算出挂载物体的位置到传入IAstarAI接口的目标点的路径,AIPath组件则定义了寻路物体的基本属性:半径、高度、速度、转向速度等基本属性,并使挂载物体遵循Seeker组件计算的路径移动,本设计在这个基础上编写运动逻辑脚本构建各个兵种AI,实现不同攻击距离的兵种的差别寻路。图5-4AtraPath组件下的网格类导航网格的生成与配置图5-5寻路游戏对象上挂载的AIPath组件与Seeker组件配置肉盾战士肉盾战士在逻辑上除优先选择防御塔作为优先攻击目标寻路外其余部分与普通士兵基本相同,参考以下的战士逻辑,肉盾战士在本文中不做描述。战士寻路函数如直接选择建筑物作为寻路目标点,所有以此建筑物为攻击目标的士兵都会朝建筑物中心坐标进行移动,士兵寻路过程中将出现互相阻挡的状况。且建筑物的模型中心偏移时,将出现目标点固定以至于士兵会饶到建筑后方的情况,为解决此问题,这里使用指向建筑物的射线检测与建筑物包围盒碰撞处获取碰撞信息将碰撞位置作为士兵的寻路目标点。图5-6士兵寻路函数Seek战士攻击函数士兵的攻击逻辑分为三部分:第一部分为遍历所有建筑对象,通过存入列表并获取距离进行长度排列得出最近的建筑物作为攻击目标触发寻路函数;第二部分为士兵到达寻路目标点后检测建筑物的存活状态,满足攻击条件则播放攻击动画。第三部分为士兵触发攻击动画后,在动画状态机控制脚本里检测攻击动画播放进度,到达挥刀落下处时触发伤害函数。图5-7遍历建筑物选择攻击目标图5-8检测是否满足攻击条件图5-9动画途中触发伤害函数弓箭兵寻路函数弓箭兵区别于普通士兵的地方在于弓箭兵需要能够隔着城墙对建筑物进行攻击,从而需要不一样的寻路函数,通过发射检测城墙层碰撞的射线以及不检测城墙层碰撞的射线获取两个碰撞信息,在两个碰撞点距离大于弓箭兵攻击距离时候,将选择不检测城墙层的碰撞点为寻路目标点,反之判定能够在城墙外攻击到该建筑,选择检测城墙层的射线碰撞点为寻路目标点,由于此处使用的距离并非为建筑与城墙的垂直距离,因此只能大致地判断,并不是绝对准确的结果。图5-10建筑物在墙内墙外的判断逻辑弓箭兵攻击函数弓箭兵类在基础属性上额外增加了用于检测攻击对象的攻击范围包围盒Range(如图5-13所示),实现了攻击范围包围盒Range中开放的IArcherRange接口中的RangeColliderHander方法,实现在寻路过程中当有攻击对象进入Range包围盒时将改变弓箭兵的状态为攻击状态的功能,Range包围盒上的脚本ArcherRange:开放了IArcherRange接口提供RangeColliderHander方法,并在包围盒检测到物体进入时将碰撞信息传递出去(此处Range包围盒在物理碰撞上设置了仅与建筑物层发生碰撞)并将自身的激活状态改为false,以避免同时碰撞两个物体的情况出现。,根据模型动画相对位置定义了弓箭的发射位置ShootPoint(如图5-11所示)。图5-11ShootPoint位置图5-12实现接口函数图5-13Range攻击范围包围盒弓箭运动脚本弓箭游戏对象由ArcherAttackSMB中实例化后从ArcherController脚本中获取了攻击目标,弓箭发射脚本ArrowShoot将完成弓箭朝攻击目标移动、与攻击目标接触后触发建筑物伤害函数后或者目标丢失后并销毁自身的功能,因建筑物为静态游戏对象,所以弓箭使用MoveTowards()函数移动。图5-14弓箭发射脚本逻辑建筑物脚本普通建筑基类建筑物基类脚本定义了生命值、健康状态等变量和基本的触发伤害函数、获取声明状态函数、获取血量比例函数。在生命值小于0后摧毁建筑物游戏对象的同时使用AstarPath.active.UpdateGraphs()函数更新建筑物占地区域的导航网格信息使该位置变回空地。图5-15建筑物被摧毁后更新导航地形防御塔类防御塔控制脚本将进入防御塔检测包围盒士兵游戏对象存入待攻击列表中,并将离开包围盒范围的游戏对象从待攻击列表里删除。定义了一个用于比较的巨大参数,遍历待攻击的列表,计算每个元素与防御塔的距离并比较获得距离最近的元素作为攻击目标,实例化炮弹并将攻击目标的坐标传递给炮弹。图5-16选择攻击目标函数炮弹逻辑炮弹外表为火焰粒子效果,炮弹内部是一个透明的球形的检测体,检测体朝向防御塔类传递过来的坐标参数进行非指向性移动,如与士兵类型的游戏对象或者地板接触后将返回碰撞信息,信息传递回炮弹主体后实例化爆炸包围盒,爆炸包围盒实例化0.1秒后自动销毁,期间接触的士兵受到伤害。图5-17炮弹移动逻辑法术支援陨石法术药水脚本陨石法术药水逻辑:药水被实例化后将在药水斜上空处实例化一定数量的陨石,生成的陨石以赋予Rigibody.velocity一个朝向药水周边的一个随机坐标的向量的方式移动。陨石的生成范围为设定好的高空位置处的一个单位球体内的随机一个点,目标点为药水位置处单位球体乘设定半径的单位平面(通过设置y坐标为0将随机获取的点移动到平面上),生成陨石的延迟时间、大小、旋转方向均为随机获取的数字,陨石生成时在音源列表中选择随机的发射音效,接触地面或建筑物爆炸时候也选择随机的爆炸音效以及实例化陨石大小比例对应范围的爆炸粒子效果,每0.5秒生成一次陨石,每次生成一定数量的陨石,每个陨石通过协同程序延迟随机的时间后生成,使得陨石的生成在视觉上连续,且在陨石预制体上挂载尾流渲染器(TrailRenderer组件),此组件会在游戏物体位置发生变化时渲染尾流效果,在脚本中还根据陨石的大小来改变尾流渲染的规模,使得陨石效果更为真实。图5-18随机的陨石生成逻辑图5-19陨石效果预览爆炸粒子效果爆炸效果的实现原理:将爆炸图片通过粒子的形式显示,在显示的时候将一定数量的爆炸图片边缘透明化并朝向设定好的随机方向扩散移动,从而模拟仿真的爆炸视觉效果。图5-20爆炸材质贴图图5-21粒子系统配置摄像机脚本摄像机旋转摄像机旋转:当鼠标右键处于按下状态,摄像机将朝向鼠标指针指向的的方向。摄像机旋转逻辑:在U3D的世界坐标中(如图5-22所示),当Transform.Rotation.x增大时,游戏物体将沿着x轴顺时针旋转,当Transform.Rotation.y增大时,游戏物体将沿着坐标轴的y轴顺时针旋转,根据这个规则,使用两个变量获取鼠标位置的移动增量的方向向量,从而获取与该方向向量(x,y)垂直且相对朝向相反的向量(-y,x)作为摄像机欧拉角增量。
图5-22U3D世界坐标系图5-23摄像机旋转代码摄像机运动摄像机运动:当鼠标中键处于按下状态时,摄像机朝着鼠标移动方向移动摄像机运动逻辑:根据U3D坐标系原理,使摄像机以自身坐标为基准朝鼠标移动增量方向的反方向(-x,-y)移动。(代码如图5-24所示)图5-24摄像机运动代码鼠标滚轮与正交摄像机与透视摄像机交互鼠标滚轮作用:玩家往前滚动鼠标滚轮,放大游戏界面,往后滚动鼠标滚轮,则缩小游戏界面。鼠标滚轮逻辑:在普通的透视摄像机模式中,将鼠标滚轮的增量mouseScrollDelta.y以一定的比率用作于摄像机transform.position.z的增量以实现摄像机往前移动的效果;而在正交摄像机模式(平面2D模式)中,摄像机往前移动没有意义,摄像机获取的画面为2维图像,无近大远小的区别。所以在正交摄像机模式中,将通过鼠标滚轮直接改变正交摄像机的窗口大小(orthographicSize参数表示正交摄像机参数Size,如图5-26所示)来放大图像。图5-25鼠标滚轮于正交摄像机与透视摄像机间的交互代码图5-26Camera组件Size参数UI设计士兵血条士兵的血条以绿色的图片形式挂载于士兵上方,在游戏场景中,血条图标的父对象画布将通过脚本控制朝向摄像机。图5-27血条UI画布朝向血条图片填充方式设置为水平模式(Horizontal),并设置填充起源为左边,使得血量从右侧开始衰减,填充重量设置为1,将通过脚本控制血条图片显示百分比随士兵血量情况动态展示,且在士兵血量下降到百分之30以下时将血条颜色改为红色。图5-28血条Image组件参数图5-29血条控制脚本防御塔血条防御塔血条除初始颜色为紫色与士兵血条不同以外,大体实现逻辑与士兵血条的实现逻辑相同,此处不做详细阐述。士兵数量栏与摧毁度评级士兵数量栏功能:放置选择不同兵种类型与法术药水的按钮,并显示剩余数量。当玩家点击按钮时,下一次在场景地面上的点击将按钮对应的士兵或法术药水实例化到鼠标点击位置并将此兵种或法术药水的剩余数量减少1。摧毁度评级:遍历游戏场景中的建筑物游戏对象,以三颗星星的形式表示玩家对此关卡的摧毁程度进行评级,建筑物数量每减少百分之33则点亮一颗星星,三颗星星点亮即表示游戏胜利,同时士兵停下移动并播放欢呼动画。图5-30游戏场景UI画布预览图5-33士兵数量栏示例代码5-34士兵播放欢呼动画其他游戏界面开始游戏界面:包含难度选择按钮、音量开启/关闭按钮、和兵种购买界面跳转按钮,鉴于此界面内容均为常规游戏的基本功能,本设计将不对此界面的实现作详细描述。游戏准备阶段界面:包含普通士兵、弓箭兵、肉盾战士及陨石法术药水的模型及动画,通过TextMeshProUGUI文字组件显示界面中的标题字体及需要用于计算的兵种数据变量,每个兵种类型均携带一个购买按钮及取消购买按钮,在两个按钮中间显示该兵种当前已购买的数量,当兵力储备完毕后,点击Ready按钮跳转到游戏界面,UI元素布置结构如图5-35所示。图5-35UI元素布置结构布置好UI元素后,将游戏窗口的分辨率改为1680×1050,给场景相机添加灰暗的天空盒,同时在场景中放入兵种及陨石法术药水模型并配置动画资源。(如图5-36所示)图5-36场景最终效果预览场景外观搭建完毕后,编辑按钮函数,在场景管理器脚本种引入TMPro包,使用TMP_Text.text参数改变士兵数量的显示文本,兵种数量增加减少逻辑将封装函数供按钮点击触发,在剩余金币数量大于兵种价格时购入兵种,在剩余兵种数量大于0时售出兵种。图5-37药水购买函数及普通士兵售出函数图5-38实时更新TMP文本内容添加音效开始界面UI按钮点击音效及背景音乐。购买兵种页面购买按钮及删除按钮点击音效、背景音乐及点击兵种触发语音。游戏场景中的士兵选择按钮点击音效。士兵部署音效、士兵冲锋语音、士兵攻击命中音效、士兵死亡音效、胜利音效。防御塔炮弹发射音效、建筑物摧毁音效。惊喜盒子音效、法术药水落地音效、陨石运动音效、陨石撞击音效。其他优化添加完音效后,整个游戏的核心功能已经全部完成,接下来在U3D中使用不同的条件多次运行游戏场景观察游戏中是否会出现异常,以下是发现的代码逻辑问题及解决方案。问题1:游戏准备阶段界面的士兵购买按钮触发位置与按钮位置不符,触发位置在按钮的右侧区域。原因及解决方式:这个问题出现的原因是在定义UI按钮位置时候复选了购买按钮和售出按钮并一起通过鼠标移动,在这之后将游戏分辨率从1920×1080更改为了1650×1050。将购买按钮删除重新创建解决了此问题。问题2:在游戏运行场景中,点击了兵种选择按钮后,鼠标点击到游戏地形之外的地方或者点击到了UI面板依然会使士兵数量减少,前者会丢失一个士兵,后者会在鼠标点击兵种按钮切换兵种时同时生成上一个选择的兵种类型。原因及解决方式:场景中使用从摄像机位置发射出去的射线来检测点击游戏地板事件,这个射线穿过了UI面板。引入UnityEngine.EventSystem命名空间获取鼠标点击UI面板事件,使鼠标点击到UI按钮时不触发游戏地板点击事件。图5-39点击逻辑修改问题3:两个或两个以上的防御塔同时攻击一群士兵时,其中一个防御塔在选择下一个攻击目标时出现空元素或者数组越界异常。图5-40数组越界原因及解决方式:逐帧运行游戏后得知问题出于防御塔B将防御塔A的待攻击数组中的元素选作为攻击目标消灭后,防御塔A再次遍历待攻击数组选择攻击目标时访问了空元素或空数组下标。因此在防御塔每次遍历待攻击数组选择攻击目标之前先判断数组内是否包含空元素,如存在空元素则将其从数组中删除再进行距离判断。图5-41防御塔选择攻击目标函数修改问题4:建筑物被摧毁时留下透明障碍地形。图5-42地形残留原因及解决方式:建筑物摧毁函数中包含了地图更新函数却没有按照预期执行,且此问题并非每次都会出现,因此猜测问题的来源是地形更新函数对地形的更新处理常常需要一帧以上的时间,查阅AStarPathfinding的脚本手册和内置的寻路Demo的障碍清除脚本后,改用协程延迟一帧来实现地形的更新后问题消失。图5-43延迟一帧删除建筑物除逻辑Bug修复外,对项目整体进行了优化调整,其中共包括:将代码逻辑中的调试用的输出语句注释掉,将为直观观察游戏物体当前攻击目标的射线绘制部分注释掉,删除游戏物体上不必要的碰撞体和角色控制器,去除建筑物Rigibody组件上的UseGravity选择,去除A*导航网络组件AstarPath组件上的ShowGraphs选择,优化寻路逻辑结构,使每个士兵在Update()方法中尽可能地减少寻路次数。图5-44建筑物Rigibody组件配置图5-45AstarPath组件配置游戏包导出最后对游戏进行Windows平台导出,在导出的过程中出现了错误:图5-46导出游戏包错误信息其原因是火焰爆炸资源包的示例脚本中使用了UnityEditor命名空间,在导出游戏包后将无法使用,此脚本无关本游戏逻辑,因此直接打开此脚本添加#ifUNITY_EDITOR#endif条件使此脚本逻辑只在U3D编辑器中使用。解决此问题后游戏包顺利导出。
游戏测试试玩体验在游戏的打包
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 家装橱柜定制合同协议书
- 在学校开餐饮计划书怎么写
- 2025年油套管市场需求分析
- 数字媒体项目商业计划书
- 猫常见病的防治
- 事件营销文案策划方案模板
- 智能家居环境监测系统项目可行性分析报告
- 书籍类活动策划书3
- 共享茶室商业计划书方案
- 水泥企业收购调研报告
- 2022年四川省成都市中考英语试卷及答案
- 商务英语写作实践智慧树知到答案章节测试2023年中北大学
- 新年春节廉洁过年过廉洁年端午节清廉文化中秋节廉洁过节优秀课件两篇
- GB/T 10920-2008螺纹量规和光滑极限量规型式与尺寸
- 认知宇宙飞船之星际探索
- 皮肤病理知识学习整理课件整理
- 人工智能课件213产生式表示法
- 空调维保质量保障体系及措施方案
- 建筑桩基技术规范2018
- 信息隐藏与数字水印课件(全)全书教学教程完整版电子教案最全幻灯片
- c型钢理论重量表规格表
评论
0/150
提交评论