版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PAGE1基于Unity引擎的小游戏的设计与开发研究【摘要】本文采用unity引擎开发一款经典小游戏:炸弹人,玩家通过操控人物移动来躲避怪物,通过按下空格放下炸弹来消灭怪物和摧毁障碍物,消灭完所有怪物即可通关,我希望通过展示素材导入,地图创建,特效制作,逻辑设计等这样一个完整的过程,来介绍使用现代游戏引擎开发游戏的大致环节。【关键词】Unity游戏引擎C#小游戏开发流程目录摘要…………………………ⅰAbstract………………………ⅱ一、绪论………11.1背景与意义…………………11.2国内外研究现状……………1二、游戏玩法与设计………………22.1游戏玩法介绍………22.2游戏设计流程………2三、游戏具体实现………………33.1环境准备阶段………33.2地图场景创建………33.3制作游戏人物………43.4制作场景中的物体………53.5性能优化………83.6创建道具………93.7摄像机视角控制………113.8游戏UI制作………123.9游戏的封装处理………12四:游戏的开发总结………12参考文献………………………13第一章绪论1.1背景与意义随着计算机科学相关领域的发展,我们的娱乐生活越来越丰富,其中,电子游戏是一个非常热门的领域,自从世界上第一款电子游戏诞生之后,之后的几十年里,逐渐涌现出了许多优秀的作品,比如吃豆人,俄罗斯方块,塞尔达,蜘蛛侠,罪恶都市,王者荣耀,阴阳师等等,游戏在这个全新的时代里,某种意义上代表着开发者们天马行空的想象力,许多游戏开发人员都梦想着自己成为像小岛秀夫一样的人,创造出不朽的游戏作品,但是在早期游戏开发过程中,由于电子计算机的性能以及相关开发工具的缺失,导致很多人被过高的开发门槛阻拦在这个领域之外。后来越来越多的公司和相关领域内的开发人员意识到了这个问题,但是在很久之前,计算机科学本身发展的不是很好,相关的编程语言非常繁琐复杂,而且早期计算机性能非常低下,常常为了节约一点点性能,恨不得直接采用汇编语言的方式编写游戏,但是在21世纪开始,电脑性能大幅度上升,各种“不在乎性能”的语言和工具链逐渐发展起来,其中就包括了Java语言,微软公司发明的C#语言,以及Unity这种简单易上手的游戏开发引擎本文希望通过展示一个小游戏的完整开发过程,向读者介绍现代游戏的开发的主要模块:资源创建管理,地图绘制,场景设计,特效制作,逻辑设计和性能优化,帮助希望从事相关领域的读者,更快的熟悉流程,也能更有条理的深入学习更高级的技术和操作。1.2国内研究现状根据相关资料的分析可以看到,得益于微软C#语言的简单易上手,Unity在入门领域内的发展非常顺利,尤其是相对于竞争对手Unreal引擎,虚幻引擎所采用的C++语言非常繁琐复杂,对于刚刚入门学习的开发人员来讲,学习难度过于陡峭,虚幻引擎的开发者EPIC这个公司对于PC端大型3A游戏的开发非常擅长,在2020年,他们曾经推出过一段实机演示,在演示中,为了渲染一个比较精致的游戏场景,他们同时渲染了万亿级的多边形,甚至在一个光照场景下,在没有专用硬件加速的情况下直接抛弃了传统的光栅化,实现了实时光线追踪,然而这些东西对于个人开发者来说,虽然效果很美好,但是需要付出的代价太高,比如为了实现很多性能的优化,使用虚幻引擎的游戏开发者需要学习很多计算机底层的优化原理,学习如何使用各种线程调度,内存优化,计算机图形学甚至还需要学习相关的物理底层知识,这对个人开发者来讲是不可接受的。Unity引擎的出现,某种程度上解决了一部分虚幻引擎带来的问题,unity提供了大量的内置函数,使得开发者在不了解相关底原理的基础上,依然可以制作出很优秀的场景,并且在移动开发时代,由于其简单易上手,得到了大量的开发者的追捧和推广。第二章游戏玩法与设计2.1游戏介绍游戏地图是一个长方形的场景,里面由砖头墙,实体墙,人物,怪物和游戏中的道具组成。玩家通过“WASD“或者键盘的方向键控制人物移动,按下空格键生成炸弹,炸弹在一段短暂的时间后爆炸,可以摧毁砖头墙或者怪物,当摧毁砖头墙的时候有一定的概率会生成道具,道具可以增加相应的属性或者延长游戏的时间,玩家通过摧毁砖头墙寻找下一关的传送门,当地图内的怪物被清空的时候,玩家可以触发传送门进入下一关,和玩家被炸弹冲击波触碰到或者被怪物触碰到的时候,生命值减1,游戏本身有倒计时,当倒计时或者生命值变成0的时候,游戏结束。2.2游戏设计的流程1:创建游戏地图(1)确定边界:游戏的地图的边界是一个方框的实心墙围成的封闭区域,地图的长度和宽度随着游戏关卡增大。(2):在地图区域内添加实心墙,同时为了防止堵死人物行走路径,确保内部实心墙的周围(以自身为中心的九宫格内)没有其他的实心墙。(3):在地图内部,实心墙没有填充的地方,随机生成可以被人物销毁的砖墙。制作完地图之后,设计进入下一个关卡的传送门,同时确定不同关卡的生成逻辑。2:制作人物:分为两个环节:(1):制作人物的贴图文件,也就是人物在静止状态时候的样子;(2):制作人物在上下左右移动的时候,或者死亡的时候的相应的动画。(3):人物血量降低到0的时候,游戏结束。(4):确定人物在进入每一个新的关卡的时候的初始刷新位置,确保在扔下炸弹之,还有空白位置可以躲开炸弹的爆炸特效,避免开局的时候就陷入绝境。3制作炸弹:(1):制作炸弹未爆炸的时候的状态。(2):制作炸弹爆炸的时候的特效。(3):确定炸弹爆炸的范围。(4):设计炸弹在周围有障碍物的时候的爆炸特效逻辑。(5):确保整个游戏地图中,未爆炸的炸弹只能同时存在一个,在获取相应的道具之后,可以接触相应的限制。4制作游戏场景中的道具和怪物:需要解决的问题如下:(1):因为本游戏后期难度较大,为了做出相应的难度缓冲,生成的道具数量需要随着关卡增长,但是数目不能大于砖头墙的数目。(2):生成的道具不能直接暴漏在地图的空白处,必须隐藏在砖头墙中,当人物生成炸弹,炸弹摧毁砖头墙之后,道具才能显现出来。(3):在生成的道具中,分为以下几个类型:道具1:增加游戏倒计时的时间。道具2:增加人物移动速度。道具3:增加可同时生成的炸弹的数目。道具4:增大炸弹爆炸的范围。道具5:增加人物血量。(4):在地图除了人物本身,除了实心墙,砖头墙之外的空白处,生成相应的怪物。给定怪物一个随机的初始移动方向,当碰到墙壁的时候,随机转向。(5):碰到人物的时候,人物的血量-1,同时使人物进入短暂的无敌时间。(6):记录地图中此时存活的怪物,只有当怪物被杀完的时候,人物才能触发进入下一关的传送门。6制作游戏的UI:在刚刚启动游戏的时候,看到的开始游戏界面。在游戏界面上实时显示数字,用来记录人物血量,关卡数目,怪物数目。当游戏中人物死亡的时候,游戏中的再来一次界面7制作摄像机跟踪程序:随着关卡的增长,游戏生成的地图会越来越大,直到超出屏幕外,这时候,需要对游戏人物的位置做出判定和跟踪,调整屏幕显示,确保人物始终在屏幕中心附近位置。第三章游戏具体制作3.1:准备阶段(1)环境搭建:在unity官网/下载unity游戏引擎并安装,之后在VisualStudio官网下载最新版本并安装.net模块以便于创建unity中的C#脚本。(2)在unity中创建游戏项目,在项目文件中创建Sprites文件夹和Audio文件夹,导入游戏所需要的图片文件和音频文件(3):在Adobe官网/cn/下载Photoshop软件,在游戏制作过程中,可能会需要对图片进行比较精准的编辑和操作,AdobePhotoshop带有标尺功能,足以满足需求。3.2:地图创建过程:(1):在Unity中新建一个实心墙的Perfab预制体,把实心墙的图片导入进去,调整scale的三个坐标的大小,使得两个相邻的Perfab预制体中心点之间的距离正好为1,方便后续脚本的编写,把该预制体放入专门的文件夹中,在它的上面创建一个MapControllerC#脚本用来控制实心墙的生成排列规则。地图中需要实心墙的位置,第一部分在地图边界上,第二部分在游戏地图内部,按照之前游戏地图的设计,游戏边界需要封闭,所以对于一个长2X,宽2Y的游戏地图来讲,边界实心墙的生成规则为:在坐标(-X,Y)到(X,Y)之间,(-X,-Y)到(X,-Y)之间,(-X,Y)到(-X,-Y)之间,(X,Y)到(X,-Y)之间,每个位置装生成一个实心墙的Perfab预制体。生成地图内部的实心墙的规则如下:在坐标(-X+2,Y-2)到(X-2,Y-2)之间,(-X+2,-Y+2)到(X-2,-Y+2)之间,(-X+2,Y-2)到(-X+2,-Y+2)之间,(X-2,Y-2)到(X-2,-Y+2)之间,,每隔一个空位置生成一个实心墙预制体。(2):按照制作实心墙预制体的方法,制作砖头墙的预制体记录下地图内部所有位置的坐标序列,记录内部实心墙的位置坐标序列,两组坐标对比可以得到此时地图中空点位置的坐标序列nullPointsList。生成砖头墙的规则如下:首先确定砖头墙的数量wallCount为地图长度和宽度的乘积的四分之一,若此时砖头墙数目依然大于地图中空点坐标,则wallCount变为原来的0.7倍取整,在确定了砖头墙的数目之后,在空点序列中随机选择相应数目的坐标点生成砖头墙.(3):创建传送门:和制作传送门的预制体,获取当前砖头墙的坐标序列,在坐标序列中选择一个随机的位置,放入传送门。每次触发传送门的时候,生成下一关的地图,地图的长宽X,Y分别由下列式子决定:intx=6+2*(levelCount/3);inty=3+2*(levelCount/3);if(x>20)x=20;//到一定阶段,地图就不再变大if(y>20)y=20;其中,levelCount代表关卡数。(4):创建道具:制作道具的预制体,在砖头墙坐标序列中选择随机的坐标生成,同时避免和传送门的坐标重合。道具的数量为0到2+空点位置数量的0.05倍之间的随机整数。intcount=Random.Range(0,2+(int)(nullPointsList.Count*0.05f));3.3:制作游戏人物:首先制作人物的状态动画,人物在上下左右,以及死亡的时候,应该有不同的动画,第一步选择导入的素材,使用unity中的Animation把图片变成连续帧,创建所需要的动作向上移动UP,向下移动down,向右移动right,向左移动left和死亡die,以及静止时刻的动画idle使用unity中的Animator制作人物控制状态机,当人物静止的时候,保持静止动画idle图表1使用unity中的GetAxis函数实时获取键盘WASD的竖直方向数据Vertical和水平方向数据Horizontal。在一个系统和电脑硬件没有异常的情况下,如果没有任何按键操作,Vertical和Horizontal的值都会在0附近波动,波动的原因是系统误差和外界环境的干扰。当某个按键,例如键盘上的W键或者方向键的上键的被按下的时候,Vertical的值会在从0附近增长到1附近,虽然用时极短,但是数据并不是直接跳跃到1附近的,而是经历一个连续增长的过程。所以,综上所述,状态机idle到up的跳转条件就是:如果GetAxis函数实时获取到的Vertical值大于0.1,那么unity就从人物静止动画转换到人物向上移动的动画。Up到idle的跳转条件是GetAxis函数实时获取到的Vertical值小于0.1。Idle到down的跳转条件是GetAxis函数实时获取到的Vertical值小于-0.1。人物刷新位置的处理:确定人物在每个关卡的生成位置在地图右上角,同时保证右上角拐角处至少三个空位置没有砖墙,即把拐角处的三个空点位置在生成砖头墙之前从nullPoints序列中删除。人物移动:使用Unity中的MovePositon接口函数,让游戏中的人物在按下按键触发状态机转换的时候,向应有的方向移动:rig.MovePosition(transform.position+newVector3(Horizontal,Vertical)*speed);其中,速度speed的值默认为0.1f,当在游戏中触发加速道具的时候增加。碰撞检测:在人物预制体,实心墙预制体,砖头墙预制体面板上添加collider属性,在人物移动的时候,会被实体墙和砖头墙所阻挡3.4:制作场景中的物体按照制作人物和墙体的方法,实例化怪物,做出enemy的预制体。怪物的生成位置:在每个关卡刷新的时候,怪物应该刷新在一个地图上的空点,这个点不能和人物重叠,也不能刷新在地图上左上角的三个空格内,避免游戏在开局的时候就直接陷入死局怪物的行为方式:在一个新的关卡被开启之后,需要给每个怪物赋予一个移动速度,使用unity中的MovePostation接口函数,给定怪物一个随机的移动方向,直到碰到障碍物。为了让怪物和实心墙,砖头墙之间产生“阻碍”的效果,和人物预制体一样,在enemy的属性界面增加collider属性,在接触的时候,产生刚体碰撞的效果。怪物行为模式和射线检测:在一个位置生成怪物之后,怪物会在上下左右四个方向随机选择一个可以前进的方向,为了找到哪些方向是可以移动的,需要在怪物这个预制体属性界面添加Physics2D属性,调用unity中的Physics2D.Raycast函数这个函数的原理是如果怪物这个预制体已经被添加了刚体属性,那么就沿刚体的表面沿法线方向发射一条射线,检查指定距离内是否有别的刚体存在。检测方法就是做碰撞,然后返回布尔值true或者false,但是和直接用两个刚体,比如实心墙和人物相互接触产生碰撞。区别就在于在检测的时候,怪物这个预制体范围,以及本身的刚体范围是不会发生任何移动的。怪物调用该射线检测函数去判断以自身为中心周围1格内是否有别的刚体,没有的话就原地静止不动,有的话就随机选择一个方向一直前进,直到和别的物体发生直接接触性的刚体碰撞,此时再次使用射线检测,寻找周围可以移动的方向,重复之前的过程。按照游戏的设计,怪物和怪物在相互之间有重叠的时候,包括相互穿过和同方向移动重叠,怪物本身会变得比较透明,实现方法是先在unity里面给每个预制体增加标签,之后调用unity里面的collision.CompareTag()函数,判断此时是处于怎样的状态,再去改变怪物本身的透明度color.a。人物在受伤之后的无敌时间效果:按照游戏的设计,人物在碰到怪物,或者被自己的炸弹炸到之后,除了减小一滴血量之外,还应该有几秒钟的短暂无敌时间,在这个时间内人物表现为闪烁。为了实现这个效果,我们需要使用unity中的协程的概念(IEnumerator):电子游戏本身是一个比较复杂的程序,尤其是使用现代游戏引擎所制作出的游戏,游戏特效,人物交互,NPC行为等,借助于单独的cpu线程已经无法满足对性能的需求,随着技术的发展,人们发明了独立的图形渲染加速设备,也就是图形显卡,用来把那些比较繁杂但是逻辑不复杂且可以并行操作的计算步骤交给图形显卡,逻辑交互部分由CPU计算,甚至在一些游戏机内,会有更多专门的设备加速游戏这个程序的渲染,也就是说,游戏的运行,需要多个部件的同步运行,而游戏本身显然需要一个能够同步的计时单位,和CPU中的时钟同步概念类似,游戏中有个概念叫做帧生成时间,就是把游戏的连续画面分为多个离散的单帧画面,在渲染这一帧画面的时候,从第一个部件开始渲染到最后一个部件结束所需要的时间。在这一帧时间内,游戏需要把下一帧所有的运算,逻辑判断全部结束。游戏本身会有一个主进程,如果直接写入判断条件和人物闪烁的函数,那么所有的运算和逻辑判断都会在一帧内完成,在游戏玩家的视角看来,人物会瞬间消失或者瞬间出现,无法做到渐变和淡入淡出的效果。协程是一种特殊的函数,在monobehaviour生命周期的update和lateUpdate之间,会检查这个MonoBehaviour下的所有协程,唤醒所有满足唤醒条件的协程使用协程函数,可以在执行完自身的计算之后,暂停,并在下一次满足执行条件的时候再次执行该协程函数,并在游戏满足唤醒条件的时候,再次执行协程函数。Unity中调用协程的方法是写一个返回值为IEnumerator的函数,使用yieldreturn来暂停自身,开启协程的方法为在人物预制体血量降低的时候,使用StartCoroutine语句开启人物闪烁效果。制作炸弹的预制体:因为炸弹自身会有一个跳动的效果,所以使用unity中的animation功能创建炸弹的跳动动画。生成炸弹:使用Input.GetKeyDown(KeyCode.Space)语句,读取键盘的按键和当前地图中未爆炸的炸弹数量,如果满足条件,当按下空格的时候,生成炸弹本身,炸弹的位置为当前人物的位置坐标取整,确保炸弹生成的位置在整点坐标位置。炸弹爆炸:使用animation功能制作爆炸特效,使用协程函数,在生成炸弹几秒钟之后,销毁炸弹自身,同时改变用来记录地图中同时存在炸弹数量的变量。播放炸弹爆炸特效,同时使用射线检测根据此时的爆炸范围,找到周围的砖头墙并销毁。之后销毁炸弹特效,回收内存。实体墙的处理:在生成地图的时候,直接把地图上所有的实体墙的坐标存放在一个列表中,在射线检测的时候,如果某个方向被判断为有实心墙,那么在这个方向上,从实心墙的位置坐标开始,取消爆炸特效的显示。协程函数的唤醒条件就是当玩家按下空格生成炸弹,之后执行上述过程,在爆炸特效结束的时候,暂停该协程函数,并且等待下一次的唤醒。生成传送门的位置:按照游戏的设计,首先要确保门的位置和某个随机的砖头墙的位置一致,在玩家的视角看来就是使用炸弹炸开了砖头墙,之后门显示了出来。每次生成新的关卡,先是随机生成砖头墙,存放所有的砖头墙的坐标到一个序列中,再随机从中选出一个坐标点作为门的位置。制作传送门的预制体:传送门分为两个状态:被炸弹触发前:门的样子应该和砖头墙的样子一样,且能够阻挡人物前进和怪物的移动,同样也能触发射线检测相应的效果。所以这时候需要在传送门上附加BoxCollider2D属性用来做碰撞和刚体检测,同时取消勾选IsTrigger选项以便于阻碍移动。当传送门被炸弹炸到之后,也就是当传送门和炸弹的爆炸特效发生碰撞检测,传送门需要改变自身的贴图文件,从砖头墙变成传送门的样子,同时把BoxCollider2D的IsTrigger的值重新设置为true,让人物和怪物能够穿过传送门定义一个变量,实时记录地图中的怪物数量,在人物预制体和被炸弹炸过以后的传送门预制体发生重叠的时候,如果此时地图中的怪物数量为0,那么就开始下一关,使用Destroy函数销毁游戏场景并重新随机生成。3.5:性能优化:每次生成新的关卡的时候,游戏会使用Destroy函数销毁很多的预制体,包括人物预制体,大量重复的实体墙,砖头墙,怪物和场景道具,然后再次重新生成,然而事实上,unity初始化创建一个预制体和销毁一个预制体的过程,都需要消耗非常多的系统资源,其中包括了CPU计算能力,系统带宽,内存空间的频繁申请和释放等,在短时间内涌现的高强度算力需求,很容易造成游戏界面的卡顿和掉帧,在玩家看来就是非常严重的画面撕裂和卡顿,为了解决这个问题,避免算力需求过于集中,需要使用对象池:对象池是一种设计模式,事先实例化一组需要在游戏中使用的预制体,当需要的时候调用,当不需要的时候隐藏起来而不是销毁掉,避免游戏重新大量加载资源的性能消耗。定义一个对象池Object的枚举类型,放入需要频繁生成销毁的预制体:实体墙SuperWall,砖头墙Wall,场景中的道具Prop,地图中的怪物Enemy和爆炸特效BonbEffect。定义get方法,首先判断对象池中是否有足够数量的预制体,有的话就取出相应的预制体并更改对象池中剩余预制体数量,之后的预制体的使用方法和系统重新实例化出的预制体一样。如果对象池中已经没有了足够的预制体,那么重新使用Instantiate方法实例化对象到对象池中,补全空缺的数量,之后使用把相应对象的SetActive的值设置为true,用来激活对象,在回收资源的时候,将SetActive的值设置为false,隐藏该预制体到对象池中,以便于下次再次调用在创建完成对象池之后,使用Instantiate方法将对象池ObjectPool创建为单例,将MapController里的CreateSuperWall函数里的Instantiate方法改成使用对象池的Get方法,同理,MapController下的CreateWall函数等,也写成同样的方法。由于地图创建的时候,实体墙,砖头墙等物体,在实例化和放到对象池里的时候,都涉及到了坐标这个属性,可以直接在ObjectPool中修改Get方法,直接将需要的坐标传值进去,坐到精简代码的目的。3.6:创建道具:按照游戏的设计,在游戏中的道具分为5种1:增加人物移动速度2:增加生命值3:增加能够放置的炸弹的数量,即地图中能同时存在的未爆炸的炸弹的数量4:增加游戏倒计时5:增加炸弹爆炸范围事先准备:创建游戏道具的枚举类型PropType,在对象池中放入对象HP,Speed,Bomb,Range,Time。用来做备用,在unity中选择Prop这个预制体,添加PropType_Sprites,定义标签,分别对应5张图片:设置HP标签,对应图片Sp为增加血量道具的Prop_2,设置Speed标签,对应图片Sp为加速人物道具的Prop_4,设置Bomb标签,对应图片Sp为增加炸弹数量道具的Prop_1,设置Range标签,对应图片Sp为增大炸弹爆炸范围道具的Prop_0,设置Time标签,对应图片Sp为延长倒计时道具的Prop_2,炸弹激活:使用collision.CompareTag()函数判断是否和炸弹特效发生接触或者重叠,即道具是否被炸弹炸到激活,当炸弹被激活的时候,将Collider2D的isTrigger属性设置为True.使得炸弹可以被人物穿过,同时把自己的属性标签Tag随机变成增加血量,增加炸弹,增加倒计时,加速人物和增加爆炸范围五种道具中的一个,在游戏中切换成相应的图片。炸弹被人物触发的判断:使用collision.CompareTag()函数判断人物是否和道具重叠,如果重叠,根据之前随机化出的道具属性标签为人物增加相应的属性。人物吃到道具之后的特效:创建协程函数PropAni(),当人物和道具的位置发生重叠之后,触发协程函数产生特效,人物的颜色红色和白色交替出现,周期为0.5秒,循环4次。人物吃到道具之后的逻辑处理:炸弹数量限制:在人物预制体挂在的脚本下,定义一个Private变量bombCount用来记录炸弹数量,默认为1,意思是当前游戏地图内,只能同时存在一个炸弹。游戏中创建炸弹的条件是Input.GetKeyDown(KeyCode.Space)语句的返回值,也就是当按下空格的适合生成炸弹,为了增加炸弹数量的限制,需要在创建炸弹的时候,除了读取键盘按键之外,增加一条判断语句:bombCount>0,确保地图中能够存在的炸弹数量大于0,同时,在每次创建炸弹之后,bombCount的值减小1。按照游戏的设计,在炸弹爆炸结束之后,人物就能继续创建炸弹,也就是bombCount的值,在创建炸弹的时候减小1,在炸弹结束之后增加1。为了判断炸弹什么时候结束,人物的控制脚本,需要调用炸弹特效的协程函数来获取炸弹特效的结束时间,为了实现这个目标,游戏需要创建回调函数来实现这样的一个消息机制:当一个函数,或者一个脚本,或者一个游戏中的对象,发生了某些事件,需要通过某种渠道,将这个消息告诉需要这个消息的函数或者程序或者方法和对象。Unity中使用委托来实现上述消息传播机制,把方法当作函数的参数传递,把炸弹爆炸的消息传递到人物预制体下挂载的控制脚本中:在炸弹控制脚本下,引入命名空间usingSystem,使用Action定义一个委托aniFinAction,在炸弹特效延时时间结束之后,把它作为参数传递到人物控制脚本下,完成之后,把bombCount的值加1。人物血量,人物移动速度,倒计时时间,炸弹爆炸范围:使用unity给各个相应道具创建标签,通过读取和人物发生重叠的物体的标签,来修改相应的属性。当人物碰撞到HP道具的时候,血量HP增加1;当人物碰撞到Speed道具的时候,速度增加0.03f,为了不让人物移动速度过快,当速度大于0.2f的时候,速度就不再增加。当人物碰撞到Range道具的时候,爆炸特效范围增加1;3.7:摄像机的控制逻辑:游戏随着关卡的增加,地图会越来越大,超出unity的摄像机默认视线范围,在玩家看来,就是游戏人物移动到了场景外部,为了解决这个问题,我们需要设计unity的摄像机跟随控制脚本。在游戏主摄像机MainCamera下创建脚本,定义LateUpdate(),unity对这个方法的处理是每一帧都会在结束完成其他的计算渲染之后,再执行LateUpdate里面的相关判断,由于此游戏的规模和计算复杂度并不算高,现代计算机处理这样级别的计算量非常容易,游戏的帧数会非常高,远远高于人眼能感受到的极限,因此,摄像机跟随的判断,到底是在每一帧前处理还是每一帧后处理,几乎没有任何差别,不会影响到玩家的体验。在GameController脚本下使用Camera.main.GetComponen语句将人物Player的位置传递到摄像机跟随脚本下,先判断人物是否为空,再执行之后的逻辑。如果直接将摄像机强行固定在人物的位置上,游戏画面就会变得非常强硬,任何细微的移动,都会造成整个游戏画面的移动,尤其是当玩家快速反应的时候,整个游戏画面甚至会变的非常晃动,让人头晕,给玩家造成非常不好的体验。我们需要能够让摄像机视角在跟随人物的时候,有一个比较平缓的过度,不至于太强硬的跟踪,毕竟人物如果此时还在摄像机视角中心,在短时间内,不会瞬间超出摄像机视角范围,同时还不能太慢,如果摄像机跟随速度低于人物的移动速度,那么,就会造成在游戏后期人物吃了很多加速道具,移动速度越来越快的时候,摄像机跟不上人物移动,造成“跟丢了”的情况。Unity中提供了插值函数Mathf.Lerp,来实现摄像机跟随的平缓过渡,这个函数需要传入三个值:摄像机初始位置,人物新的位置,摄像机移动速度。其中,摄像机速度设置为人物移动速度的最大值:0.2f,防止摄像机跟丢人物。摄像机范围:我们做摄像机跟随的目的是为了在地图过大的时候,跟随人物的视角,但是在游戏的前几关,地图还不是特别大。摄像机不需要移动,以及在地图变大,需要跟随的时候,摄像机也应该调整位置,避免人物在左上角初始位置刷新的时候,直接把视角转向了角落位置,造成大量的视野范围内都在地图场景外。经过测试可以得到摄像机初始位置的判定范围为(-(X-5),X–7),(-(Y-2),(Y–4))其中,X,Y是此时地图创建时候,长和宽的一半。之后在这个范围内通过插值,即可完成游戏设计的时候想要的效果。3.8:游戏UI设计:状态UI设计:在unity界面,新建一个Canvas,命名为TopBar,调整RectTransform使该UI在游戏上方展开为一个从屏幕左边伸展到右边的长条,在设置界面修改相关的颜色,透明效果等。创建TXT文本,分别命名为HP,Level,Time,Enemy分别记录血量,关卡等级,倒计时和当前地图内怪物的数量。分别调整相关字体的颜色,特效。按照游戏的设计,上面的文字需要实时刷新。在UI控制脚本里定义Refresh方法,在游戏控制器脚本里调用该刷新方法。3:9游戏的封装处理:当完成所有的制作和编译之后,点击unity左上角的file按钮,之后点击BuildSetting按钮,把整个游戏所有的Scenes都勾选在内,之后在Platform界面中可以看到许多选项,其中包括了常用的PC平台,Android平台,iOS平台等,在选择了PC,MAC&LinuxStandalone选项之后,TargetPlatform选择了Windows,Architecture选择了x86_64之后,点击Bulid,在弹出的界面选择要打包的文件夹,命名该项目,点击确定,即可得到打包为exe文件的游戏,使用压缩软件,或者其他的打包软件,即可得到最终的,方便发布到外界的版本。游戏总结本游戏使用unity2018作为开发工具,经历了完整的unity小游戏开发过程:从设计玩法,到整理游戏中需要解决的问题,分析需求,再到软件开发环境的搭建,美术资源导入,游戏地图创建,地图场景中NPC的创建,再到摄像机视角设计以及游戏最终完成之后的封装发布。本游戏由于资源,时间有限,无法做到规模宏大,但是基本的模块框架已经建立,对于以后的升级来说十分方便,比如:如果想要优化人物的动画特效,可以直接使用Animation创建新的动画并导入,无需修改其他模块。参考文献:[1]林梅燕,廖一鹏.基于Unity3D的体感游戏设计与视角互补滤波优化[J/OL].宁夏大学学报(自然科学版):1-7[2021-05-17]./kcm
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 上海财经大学《教育管理学》2025-2026学年期末试卷
- 沈阳理工大学《民族学调查与研究方法》2025-2026学年期末试卷
- 上海闵行职业技术学院《电工电子技术》2025-2026学年期末试卷
- 沈阳药科大学《经络腧穴学》2025-2026学年期末试卷
- 上海工商外国语职业学院《西方行政学理论概要》2025-2026学年期末试卷
- 山西工学院《毒理学》2025-2026学年期末试卷
- 上海师范大学天华学院《音乐学导论》2025-2026学年期末试卷
- 太原学院《比较文学》2025-2026学年期末试卷
- 苏州科技大学《社会学教程》2025-2026学年期末试卷
- 上海交通大学《材料合成与制备》2025-2026学年期末试卷
- 2025年高考地理复习突破集训:大题07工业(3大热点角度)解析版
- 造林劳务合同协议
- 服务接待合同协议
- 第六讲五胡入华与中华民族大交融-中华民族共同体概论专家大讲堂课件+第七讲华夷一体与中华民族空前繁盛(隋唐五代时期)-中华民族共同体概论专家大讲堂课件
- 物流行业的黑科技
- 【西安交通大学】2025年电力人工智能多模态大模型创新技术及应用报告
- 风电工程质量管理规程
- 设备验证培训
- LY/T 3409-2024草种质资源调查编目技术规程
- 《趣味学方言》课件
- 2024年江苏省南通市中考地理试题(含答案)
评论
0/150
提交评论