基于UnityD的跨平台格斗游戏设计_第1页
基于UnityD的跨平台格斗游戏设计_第2页
基于UnityD的跨平台格斗游戏设计_第3页
基于UnityD的跨平台格斗游戏设计_第4页
基于UnityD的跨平台格斗游戏设计_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

页绪论手游的发展手游即手机上的游戏。随着移动互联网时代的到来,如今,手机除了满足大家发短信、通电话的基本需求外,玩游戏早已成为手机最重要的功能之一。手游早期为简单的文字游戏,随着手机像素、运行效率的提高,一些具备了简单彩色图形的手游开始面向用户,这类游戏大多使用JAVA语言编写实现,不论是画面,还是玩法都比上一个代提升了许多,然后是近几年的app应用,例如N-Gage,N-Gage是诺基亚在那个时代所研发的手游平台,但是由于移动网络无法很好的支持手游下载、支付渠道也稀少而复杂,N-Gage始终没能大红大紫。Android和IOS的兴起,手机在其本质工作几乎毫无进化的几年之间却在其余几乎每个领域发生了翻天覆地的变化,最简单并且最直观的一点表现就是性能参数了,手机性能参数的提高增加了应用的安装数量及功能,在这之中,手游获得的增益很大。门槛低,投入小,回报大,是手游的主要优势,这也使很多游戏开发商纷纷转型手机游戏的开发。随着手机游戏市场的日渐升温,手游已经开始主导着整个移动互联网的发展,千万级用户,千万级收入已经不再是空话,手机行业的发展极大推动了手游的发展。近年来,手游更是有了质的飞跃,在手机行业跨越式的发展下,手机系统再也不是当年NOKIA的塞班系统,iPhone的诞生,及其开创的触屏潮流,不仅革新了用户操作手机的体验,而且也使手游脱离了物理键盘的局限,有了除“上下左右”之外的新的玩法。后来谷歌研发的安卓手机系统诞生,触屏智能更加便捷,得到了很快的普及,谷歌市场也出现了各种各样的安卓游戏,随后的几年安卓手游成疯狂的趋势增持。研究目的及意义小时候接触的小霸王游戏机,当时街霸对打、忍者神龟系列、刀侍等格斗游戏就非常火,此类游戏的受益群众非常多。再加上手机性能的提高,3D格斗游戏在手机上也越来越流畅,格斗游戏在以后将非常有优势。相对页游、端游来说,手游开发在当前游戏领域还算比较少,可探索的区域还有很多,比如前一段时间挂机游戏能火也是出乎意料的结果。生活节奏的加快,碎片化的时间模式推动玩家朝手游方向靠拢,并且当前正值手机领域高速发展,这提供给玩家一个很好的游戏载体,这一机遇迫使部分游戏开发商纷纷投身手游开发,游戏行业即将掀起一场手游风暴。论文架构本文共六个章节内容,主要介绍一款游戏从刚开始构思到开发完成的整个过程。第一章:绪论,简要介绍了手机游戏的发展历史,本课题的研究目的和意义。第二章:游戏开发环境,详细介绍了本次毕设的开发引擎-Unity3D界面的使用,并且就UI界面的设计做详细的说明。第三章:游戏需求分析,列举了游戏中的一些需求点,并对游戏中出现的一些相关技术进行说明。第四章:游戏设计实现,列举游戏中比较重要的几个系统(登陆界面、游戏主界面、关卡选择界面、战斗系统),对其功能的实现进行脚本的说明。第五章:游戏测试,游戏项目完成后,对游戏进行测试,并提供测试数据。第六章:总结与展望,根据本毕设的开发现状,作总结与展望。

