基于Unity3d的潜行游戏开发.doc_第1页
基于Unity3d的潜行游戏开发.doc_第2页
基于Unity3d的潜行游戏开发.doc_第3页
基于Unity3d的潜行游戏开发.doc_第4页
基于Unity3d的潜行游戏开发.doc_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

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

文档简介

毕业设计论文课题名称基于Unity3d的潜行游戏开发系 部计算机工程系专 业计算机科学与技术班 级T1123-2学 号20110230204姓 名杨吉乾指导教师吴文欢2015年 5 月 20 日摘 要随着计算机技术的不断发展,游戏制作也慢慢成为社会上不可或缺的一部分,游戏一方面能够给玩家带来生活上的放松,另一方面也是对现实中某些场景的夸张和放大,各种各样的游戏能给玩家带来不同体验,深受广大群众的喜爱,市场需求量很大,因此对游戏的开发和研究也显得很有意义。而在一系列开发引擎中,Unity3D游戏引擎主要用来制作3D游戏,能够给玩家带来很真实的感受和非常不错的游戏体验,与此同时也能做出效果很好的UI界面,学好Unity3D在未来无论是3D网页的开发还是虚拟现实都会起来不可估量的作用,而本次课题就将通过Unity3D做出一个效果不错的游戏。本次课题做一个潜行类游戏,主角需要避开敌人、红外线、摄像头的检测,拿到钥匙到达指定目的地,就像军事行动深入敌后。在整个游戏设计过程中会用到一些数学知识,会用到Mecanim动画系统,会用到状态机,会用到自动导航系统,也要求设计者有很强的逻辑思维和一定的审美标准,也需要对游戏引擎有较为熟练的使用能力。而在界面的搭建上又需要用到UI知识,懂得如何通过视觉魔术让3D模型显示在2D界面,又能让玩家从2D界面感受3D模型的3D效果,对设计者来说是具有一定的挑战和锻炼意义。开发的游戏有一定的可玩性,可以满足很多玩家的娱乐需求,也可以用来当作二次开发的模型,做出难度更高、涉及元素更多元化、更复杂的市场游戏,因此,本次课题的研发不仅具有学习研究意义,也有一定的市场价值。关键词:Unity3D游戏;潜行游戏开发;Unity3D技术应用 AbstractAlong with the development of computer technology,game production has graduallybecome the indispensable part of the society,on the one hand games can take relation to players,on the other hand,its also exaggerated and amplified to some of the real scenes,a varieties of games can bring different experience to the game players,loved by the masses,the market demand is very big,therefor,its meaningful to research and develop the game.In the series of development engine,Unity3D game engine is mainly used to make 3D games,it can give true feelings and bring a very good experience to game players,make a good effect of UI interface at the same time.Learning Unity3D will rise an inestimable role in the future whether the development of 3D Webpage or virtual reality.This topic will bring a good game for you through Unity3D engine.This topic will bring you a stealth game,the hero needs to avoid enemy detection,infrared,camera,get the key to arrive at the designated destination.Just like military operations as behind enemy lines.It will use some mathematical knowledge in the game design process,and the mecanim animation system,the state machine,the automatic navigation system,it also requires designers to have good logical thought and aesthetic standards,and the abilities to use engine very well.As for UI design,you must let the 3D models display in the 2D panel though visual magic,and let the players taste the 3D model effects from 2D panel,its a challenge and will let designer get some exercise. The game is funny,it will meet entertainment needs of many game players,it also can be used as a model when you do the twice development,to make it more difficult,more diversified,more complex,and make it marketization,therefor,research of this topic not only has significance of learning, there is a certain market value. Key Word: Unity3D Game ;Stealth Game Unity3D Technology目 录第一章 绪论11.1 开发背景及意义11.2国内外研究现状11.3本课题简介2第二章 Unity3D游戏引擎的介绍32.1 API接口32.2.物理引擎3第三章 游戏的主界面设计43.1 界面总体效果43.2 具体设计53.2.1 主界面53.2.2 声音控制界面73.2.3 场景说明界面83.2.4 游戏控制界面93.2.5 关卡选择界面93.3 实现各界面滑动效果10第四章 游戏设计114.1 游戏地形设计114.1.1场景鸟瞰图114.1.2操作过程114.2 环境对象的设计124.2.1 激光124.2.2 感应门134.2.3 监控摄像机154.2.4激光控制器154.2.5 电梯164.2.6 其它环境设置164.3 人物对象的设计174.3.1 主角的设计174.3.2 机器人的设计214.4 其它必要设计274.4.1 摄像机274.4.2 游戏控制284.4.3 UI界面28第五章 游戏测试305.1Unity中运行305.1.1UI界面305.1.2 游戏315.2 PC端运行32第六章 总结33致 谢34参考文献35第一章 绪 论1.1 开发背景及意义随着计算机的不断普及,各种各样的应用也如雨后春笋层出不穷,而伴随着人们生活水平的日益提高,游戏也变成了人们生活中不可或缺的调味品。做游戏自然离不开开发引擎,Unity是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。Unity类似于Director,Blender game engine,Virtools或Torque Game Builder等利用交互的图形化开发环境为首要方式的软件,其编辑器运行在Windows和Mac OS X下,可发布游戏至Windows、Mac、Wii、iPhone、Windows Phone 8和Android平台。也可以利用Unity web player插件发布网页游戏,支持Mac和Windows网页浏览。它的网页播放器也被Mac widgets所支持。除此之外,Unity在虚拟现实中也可以得到广泛应用,本次课题就是想通过主流市场游戏的形式来熟悉和了解Unity的相关技术操作,从而在未来能够在一切都向3D发展的大趋势下游刃有余。1.2国内外研究现状90年代初国外的3D游戏就已经开始起步了,第一部3D第一人称射击游戏是美国的卡马克的重返德军总部。国内3D游戏则起始于2003年,相较于国外的3D游戏开发起步要晚了很多,虽然国内大的游戏公司和团队也开发出了自己的引擎,做出了古剑奇谭系列,仙剑奇侠传系列的游戏,但相比较国外的魔兽世界、模拟人生等国际游戏大作,无论是从游戏开发理念上还是技术支持上都还有不可逾越的差距,导致大量的财富资金流向国外。而随着时间的推移,手机也越来越智能化,现在的手机可以说比十几年前的电脑更加强大,也越来越多的应用出现在了手机上,游戏也是不可或缺的一部分,但是不同语言开发工具开发的产品想要移植到手机上需要花费巨大的代价,成本太高,操作很复杂,国外的一款游戏引擎完美的解决了这个问题,那就是Unity3D。对于Unity3D,国内对其的研究还处于起步阶段,所以我们认真的学习国外的优秀游戏引擎,熟悉其操作,对以后自主研究符合自身需求的引擎有很大的参考价值。1.3本课题简介本课题开发一个潜行类的游戏,其中游戏主角将小心的潜入敌人的大本营,通过敏捷的身手,机智的头脑找到所有的电脑控制台关闭所有的激光红外线,在行进过程中需要躲避所有的摄像头检测,尽可能的避免机器人的发现,在被发现后能逃过所有机器人的追捕,最终拿到钥匙进入电梯后从容离开。在游戏开始会有关于游戏的操作控制说明,也可以选择不同的关卡。进入游戏后,机器人会进行自主巡逻,主角需要合理的利用潜行,避免被机器人听到脚步声后前来追击,合理的利用地形是制胜的关键,请注意不要碰到红外线,一旦玩家被发现,所有巡逻机器人会前来对你进行围剿,这个时候就将是显示你高超的智商的时刻,冷静、沉着的应对,找到合适的方法,玩家也可以躲避追捕化险为夷。第二章 Unity3D游戏引擎的介绍2.1 API接口API是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。Unity3D就有一套自己的API函数库,通过这些API函数,开发人员可以很方便的实现项目的初始化,功能模块的每帧调用,如何进行触发检测并进行触发事件的响应,如何判断是否进入触发区,是否在触发区,是否离开触发区,如何实现拖动事件的响应等等。2.2.物理引擎任何一个游戏的设计都必须有其物体特性的合理性,这样才能显得真实可信,在Unity3D中为开发人员提供了大量的组件,可以对对象进行渲染,颜色的透明度、法线贴图、平行光、点光源、图片、文字、声音、动画、材质等一系列组件可以让人产生很逼真的视觉效果,而在物理特性上添加的刚体、碰撞器等组件,可以实现对象受到重力、摩擦力、空气阻力等自然物理特性的影响,而爬坡的坡度设定,碰撞后的一切物理变化,逼真的体验让你觉得这就是一个现实中的物体。可以说Unity引擎就是一个组件编程的引擎,整个开发过程就是一个从无到有的组件添加,对象的物理特性Unity一般都封装好了,只需要找到合适的组件进行添加,合理控制其属性即可,而行为特性就是脚本,通过代码的逻辑操作进而实现对象的一系列活动事件。第三章 游戏的主界面设计 当一进入游戏,就将会跳转到开始界面,在该界面中你可以看到游戏主角的一个静止状态的动画,上面写有游戏名称,在右上方有一个游戏的标志,左下方的是声音选项按钮,点击后会进入声音面板。在开始界面里可以进行鼠标的拖动,用来实现不同的几个界面的滑动效果,图3.2即为游戏的说明界面,在里面描绘了主角和机器人在四种各不同场景下会出现的情形,图3.3则是告诉你游戏如何进行控制,又如何取得胜利,图3.4则是关卡选择界面,可以选择不同的关卡。3.1 界面总体效果整个游戏界面用的是UGUI技术,在整个开发过程中会用到panel组件(作为容器存在,用来存放其它组件,并可添加图片当作背景存在),image组件(用来添加图片,可以用作logo或者按钮等的背景),button组件(作为按钮存在,在其上可以添加点击事件),text组件(用来显示文本信息),slider组件(是一个滑动条,滑动条有一个数值,通过滑动事件同步该数值可以控制音量大小,也可以控制主角血量)。 3.1开始界面 3.2场景说明界面 3.3游戏控制界面 3.4关卡选择界面3.5声音控制界面3.1 游戏开始界面当玩家开始重新玩一次游戏时,会进入游戏开始界面,如图所示: 实现游戏开始界面的主要步骤为:1. 首先在Hierarchy面板建立一个Panel,用来作为对象的载体,给该面板拖拽一个Sprite图片,注意一般图片的类型为texture,选中该图片,更改Texture Type的类型变成Sprite即可,如图3.6。3.6 图片属性2. 在该面板内添加一个文本组件,在文本域写上标题Stealth,调整字体大小颜色位置字体等信息,把文本框拖到合适的位置。3. 在界面右上方添加一个图片组件,然后拖一个合适的图片到该组件作为Logo,注意调整锚点位置,方便屏幕自适应,如图3.7。 3.7 锚点图4. 在左下方添加一个Button控件,在其背景中拖动一个合适的背景图片进去。然后创建一个空对象,用来挂载面板控制脚本,脚本主要实现的是对声音面板动画状态机里面的标志位进行修改,实现在不同条件下不同动画的播放,这里我将通过两个函数,分别对动画状态机里面的标志位进行不同修改来实现不同动画的状态转换,当状态机里面标志位“DisplayAudioSetting”为真的时候就会播放声音面板的显示动画,为假的时候就会播放隐藏动画。在图3.8所示面板添加事件,然后把该对象拖进去即可产生按钮事件,点击后会调用对应的函数进行事件的响应。 3.8 Button点击事件图5.添加一个主角,拖动主角模型到合适的位置,在Project面板中给主角添加一个状态机,Create-Animator Controller,然后把主角的静止动画添加进去,如图3.9。在主角的对象上添加一个Aniator组件,然后把状态机拖进去,运行即可播放主角静止动画。 3.9 主角静止状态机3.2 声音控制界面 1. 添加一个Panel组件作为各组件的载体,给其添加一个sprite图片作为panel的背景存在。2. 添加2个text组件,用来显示文字,分别写上音效、音量,将其放置到合适位置,调整锚点位置。3. 添加两个slider组件,用来控制声音的大小,在其子对象background上改变颜色为黑色,添加一个空对象用来挂载声音文件,命名AudioController,在其上添加2个声音组件AudioSource,把对应的声音文件拖放进去,然后添加一个AudioListener,用来监听场景中的声音,添加一个脚本,用来控制声音的大小,在控制过程中实现将滑动条的数值实时更新赋值给声音组件声音大小的数值,声音组件的大小值为零到一,属于百分比,滑动范围同样设置为零到一,然后调用Update函数,此函数每帧都会执行,一秒大约执行60帧,基本可以满足大部分应用实现实时更新效果,如此即可满足声音大小和滑动比例一致。4. 添加一个Button组件,用来控制声音面板的隐藏,选择声音面板,点击Window-Animation,然后出现3.10所示图,该面板是用来自行制作动画效果的,可以通过设置在不同帧的时候对象的位置、旋转等信息来进行录制后连续播放,实现放电影一样的效果,在该面板中设置两个帧动画,调节该面板的位置,实现效果一个为隐藏(把面板拖到摄像机视野外),一个为显示(把面板拖到摄像机视野内),在声音面板上添加Animator组件并把该动画放进去,在Button上添加点击事件,监测到点击后会调用相关函数控制状态机中标志位的值,进而改变状态实现显示或者隐藏,如图3.11. 3.10 声音面板帧动画设置图 3.11 Button点击事件图3.3 场景说明界面1. 在左上方添加3D模型,一个为机器人,一个为主角,调整好位置放置,给主角添加动画状态机,将其跑动动画放入,然后给主角添加Animator组件,拖入该动画状态机,注意查看该动画,需要修改部分属性,固定跑动使其不产生位移,如图3.12。在其下方合适位置添加text组件,附上文字说明。3.12 Run动画设置2. 在其右上方添加模型,并给主角添加上潜行动画,具体方式可参照跑动设置,在其下方添加文件说明。3. 在其左下方添加模型,同时给主角和机器人添加跑动动画,并附上文字说明。4. 在其右下方添加模型,给机器人添加射击动画,给主角添加死亡动画,设置动画循环播放,并在其下附上文字说明。3.4 游戏控制界面拖入各个模型,给钥匙添加一个旋转动画,调整各模型位置,附上文字说明。3.5 关卡选择界面1. 在其左上方添加一个panel组件,给其添加3个image子组件和一个button子组件,分别给它们附上图片,然后给该面板添加一个帧动画,在第60帧的时候旋转180度,在120帧的时候旋转360度,然后选择动画反复执行,可以实现面板不停做旋转运动,添加一个空对象用来挂载脚本控制关卡的加载,可以直接调用Unity的API函数Application.LoadLevel()方法进行场景的加载,每个关卡都是一个不同的场景,每个场景都有自己独一无二的索引值,将该值作为参数传给该函数即可区分不同场景的加载,然后将该对象赋给button的点击事件,选择对应的函数实现点击调用。2. 在其他位置添加3个面板,每个面板添加一个button子组件,每个button添加锁的背景图片表明关卡还未开通。3.6界面之间的连接在Unity中有两个类IBeginDragHandler,IDragHandler 专门封装的鼠标拖动事件,其中OnBeginDrag(PointerEventData eventData) 方法是在鼠标开始拖动的时候启用,可以记录鼠标开始拖动的位置,OnDrag(PointerEventData eventData) 则是在鼠标拖动过程中调用,可以用来记录鼠标最新的位置,在此用来记录当前的位置,用鼠标左键抬起时结束该函数的运行,用此时鼠标的位置减去开始的位置可以得到一个方向向量,通过调用this.transform.Translate()方法,重新给给该面板设置一个相对于世界坐标系的位置即可,需要注意的是,通过拖动函数得到的差值是一个象素值,而在设置位置的时候的值单位是米,用象素值除以100即可得到一个相对较好的效果。由于拖动过程中很难实现拖动距离正好达到一个界面的宽度,所以需要实时更新位置信息,通过方向向量的正负情况,确定向哪一个界面移动,然后通过差值运算将面板正好卡到想要达到的效果的位置。先设置每个面板的宽度为800米,可以在Update函数里面每帧执行,当面板的本地X坐标大于零的时候,让其回到(0,0,0)位置,当面板的本地X坐标小于-3200时,将其移动到(-2400,0,0)位置,当面板本地X坐标在0到800以内,检查方向向量的正负,为正移到(0,0,0)位置,为负移到(-800,0,0)位置,其它面板卡位思想相同,操作类似。注意在重新设置位置的时候,需要调用Vector3.Lerp()方法,该方法是一个差值运算,当距离目标点远的时候移动很快,距离目标点近的时候移动很慢,可以实现平滑移动。 第4章 游戏设计 用文字对本章节介绍内容进行一个简洁4.1 游戏场景设计4.1.1 游戏地形设计 本游戏采用了一个工厂地形,但是这个地形是雏形,需要添加4.1 场景鸟瞰图1. 先把美工做好的地形模型放入,给其添加一个碰撞器,见图4.2。2. 依照鸟瞰图把对应的激光、障碍物、摄像机、机器人、钥匙、主角、控制台、电梯、门等对象放到合适的位置。 4.2碰撞器4.1.2 激光设计1. 先给激光添加一个light组件,具体设置见该面板,其中Range是用来控制光线照射范围,Intensity是用来控制光照强度的,Color使用来控制光的颜色渲染,根据场景中实际效果调节该值到一个合适的数值,见图4.3。2. 给激光添加一耳光AudioSource组件,用来控制激光的声音,注意该声音为3D声音,3D声音只有靠近一定范围才能听见,靠的越近声音越大,是挂载在对象上的,2D声音无论距离远近声音大小一样,设置该声音的传播距离,实现只有靠近才能听见的效果哦,见图4.4。3. 给激光添加一个Box Collider,勾选IsTrigger设置其为触发器,用来控制触发检测的,有了该触发器,当对象进入触发区域即可调用对应的函数,见图4.5。 4.3 灯光属性 4.4声音组件 4.5触发器4. 给激光添加脚本,用来控制触发响应事件和激光特性。在本游戏中激光有两种状态,其中一种是一直存在的,另一种是闪烁变化的。为了区分两种激光,设置一个标志位isFlicker,当其为真的时候代表闪烁激光,为假代表不可闪烁激光。主角有一个tag标签,所有激光,当碰撞的对象的标签是主角的时候就会控制警报声的响起,并记录主角碰撞的位置信息通知机器人前去追捕击杀。而对于闪烁激光,通过一个计时器控制闪烁的时间周期,当关闭周期到了使其关闭渲染,关闭触发器,当开启周期到了打开渲染,打开触发器。5. 在Project面板建立一个空的文件夹,用来放置Prefabs,把Hierarchy面板中的激光拖进去做成预制,预制的作用即是克隆,以预制物体为母本,其它所有该物体均为克隆体,当发现有需要改动的地方,改动母体之后,所有克隆体都会修改,用起来很方便。在合适的位置添加该预制,可实现所有激光特性和预制一样,在靠近电梯的两个激光,勾选isFlicker,设置按灭时间,使其实现闪烁效果。4.1.2 感应门设计1. 先给门做一个Animator Controller,添加动画状态机Open和Close,右键Close,设置为默认状态,添加一个标志位Close,用来控制动画的切换,右键Open选择Make Transition,然后指向Close,单击该指向,在出现的面板设置转换条件,当Close为真的时候转换到关闭状态。Close指向Open做类似设置,当Close为假的时候转换到打开状态,如图4.6。2. 给门添加Animator组件,把该状态机放进去。3. 给门添加Sphere Collider触发器,调至合适的位置,调整合适的大小,具体可根据游戏运行效果设置,当主角或者机器人进入触发区域,即可调用对应的触发函数完成触发事件,如图4.7。 4.6 门的状态切换图 4.7 球形触发器4. 给门添加一个AudioSource组件,用来播放门的打开和关闭声音,当主角或者机器人进入触发区域的时候检测有无开门声音正在播放,没有就播放,离开的时候也类似。5. 添加脚本控制门的事件,门的打开与关闭状态是通过计数来判断的,有人就打开,没人就关闭。在一开始需要得到门动画的引用,设置一个变量控制是否感应到有对象进入,当门的触发区域没有游戏对象,就设置动画为关闭状态,当触发区域有对象进入,计数器加一,此时设置动画为打开状态。需要注意的是机器人身上不仅有碰撞器,也同时有范围很大的触发器,需要设置判定条件,只有碰撞对象是机器人并且为机器人的碰撞器进入到门的触发范围才能计数器的自加。在游戏中还有一种是电梯的门,该门需要钥匙才能打开,只有在持有钥匙,并且触发对象是主角的情况下门才会打开,需要设置一个标志位,用来控制是否需要钥匙的门,当主角持有钥匙进入计数器才会加一,否则进入触发区域会播放一个拒绝的声音。当对象离开的时候需要做相反的设置,进入调用OnTriggerEnter()函数,该函数会在进入触发区域时调用一次,离开用OnTriggerExit()函数,该函数会在离开触发区域时调用一次。6. 把门做成预制,在合适的位置添加门。4.1.3 监控器设计1. 先把摄像机拖至合适的位置,给其子物体设置旋转动画,window-Animation,选择Rotation进行不同帧的动画设置,在第60帧的时候让其旋转90度,在120帧的时候旋转回来,控制该动画循环播放,给其添加Animator组件,把状态机放进去。2. 给子body子物体添加灯的组件,调整参数如图4.8,用来达到摄像机照射区域提醒效果。3. 给其子物体添加一个触发器,用来检测被照射后的事件,摄像机能否发现主角,就是通过这个触发器实现,把该触发器的渲染组件删除,就可以感觉像是摄像机照射到的效果。 4.8 摄像机照射区域4. 添加一个脚本,控制摄像机的触发检测,每个摄像机都有一个专门制作的触发区域模型,当主角进入触发区域后就需要通知游戏控制器发现主角并记录主角触发时的位置信息,检测是否为主角通过主角的标签进行判断。5. 把摄像机做成预制,放在合适的位置,场景中一共有三个摄像机,其中两个需要旋转动画,另一个只需要静止检测一块区域即可,根据实际情况可调节各自属性。4.1.4激光控制器设计1. 添加电脑到合适位置,给其添加碰撞器,触发器,AudioSource组件。2. 添加脚本控制激光的关闭。当主角进入激光控制器的触发范围的时候,通过调用Input.GetKeyDown(KeyCode.Z)方法,当按下Z键调用对应的激光,通过GameObject.SetActive(false)方法可以禁用掉该激光,此方法禁用时会关闭其下所有组件,之后通过screen.renderer.materialf方法改变激光控制器上的锁的图标,设置一个标志位表明激光是否已关闭,当激光没关闭的时候才能关闭,每关闭一个激光,激光计数就会减一,并设置该标志位为真。需要注意的是,为了得到激光、材质等信息,需要在开始设置对象的引用,然后在Unity中赋值。4.1.5 电梯设计1. 添加电梯外侧门,给左右的门添加碰撞器。给电梯外侧门设置动画状态机,控制门的打开和关闭,具体可参照通用门的设置,添加AudioSource组件来控制门的拒绝声音和打开声音,添加触发器来进行检测主角是否进入。需要注意的是,一般感应门是一扇门,电梯的门是左右两扇,只有电梯内门设置的有动画,为了保证内外门一致,需要在Update方法里面记录内门两扇门的位置信息,当内侧门在播放动画时,通过差值运算调用Mathf.Lerp()方法,使外侧门的位置信息与内侧门保持一致。2. 用脚本控制电梯的升降,当有主角进入的时候,更改标志位表明主角进入,设置一个计数器记录主角在电梯中的时间,到达计数时间后用transform.Translate()方法控制电梯向上运动,设置一个计数器记录电梯上升时间,当到达计数时间后调用协同程序显示游戏胜利界面。4.1.6 其它环境设置1. 给每个喇叭添加一个AudioSource组件用来播放警报声,当主角被发现就播放该声音。2. 添加一个钥匙模型放置到合适位置,给钥匙添加旋转动画,给其添加Light组件渲染其颜色效果,添加一个球形触发器,当主角进入触发区域后就通过Destroy()方法销毁钥匙对象,设置主角持有钥匙的标志位,播放钥匙被捡起的音效。3. 添加整个环境的背景光,需要两个平行光,第一个平行光作为正常的光,颜色调的稍微灰暗一点,强度不需要太大,需要符合游戏场景。第二个平行光作为警报时的背景光,颜色调为红色,强度设置为0,当触发警报的时候再更改强度。 4.9 正常背景光 4.10警报背景光 4.2人物对象的设计4.2.1 主角的设计1. 把主角模型添加上去,在主角模型里面需要调一些属性,大小如果不合适,可以调Model里面的数值。人物骨骼设置Rig,点Configure,注意查看主角的骨骼映射。在其右方有骨骼映射关系图,看看映射是否正确,否则会导致动画出现不可预知的错误。在其左侧有做好的对象的骨骼对象,找到对应的拖进去即可。 4.11 人物模型设置 4.12 人物骨骼 4.13 骨骼映射 4.14 骨骼映射对象2. 添加主角动画状态机,添加静止、潜行和死亡动画,设置两个标志位,分别控制是否潜行,是否死亡,静止设置为默认状态,死亡设置为任何状态都可以转化。4.15 主角动画状态机3. 在状态机里面添加动画状态树,然后把走动和跑动动画都添加上去,可以使两个动画合成,添加一个float变量控制速度,合成的动画可以依照速度的值进行状态的切换。 4.16 状态树4.17状态树动画添加面板4. 给主角添加Capsule Collider碰撞器做碰撞检测,添加刚体组件来实现主角的物理特性,添加一个AudioSource控制脚步声的播放。4.18 刚体组件5. 控制主角移动的脚本。主角的移动是根据动画产生位移的,调用Unity的API实时更新,当有方向键按下的时候,通过按下时间的长短控制其数值的变化,并将该数值实时更新到主角移动动画状态机里面,状态机会根据其数值自动调节到走动或是跑动动画。当按下键盘左边的Shift键后,会控制动画状态机播放潜行动画。当没有键按下的时候,动画状态机就会播放主角静止动画。void Update () float h = Input.GetAxis(Horizontal);/获取水平数值 float v = Input.GetAxis(Vertical);/获取垂直数值 /按下左侧shift设置潜行标志位为true if (Input.GetKey(KeyCode.LeftShift) anim.SetBool(Sneak, true); else anim.SetBool(Sneak, false); /有移动的时候设置状态机里面的值控制移动 if (Mathf.Abs(h) 0.1f | Mathf.Abs(v) 0.1f) float newSpeed = Mathf.Lerp(anim.GetFloat(Speed), currentSpeed, Time.deltaTime * moveSpeed); anim.SetFloat(Speed, newSpeed); /目标方向 Vector3 targetDir = new Vector3(h, 0, v); /获取朝向和旋转轴 Quaternion newRotation= Quaternion.LookRotation(targetDir, Vector3.up); /旋转 transform.rotation= Quaternion.Lerp(transform.rotation, newRotation, Time.deltaTime * rotateSpeed); else anim.SetFloat(Speed, 0); if (anim.GetCurrentAnimatorStateInfo(0).IsName(Locomotion) PlayFootMusic(); else StopFootMusic(); if (currentSpeed 0) txt_CuurentSpeed.GetComponent().text = 当前最大移动速度: + currentSpeed.ToString(0.0); else txt_CuurentSpeed.GetComponent().text = 当前最大移动速度:0; 6. 主角血量脚本。用来控制主角血量信息,会在此处控制主角血量的滑动条的数值和主角血量保持一致进行实时更新,当主角受到伤害的时候就会使其血量减少,一旦血量为0则表示主角死亡,死亡后通过调用协程等待2秒后显示游戏结束面板。 /初始化 void Awake() anim=this.GetComponent(); /受到伤害生命值减少 public void TakeDamage(float damage) hp -= damage; if (hp = 0) anim.SetBool(Dead,true); StartCoroutine(ReLoad(); /协程控制游戏失败面板的显示 IEnumerator ReLoad() yield return new WaitForSeconds(2); gameOverPanel.SetActive(true);/实时更新血量信息 public void Update() healthSlider.GetComponent().value = hp; if (hp 0) healthText.GetComponent().text = hp.ToString(0); else healthText.GetComponent().text =0; 4.2.2 机器人的设计1. 同样给机器人添加动画状态机,添加状态树合成新动画,设置好骨骼,具体参照主角设计,添加三个float型变量,Speed控制移动速度,AngularSpeed控制角速度,Shot控制射击频率,设置一个标志位控制是否发现主角。 4.19 机器人动画状态树 4.20 机器人动画合成2. 给机器人添加刚体组件控制其物理特性,添加一个触发器控制其听觉 4.21 机器人刚体组件 4.22机器人触发器3. 选中环境,烘培地形,实现自动导航,设置其参数如图,然后点击Back。 4.23导航烘培属性 4.24烘培后效果4. 给机器人添加Nav Mesh Agent组件,设置参数如图,实现机器人自动导航,由于机器人的移动是通过动画产生的,而在自动导航中会有一个位置的改变和旋转的改变会强行变化机器人的位置和朝向,因此需要通过脚本控制将导航组件里面的位置和旋转给禁用掉。 4.25 导航组件5. 机器人视野脚本。机器人会实时更新最新发现主角的位置,如果最新发现主角的位置和之前最后一次发现主角的位置不一致,就会通知游戏控制脚本主角的最新位置信息。在设计中,机器人是有听觉和视觉的,设置一个标志位用来判断主角是否在机器人的视野范围内,默认为false。通过一个较大的触发器来控制机器人的听觉,如果主角在触发范围内并且此时在播放运动的动画,就进行路径检测,在此设置一个路径用来记录主角和机器人之间的距离,Unity自带的导航API可以调用其属性来获取一系列的路径点,通过用一个for循环可以把这所有点每两个点之间进行线段长度的累加,如果长度之和在机器人听觉范围内,机器人就会听到主角的移动声音,就会将主角位置信息赋值给警报位置,进而过去巡查。对于机器人视野,通过一个射线检测实现,首先会记录机器人的一个朝向信息,当主角进入机器人的触发范围内后,通过主角位置与机器人位置的一个差值可以得到一个方向向量,再用一个变量记录机器人的朝向和主角之间的夹角,从机器人的眼睛位置会朝主角发射射线,如果机器人朝向和主角的夹角小于一个数值,并且射线直接碰撞到主角的时候,就表明机器人发现了主角,然后设置一系列发现后的位置更新报警追捕等事件。当主角离开触发区域后,就设置主角在视野范围内的标志位为false。 /实时更新最近一次发现主角的位置 void Update() if (GameController._instance.lastPlayerP

温馨提示

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

评论

0/150

提交评论