二、游戏开发环境Unity3D游戏引擎Unity3D是一款集三维视频游戏、建筑可视化、实时三维动画于一身的专业游戏引擎[1],其多平台性表现在它可将已完成的游戏项目打包成Windows、Mac、Wii、iPhone、Windowsphone8和Android等多种平台所对应的文件格式。具有高度优化的图形渲染管道和内建的NVIDIAPhysX物理引擎,使其能够较为真实地模拟3D物体的运动和碰撞。对DirectX和0penGL拥有高度优化的图形渲染管道,使其能够比较真实、清晰的显示各种材质、贴图。它支持大部分主要的文件格式,并能和大部分相关应用程序协同工作,使用者不再需要使用其他转换格式的软件,用起来更加方便快捷。Unity3D能够对编辑器、跨平台发布、地形编辑、着色器、脚本、网络、物理、版本控制等进行全面整合,优化使用界面,降低操作重复性,提高操作效率。这些都使Unity3D成为独一无二的游戏引擎。关于Unity3D的使用,需要了解以下几个方面的内容:主界面视图Unity3D界面上方为菜单栏,所有功能都可以在菜单栏中找到。菜单栏下方为具有各种功能的窗口,负责游戏项目的大部分操作,可将部分用得相对频繁的窗口单独拖出来放在外面,方便使用。Hierarchy窗口、Project窗口、Console窗口、inspector窗口、Scene窗口和Game窗口为主要的窗口,具体如图2-1所示:2-1Unity3D主界面Hierarchy窗口主要用于放置Gameobject,可以对Gameobject进行选中、重命名、拖动分层、添加组件等操作,并且Hierarchy的所有内容都会在scence窗口中显示出来。Project窗口为项目工程的文件入口,游戏项目的所有文件都可以在project中找到,进行资源替换、查找都要在这个窗口下操作。Console窗口为一个指令提示窗口,项目运行的各种情况都会在这边以CSharp语言的形式显示出来,包括错误、警告、运行成功等,通过查看此窗口,可以轻松找出报错的根源。Inspector窗口为Gameobject的编辑窗口,包括Gameobject的坐标、大小、附加控件及添加脚本等,一个Gameobject对应一个inspector,默认显示被选中的Gameobject的inspector窗口。Scene窗口真实地显示Hierarchy窗口中Gameobject的样式和Tranform位置,可对Gameobject进行选中、拖动、旋转等操作。Game窗口为运行项目时所呈现出来的真实游戏效果,为映入屏幕的画面。GameobjectGameobject就是一个容器,Unity3D中的任何组件、目标、模型都必须用Gameobject来承载,它可以是一张图片、一段单一的文字、或是一个简单的模型,取决于你给它添加什么内容。从Unity3D菜单栏的“Gameobject”中可以轻松创建一个空的Gameobject,快捷键ctrl+shift+N比较常用。如在一个空的Gameobject中添加一个Directionallight(单向灯光控件),则此Gameobject就是个灯光,可在inspector窗口编辑。Gameobject支持重命名功能,使开发者能一眼就看出Gameobject内的内容,提升工作效率,Gameobject还可以嵌套子Gameobject,方便进行资源的整合。Tranform(坐标)的理解如下图inpector窗口中的Tranfrom所示,Gameobject的坐标包含“P”“R”“S”三个坐标,“P”即position,为Gameobject的位置坐标,用于控制目标的方位信息。“R”即rotate,为Gameobject的旋转坐标,调节P坐标将使目标作出相应转向。例如将上面提到的单向灯光的Tranform“R”中的X坐标从0改成90,则此灯光从横向灯变成纵向灯。“S”即scale,为Gameobject的大小坐标,控制目标的大小尺寸,x、y、z对应Gameobject的长宽高。一个Gameobject至少包含一个tranform,有且仅有一个tranform。2-2Gameobject中的tranform脚本系统Unity3D提供强大的脚本系统,支持javascript、C#script、booscript语言[2],本次毕设用的是C#语言,如需要让某些Gameobject实现特定功能,可通过编写C#脚本,保存起来,并将脚本拖动到Gameobject所对应的inspector窗口,这样该Gameobject就具有脚本所描述的功能。2-3Unity3D中的脚本文件C#也叫做CSharp,是一种面向对象的程序设计语言,它继承了C和C++的强大功能,并简化了C和C++的一些复杂特性,使其成为当前.NET开发的首选语言。因为它强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程,使其成为系统开发和应用开发的最佳使用语言。Unity3D文件在Unity3D中的Gameobject文件,均被保存为后缀为.perfebs文件,也是Unity3D可读取识别的文件。做游戏项目资源是必不可少的,Unity3D自带的资源也是有限的,例如一些Unity3D里面没有的贴图、材质、animation动画等资源[3],需要通过其他途径查找,然后导入到Unity3D中使其变成可用元素。Unity3D也支持自制animation动画,在Unity3D菜单栏的“windows”中选择animation窗口进行动画的自制,将animation动画挂在Gameobject上可实现Gameobject的位移、放大缩小、渐变或其他更高级的效果。2-4animation制作工具游戏中的各种图标Texture文件需要制作成Atlas图集的形式,Unity3D提供atlasmaker工具,将想要的图标素材导入到Unity3D中,然后利用atlasmaker工具将素材更新到所需要的图集里。2-5atlasmaker界面Camera(镜头)正如电影导演手中的摄像机将故事呈现给观众一样,Unity3D中的Camera用于将游戏画面呈现给玩家,即Game窗口中的内容。一个视图中至少应该放置一个镜头,否则呈现出来的画面只会是一片漆黑。镜头的放置位置也决定了游戏体验,镜头应尽量放置在能看清整个场景的位置,距离适中,太近的镜头视距太短看不到远方的路障,太远的镜头看不清前方的物体,影响游戏体验。Unity3D中新建的工程都有提供一个maincamera镜头。另外,可以给镜头添加一些功能,如animation动画,在镜头上添加具有短位移的animation动画可以使其抖动。NGUINGUI为Unity3D的一款界面UI设计插件,使用NGUI可以轻松完成大部分2D界面设计,下面是NGUI的一些基础控件及关键点:Sprite(图片):如果要将一张图片放在界面中,需要选中一个Gameobject,然后添加UIsprite脚本(或直接使用NGUI创建一个sprite控件),该对象的inspector窗口中即出现sprite控件栏。如图1-2所示,点击Atlas选择图集,后面为选择图集的具体图片。2-6UISprite脚本界面Label(文本框):使用UIlabel脚本在界面中添加文字,文字颜色、大小、位置均可自己控制,如图2-7所示:2-7UILabel脚本界面Button(按钮):其实Button控件是由sprite、label和collider碰撞器组合而成的,应该包含一个父Gameobject,和三个子Gameobject。Collider为碰撞器,用于响应外界对此块区域的操作。当点击此块区域时,将执行某些处理,可由脚本控制。这三个也可全部放在一个Gameobject中,但是,这样做的缺点就是他们共用一个tranform,复用性不强。Tween(动画):即动画效果,包含颜色变化、大小变化、旋转变化、深浅变化等,类似animation动画,差别在于tween为写死的动画,没法像animation动画那样自由调节。可挂在任何对象上,并且需要选择如何触发此动画。如点击一下Button触发顶部按钮由透明变成正常颜色,这样就实现了简单的Tween动画功能。Depth(深度):界面为2D界面,没法避免窗口、图片重叠的现象,depth可以有效的将各个Gameobject分层处理。Depth值越低代表此物体越底层,将被depth值比他高的Gameobject遮挡住。NGUI还提供一些例如滑动条、输入框、下拉栏等更高级的控件,在本文不涉及到,在这里不做阐述。

游戏需求分析游戏基本介绍本毕设为一款使用Unity3D引擎制作实现的3D格斗游戏,脚本使用C#编程语言编写,主角为大家耳熟能详的钢铁侠,游戏整体风格偏机甲类,主要玩法即格斗。3-1战斗界面战斗界面如图3-1所示,玩家通过控制界面左侧的方向键(已隐藏)进行主角前后左右的移动,通过点击右边的攻击键实施攻击。游戏将给玩家带来超炫的格斗动作,逼真的打击感,通过较为真实的打击感,让玩家在游戏中感受快乐。需求分析设计游戏之前需要对游戏进行全面的需求分析[4],明确设计方向,然后写游戏的设计说明书,界面设计及一些功能性的东西可以参考市面上比较热门的游戏的做法,游戏将依据此份说明书进行设计。说明书应该包含游戏各个界面的介绍、每个按钮功能、以及游戏中每一步操作对应的响应方式。需求分析完需要构建游戏的系统框架,使用导图的方式将游戏的各个系统、模块一目了然的呈现出来。如图3-2所示,利用MVC框架将游戏的各个系统界面联系起来。3-2游戏系统框架场景模型的搭建一个可用的场景模型包含两个方面的属性,一方面是模型,另一方面是阻挡。单纯从可用性来说模型一点用处都没有,但是为了让玩家知道哪边可以踩、哪边是墙壁、哪边会产生碰撞,就必须设置模型。阻挡用于限制玩家的活动区域,也就是配合模型来使用的。可以说,没有阻挡的模型是不可用的,没有模型的阻挡是不具生命力的,两者密不可分。3-3一个模型所包含的内容如图3-3所示,inspector窗口中Cube(MeshFilter)为模型组件,BoxCollider为阻挡碰撞器,Center为此碰撞器的坐标位置,Size为碰撞器尺寸。MeshRenderer是材质组件,用于帮模型添加材质、贴图。3-4较为成形的场景模型模型众所周知,点成线,线成面,面成体。模型由面组合而成,模型的制作可通过3DSMAX等建模软件实现,面数越多的模型越精致,但是对系统性能的要求也越高。游戏画面是由计算机CUP和GPU实时处理演算出来的图像,面数越多对GPU的压力越大,易导致游戏画面卡,运行不流畅等情况,所以尽量选择低面数模型、优化所用模型材质能够大幅提高游戏性能。Unity3D提供一些简单的3D模型供玩家使用,如正方体、球体、圆柱体等多种模型,实际上,他们是属于添加了模型组件的Gameobject,这些模型可用于当做战斗场景,可以通过调节这些模型的长宽高来匹配场景人物模型的大小。阻挡Unity3D自带一些简单形状的阻挡,如boxcollider、meshcollider碰撞器。阻挡碰撞器只是个组件,想运用它必须放在Gameobject中实现,因为这些都是体阻挡,如果想要面阻挡,需把该阻挡对应的Gameobject中tranform的S坐标其中一个值改成0就行了。设置场景的各个方向阻挡,需要特别注意的是,给主角和NPC站立的那一面阻挡需要将阻挡对应Gameobject属性改成“ground”,否则角色无法站在阻挡上。设置四周阻挡,防止主角掉出场景外,四周阻挡必须足够高,超过角色所能跳跃的高度,防止主角跳出阻挡。碰撞检测游戏过程中经常会出现主角被墙壁所阻断,撞到NPC将其推开等情况,这些都是属于碰撞检测,Unity3D提供例如boxcollider(长方体)、meshcollider(圆柱体)等碰撞检测器[5],当检测到碰撞器时,调用OnControllerColliderHit()控制碰撞器碰撞函数,防止游戏过程中人物相互穿越、穿墙等情况的发生,有利于提高游戏的真实性。想要添加更多复杂的碰撞检测器,可通过3DSMAX等建模软件制作完成再添加到Unity3D中来。人物动作说明因为动作与模型的高度长短相关联,所以动作一般都是和模型绑定在一起,两个模型骨骼(高度、肢体长度)大体一样,可进行动作的复用,人物动作可以用maya等动作处理软件实现,动作应包含最基本的走路、攻击、跳跃等基本动作。本毕设所用模型、动作均来源于网络,且模型高度、骨架一样,动作复用同一套,节约开发成本,缩短开发周期。3-5动作文件脚本内容模型动作的导入将已制作好的模型动作文件导入到Unity3D引擎中,导入格式为FBX,并将模型所对应的贴图材质一起导入到Unity3D中。值得注意的是,无论之前在3DSMAX软件中的模型有没有材质,导入到Unity3D后,模型都是没有材质的。Unity3D配备了强大的编写材质和阴影的工具(ShaderLab),导入模型后,需要手动在Unity里面重新设置一遍材质贴图。动作处理导入到Unity3D中的FBX动作文件其实就是带序列帧的动画文件,它包含动作的所有动画,并标注出每一个动作的帧数范围。但是这些动画没法直接拿出来使用,需要进行脚本控制处理[6]。根据导入的FBX动作文件的序列帧,编写脚本,在某些条件下触发对应动画序列帧,制作对应的perfeb动作文件,比如按“攻击”按钮,触发攻击动画的序列帧等。一个动作应该包含四个属性:位移、伤害、声音和特效。3-6动作对应帧范围位移--即从动作开始到动作结束人物产生的位移。伤害—包含此动作所产生的伤害范围、击飞距离、高度等,但是走路动作是不具备伤害属性的。声音—即此动作的声音。特效—即此动作的特效。动作调优为了动作更加真实,经过动作处理的perfeb动作文件需要进行调优才算是一个合格的动作,比如一个攻击动作产生位移太大、走路能把人击飞等这些显然都是不合理的。动作调优即根据实际动作,合理的调节动作的位移、伤害、声音、特效,使它的伤害、声音、特效出现时机更加匹配该动作。另外,为了防止一个动作还未结束另一个动作就开始执行的情况发生,需要设置每一个动作的开始结束时间,这样能有效解决连招动作的施放问题。除此之外,为了防止出现按键重叠时动作出错的情况,每个动作需要设置施放优先级。经过以上三步调优后的动作更加接近真实。游戏镜头控制本游戏用的两种游戏镜头,camera和maincamera,camera为固定死的2D镜头,用于2D界面映射,maincamera用于3D场景映射,战斗时打开此相机。手机游戏比较头疼的问题就是屏幕太小,不好操作容易按错键,为了使玩家在手机上更便捷的操作,镜头将使用系统自带的跟进镜头脚本(firstpersoncontroller),将其挂在maincamera上进行镜头的控制,减少玩家控制过程中对于镜头的调整,使能更专注于战斗本身,简化了游戏操作,并且更为轻松。加载界面3-6加载界面由于不同界面之间的切换、界面到战斗场景的切换都需要加载各种数据,加载到内存完成才会显示出来,这需要花费一段时间,如果莫名奇妙的黑屏将会使玩家迷茫,使用加载界面作为过渡能有效的解决此问题。界面中下方为进度条,方便玩家理解加载的进度。

四、游戏设计实现各系统界面分析登录界面4-1游戏登录界面简图登录说明进入游戏后首先进入登录界面(图4-1所示),登陆界面采用快速登录方式,屏幕中上方为游戏名称,默认显示“基于Unity3D的格斗游戏”,屏幕中心为账号名称,可任意输入想要的游戏ID,下方“进入游戏”按钮,背景图可随时替换,点击屏幕后进入游戏主界面。界面设计登录界面相对其他界面来说较为简单,添加sprite控件,或者是新建一个Gameobject,并添加UIsprite脚本。将所需背景图拖入sprite中,将depth调为0,置于最底层,保证背景图不会覆盖到其他内容。同样的,新添一个label控件,将label文字内容更改为所需的游戏名称,depth值大于0就行。添加一个button控件作为进入游戏主界面的按钮,将button的文字改成“进入游戏”,调整Tranform大小来调节button碰撞器的大小,碰撞器大小尽量大,易于点击,用于响应手指点击后跳转游戏主界面。账户的输入使用NGUI输入框控件。功能实现点击“进入游戏”按钮,进入游戏主界面,实现代码如下:stringuserAccount=SystemInfo.deviceUniqueIdentifier;stringuserPassword=SystemInfo.deviceUniqueIdentifier;Show(false);HudManager.Instance.ShowDialog(DIALOG_TYPE.HUD_LOADING_BAR);KiiManager.Instance.RegisterIphone(userAccount,userPassword);Façade.instance.sendnotification(GAME_TAPE.HUD_MAINTEMP))说明:Show(false);表示关闭登录界面,HudManager为界面管理器,实际上就是一个手写的脚本。HUD_LOADING_S为加载界面,利用界面管理器调用打开加载界面,随后打开游戏主界面。KiiManager即Kiicloud,为一个管理数据的后端服务,本段代码调用KiiManager中的instance方法将账号密码保存起来。实际效果4-2实际登录界面游戏主界面4-3游戏主界面简图界面功能说明在登录界面点击按钮后进入游戏主界面,如上图所示。左上角为游戏名称,显示玩家游戏ID,界面中心角色模型为钢铁侠模型,界面右边为“冒险”“竞技塔”“部件”按钮,“冒险”为关卡选择界面入口,点击后进入关卡选择界面。界面NGUI设计界面中心是一个钢铁侠模型,为perfeb模型文件,这块区域必须放置碰撞器以响应手指触摸。右边对应“冒险”按钮,为button控件,可挂相应脚本在button上,使其点击后执行不同指令,进入不同分界面。新添一个sprite控件,选择一张背景图,并将depth值调到最低。功能实现点击“冒险”按钮跳转关卡选择界面,实现如下:publicvoidOnBattle(){ if(!ballEnable) return; Show(false); GlobalSet.SetMainSceneCameraControl(true);HudManager.Instance.ShowDialog(DIALOG_TYPE.HUD_LOADING_S);Façade.instance.sendnotification(GAME_TAPE.HUD_MAIN_SCENE))}说明:打开一个新界面时需要先关闭当前界面,这样节省内存空间。Show(false)就是用来关闭当前界面。GlobalSet.SetMainSceneCameraControl(true);打开关卡场景相机,并调用facade的instance方法发送消息给MVC端口请求打开HUD_MAIN_SCENE。为关卡界面。实际效果4-4实际主界面关卡选择界面4-5关卡选择界面界面功能说明如上图所示,第一章共有5个关卡,点击后在相应关卡按钮上方弹出“攻击”按钮,点击“攻击”按钮进入对应关卡的战斗界面,点击其他区域隐藏攻击按钮。点击右下角的“返回”按钮,回到游戏主界面。界面NGUI设计使用sprite控件添加背景图,depth设为最低。新建一个空的Gameobject,添加关卡的sprite、label和collider碰撞器,选择好合适的图片作为关卡图添加到sprite中,label改成相应的关卡名。右下角“返回”按钮为button控件。界面功能实现点击任一关卡弹出“攻击”按钮,点击“攻击”按钮进入战斗画面,实现代码如下:publicvoidOnBuilding(){ if(mBuildingDic==null) return; GlobalSet.SetMainSceneCameraControl(false); buildingUi.SetActive(true);}说明:if(mBuildingDic==null)判断当前区域是否有关卡数据,如果是空的,返回重新判断,如果非空,则关闭关卡场景镜头,打开战斗场景。4-6点击关卡弹出攻击按钮点击其他区域关闭攻击按钮,实现如下:publicvoidOnCloseBuildingUi() { ClearAllBuilding(); buildingUi.SetActive(false); GlobalSet.SetMainSceneCameraControl(true); }点击“返回”按钮返回游戏主界面,实现如下:publicvoidOnRet() { GlobalSet.SetMainCameraControl(false); if(m_baseInfo.type==BASE_TYPE.MAIN) HudManager.Instance.ShowDialog(DIALOG_TYPE.HUD_MAIN);}实际效果4-7实际关卡界面战斗系统战斗系统分成两个部分,一部分是对于主角的控制,通过触摸屏幕控制主角的上下左右、跳跃、攻击等,另一部分是NPC的智能AI,让NPC自动寻找接近目标,并实施攻击。主角控制通过响应玩家的某些操作,调用播放主角对应的动作动画,实现动作的控制。实现控制主角上下左右移动,代码如下:publicvoidSetHorizontalVelocity(Vector2velocity,boolreferenceSelf) { SetHorizontalVelocity(velocity.normalized,velocity.magnitude,referenceSelf); } publicvoidSetHorizontalVelocity(Vector2toward,floatspeed,boolreferenceSelf) { horizontalSpeed=speed; horizontalToward=toward; if(referenceSelf)horizontalToward=TransformDirection(horizontalToward); } publicVector2TransformDirection(Vector2direction) { Vector3toward=newVector3(direction.x,0f,direction.y); toward=transform.TransformDirection(toward); returnnewVector2(toward.x,toward.z);}实现控制主角跳跃代码如下:publicvoidJump() { TurnTo(joystickToward,false); if(joystickToward!=Vector3.zero) SetHorizontalVelocity(Vector2.up,runSpeed,true); verticalVelocity=jumpSpeed; }实现控制主角攻击代码如下:publicvoidCast(iHerocaster) { this.caster=caster; if(faceTarget) { HeroManager.SelectTarget(caster); if(caster.AttackTarget!=null) caster.Controller.TowardEnemy(caster.AttackTarget,false); } else { caster.Controller.TowardJoystick(); } curStep=0; StartCurStep(); }NPC智能AINPC的智能程度决定了游戏的难易度,wait、walk、attak、limit为电脑的四种简单状态,这也构成了简单的电脑智能AI。简单的NPC智能AI主要需要以下两方面的内容:NPC寻路设置:voidAwake(){Player=GameObject.FindGameObjectWithTag("Player").transform;playerHealth=player.GetComponent<PlayerHealth>();enemyHealth=GetComponent<EnemyHealth>();nav=GetComponent<NavMeshAgent>();}voidUpdate(){if(enemyHealth.currentHealth>0&&playerHealth.currentHealth>0){nav.SetDestination(player.position);}else{nav.enabled=false;}}首先NPC需要获取寻路目标的位置,Player=GameObject.FindGameObjectWithTag("Player").transform;这一句将获取player的坐标位置,使其暴露于NPC的视野范围之内。NavMeshAgent为Unity3D内置的寻路组件,nav=GetComponent<NavMeshAgent>();这一句获取调用此寻路组件。然后是条件判断,如果NPC生命值>0且玩家生命值>0,符合以上条件执行nav.SetDestination(player.position);即设置玩家的坐标作为寻路目标,并且将以最短路线寻路,不符合条件执行nav.enabled=false;表示寻路不可用。NPC自动攻击:publicclassEnemyAttack:MonoBehaviour{publicfloattimeBetweenAttacks=0.5f;publicintattackDamage=10;floattimer;voidAwake(){player=GameObject.FindGameObjectWithTag("Player");playerHealth=player.GetComponent<PlayerHealth>();enemyHealth=GetComponent<EnemyHealth>();}voidOnTriggerEnter(Colliderother){if(other.gameObject==player){playerInRange=true;}}voidOnTriggerExit(Colliderother){if(other.gameObject==player){playerInRange=false;}}voidUpdate(){

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论