《基于Unity3d引擎的ACT游戏设计与实现.docx》由会员分享,可在线阅读,更多相关《基于Unity3d引擎的ACT游戏设计与实现.docx(39页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、摘要从游戏诞生之始到现在,游戏市场就发生了非常大的变化,从卡带的游戏机到现在的电脑,专门的游戏主机等。在此之中,像素游戏是一个很重要的过渡期,像素图由于占空间少,颜色少,所以在最初阶段的电子计算机上时代中,就被采用来作为制作游戏的标准图片形式,因为最开始的游戏处理芯片比较低级,自然不能跟如今的3d游戏相比较了,能运行的图片都有严格的颜色和大小的限制。而且图片几乎都是以动态的形式出现的。在如今的游戏开发中,Unity的工具的发明,使能向往游戏开发的人入门游戏开发不再困难。在本课题中,将使用Unity引擎开发像素风格的2d横板动作游戏,其中会复刻多个经典像素游戏中的游戏技能,结合当前火热的Unit
2、y物理引擎,对以前的游戏以当前的技术进行重现,对以后游戏开发的思路有很大的参考价值关键词: 像素游戏 2d横板动作游戏 Unity物理引擎 AbstractFrom the beginning of the game to now, the game market has changed a lot, from the game machine with card to the computer and special game console. Among them, the pixel game is a very important transition period. Because
3、the pixel image takes up less space and color, it was adopted as the standard image form for making games in the early era of electronic computer. Because the first game processing chip is relatively low-level, it cant be compared with todays 3D games, and the pictures that can run have strict appea
4、rance Color and size limits. And pictures are almost always in dynamic form. In todays game development, the invention of unitys tool makes it no longer difficult for people who can yearn for game development to start game development. In this project, we will use unity engine to develop 2D board ac
5、tion game with pixel style, in which we will copy the game skills of several classic pixel games, and combine the current hot unity physical engine to reproduce the previous games with the current technology, which has great reference value for the future game development ideasKey words: pixel game
6、2D board action game unity physical engine目录1. 研究课题及意义12. 游戏的设计工具23. 游戏详细设计33.1设置游戏场景地地图33.2Tilemap部分其它工具43.3利用Tilemap开始进行地图制作43.4制作动画53.5制作玩家的控制方式(安卓控制脚本开发)53.6创建角色的摄像机63.6.1 角色跟随功能的实现63.7开发玩家主角的各种状态73.7.1 地面状态73.7.2 设置多段跳(二段跳)83.7.3 墙壁滑动状态83.7.4 玩家向前跳103.7.5 二段跳跃和蹬墙跳跃113.7.6 墙角攀爬系统123.7.7 玩家前冲残影效果
7、143.7.8 玩家攻击系统163.8敌人系统173.8.1 稻草人模型173.8.2 野猪模型203.9游戏的小地图(Minimap)233.10对话系统243.11玩家的触碰敌人受到伤害和玩家死亡后的重生系统253.11.1 重生系统263.12辅助工具Gizmos274. 开发总结295. 参考文献306. 致谢311. 研究课题及意义动作游戏(Action Game)是游戏中的一种。它强调玩家的反应能力和手眼的配合。以游戏机为主、电脑为辅。动作游戏的剧情一般比较简单,主要是通过熟悉操作技巧就可以进行游戏。这类游戏一般比较有刺激性,情节紧张,声光效果丰富,操作简单。在动作游戏中,在FC游
8、戏家用机的时代中,有一些比较著名的作品,如高桥名人的冒险岛,松鼠大战等的游戏横板游戏作品,以引人入胜的剧情和巧妙地关卡设计,成为了8090年代地难忘的游戏之一,在现在的PC游戏作品中,动作游戏的优秀作品更是数不胜数,如StudioMDHR开发的游戏Cuphead,在在正式发售后大约一个月,这部作品销量就已经突破了百万大关,并达到了与星露谷物语Undertale饥荒等相当的水平,如今这款游戏已经成功登陆多个平台,成为最炙手可热的游戏作品之一。还有Team Cherry开发的空洞骑士,这是一款画面清新,难度挑战的动作冒险游戏,里面丰富的关卡设计和适中的难度,吸引了很多玩家为之疯狂。虽然现在各种mo
9、ba游戏和射击游戏类的网游很多,但是在动作游戏从诞生至此,虽然不算是非常炙手可热,但是经过了多年依旧魅力不减,主要的玩家群体是有很多玩家愿意通过自己的探索,自己去进行游戏的探险,而不是与他人合作,这类游戏对于玩家来说就是对游戏作品的敬仰,对游戏开发者来说就是智力与创造力的挑战动作游戏的分类其实有很多,而本次研究课题是动作游戏中的横板闯关游戏,在游戏中,玩家通过控制主角用武器去攻击敌人,消灭敌人以过关的游戏,在游戏中,将运用到游戏AI常用到的有限状态机框架去开发,这种框架在其他的一些游戏中非常常见,运用这个框架能使敌人AI更具有智能性,使游戏更具趣味,研究这个课题的目的是在于能运用自己所学的知识
10、,开发出一个完整的游戏。为以后自己能力的提升提供一个踏脚石。2. 游戏的设计工具游戏的设计工具有编程工具Microsoft Visual Studio2017,图片绘制工具photoshop,游戏引擎工具Unity3d编程工具Visual Studio2017: Microsoft Visual Studio是VS的全称。VS是美国微软公司的开发工具包系列产品。VS是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等等。在Unity与Visual Studio的关系中,在旧版本Visual studio2015以前是难以
11、支持Unity的开发的,知道Visual studio2015中新增了Visual Studio Tools for Unity插件,给Unity的程序开发工作提供了支持,时至现在,在Visual studio2017版本已经是完全支持Unity3d的程序开发了,在Visual studio2017版本中能够快速找到Unity3d的脚本组件,为Unity3d的程序开发提高了效率。图片绘制工具photoshop:Adobe Photoshop,简称“PS”,是由Adobe Systems开发和发行的图像处理软件。 Photoshop主要处理以像素所构成的数字图像。使用其众多的编修与绘图工具,可以
12、有效地进行图片编辑工作。至今在各个领域中活跃着,如平面设计等,在2d游戏的开发中,必然少不了的是游戏素材,使用Photoshop能快速地绘制我们所需的2d游戏素材,在Adobe Photoshop中能导出多种格式的图片,在Unity3d中都能很好地支持。游戏引擎工具Unity3d:Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。使用Unity3d可以创建属于自己地2d和3d游戏,Unity3d内部有很多功能丰富的API,能很多地满足了游戏开发人员的各
13、种开发需求。而且Unity3d是完全基于.net环境的,c#语言对其有很好的支持。 3. 游戏详细设计本详细设计将对游戏中重要的,复杂的逻辑进行详细讲解,具体详细地讲解游戏中各种逻辑地实现,为后续希望开发同类游戏的开发者提供借鉴与参考。3.1 设置游戏场景地地图由于2d游戏的地图是采用sprite精灵图片,由于手动摆放地图图片十分浪费时间,而且难以保证图片之间是否存在缝隙,地图由于是不规则形状,为地图设置碰撞器也是十分困难,而且十分耗费时间的事情。使用Unity系统自带的tilemap地图构建系统,这个新功能是Unity2017.2以及以上版本提供了这样的新功能,这个新功能代替了传统的2d游戏
14、地图的制作方式,大大提高了开发人员制作游戏地图的速度。首先,介绍一下Tilemap的基本概念,Tilemap用起来其实就和现实中画画一样,它由以下五个基本部分组成:Sprite(精灵):纹理的容器。大型纹理图集可以转换为精灵图集(Sprite Sheet)。Tile(瓦片):包含一个精灵,以及二个属性,颜色和碰撞体类型。使用瓦片就像在画布上画画一样,画画时可以设置一些颜色和属性。Palette(调色板):当你在画布(Canvas)上画画时,会需要一个位置来保存绘画的结果。类似地,调色板(Palette)的功能就是保存瓦片,将它们绘制到网格上。Brush(笔刷):用于将画好的东西绘制到画布上。使
15、用Tilemap时,可以在多个笔刷中任意选择,绘制出线条、方块等各种形状。Tilemap(瓦片地图):类似Photoshop中的图层,我们可以在Tilemap上画上Tile。只有有了Tilemap的工具,开发人员就可以根据美术素材,快速进行2d场景地图的绘制了3.2 Tilemap部分其它工具Grid(网格):用于控制网格属性的组件。Tilemap是Grid的子对象。Grid类似于UI Canvas(UI画布)。Tilemap渲染器(Tilemap Renderer):用于控制Tile在Tilemap上的渲染,控制诸如排序、材质和遮罩等。3.3 利用Tilemap开始进行地图制作有了上面的理论
16、之后,就开始进行实际的地图制作了实现点击window菜单按钮,打开2d-tilepalette,打开调色板,创建一个新的调色板,命名为Tile Set1,把素材用的精灵图片拖到调色板上此时在层次面板上,点击右键2d Objecttile Map,创建出一个Gird 节点的物体在Gird节点下创建游戏需要的地板,背景和其他的一些装饰等的一些Tile map节点,分别命名为Platforms,Background,Decoration,Foreground Decoration点击Platforms,同时在调色板面板上的Active Tilemap这里选择Platforms,点击笔刷工具,开始绘制
17、地板点击Gird节点的Background节点,同时在调色板面板上的Active Tilemap这里选择Background,这里虽然之前绘制了Platform的Tilemap,但是只要在Active Tilemap选择了另外的层之后,就不会影响之前的Platform。 由于绘制了多层的Tilemap之后,而且tilemap和图片一样,都有绘制的顺序的,要考虑到Tilemap之间的渲染顺序,所以,在每个Tilemap的Tilemap renderner组件的Additional Settings的sorting layer中,为每个Tilemap添加对应的sorting layer。因为主角必
18、须在地上行走,所以为地板和墙壁的Tile map添加碰撞体,虽然tilemap本质上是精灵图片,可以加盒子碰撞器,但是按照传统的盒子碰撞器的添加方法,效率不高,所以,采用的是Tilemap独有的碰撞器添加方法添加Tilemap collider2d,但是这种方法为每个tilemap的格子都添加盒子碰撞器,会消耗大量资源,因此,再为这个tilemap添加一个Composite Collider2d,这种碰撞器会根据Tilemap的形状计算,压缩一些不必要的Tilemap 碰撞器,只要在Tilemap collider2d组件上,Used By Composite勾选,Composite Coll
19、ider2D才会生效但是,在设置完后,运行游戏发现游戏的地板和墙壁掉下来,于是将地板和墙壁的Tilemap的2d刚体设置为Static,因为地板和墙壁是不会动的3.4 制作动画将玩家各个动作的序列图拖到层次面板上,将产生的动画文件保存到Animatons的文件夹下,将野猪和稻草人的各个动作各个动作的序列图拖到层次面板上,将产生的动画文件保存到Animatons的文件夹下,3.5 制作玩家的控制方式(安卓控制脚本开发)本游戏是支持pc平台以及安卓平台的,pc平台主要是通过键盘按键输入实现对玩家的控制,而安卓平台是通过屏幕的触摸检测,通过按下手机屏幕设置的UI按钮实现对玩家的控制,本小节介绍如何设
20、置手机上的UI,实现对玩家的输入。本小节的核心思路是通过触摸插件EasyTouch,对玩家的输入进行操作由于已经导入了Easytouch插件,所以在层级面板上,就像普通的UGUI创建组件一样,右键创建Easytouch ControlsButton,创建出左右键,和攻击跳跃等按键。又因为需要脚本挂载的游戏物体,所以在层级面板上,创建一个空物体scripts,在这个脚本上,挂载一个Mobilescrpts在这个脚本中,编写玩家移动的方法,编写玩家攻击跳跃等的方法在玩家控制脚本上,使用下面的两套预处理模板,分别处理当游戏在安卓平台上运行移动攻击逻辑和当游戏在标准windows平台上运行时的玩家移动
21、攻击逻辑,这样就能实现无论是在windows平台或者是安卓平台,游戏都能运行。#if UNITY_ANDROID 安卓代码运行处#endif和#if UNITY_STANDALONE_WIN windows标准平台运行处#endif3.6 创建角色的摄像机由于游戏是采用2d的游戏模式,玩家移动时候需要有一个摄像机进行玩家移动跟随。在Unity的Package manage中,内置了一个Cinemachine的插件,CineMachine能创建各种类型的摄像机,非常适合在本项目中使用。同时,CineMachine还提供了多种功能让我们方便实现游戏中的其他功能。由于本项目是2d游戏,在菜单栏中,点
22、击Cinemachine的菜单项创建一个2dCamera3.6.1 角色跟随功能的实现在Cinemachine中,由于这个组件已经为我们内置了非常多的常见的相机功能,也包括角色跟随的功能,用这个插件,实现这个功能的步骤非常简单,只需将整个角色的游戏物体的transform拖进新创建的2d Camera中 3.7 开发玩家主角的各种状态3.7.1 地面状态由于是2d游戏,玩家需要在地面上行走,还有当玩家需要进行跳跃时,要检测是否能进行跳跃,所以检测玩家是否在地上,是必不可少的条件。以往在3d游戏中,都只是直接在玩家身上只是添加一个全身的碰撞盒子,用全身的碰撞盒子和地面进行碰撞检测,但是,在本项目
23、中,存在墙壁,以及其他状态都站在地上,很难和其他状态进行区分,在以后的工作中,还需要进行墙壁的碰撞检测,因此只是用玩家一个碰撞盒进行检测和以后的墙壁碰撞检测相互矛盾,因此,在玩家的物体上挂载一个空物体,用这个空物体进行碰撞检测,但是,如果给这个空物体添加碰撞盒,必然会和玩家身上的碰撞盒发生碰撞,对检测造成不必要的错误,因此,使用其他的方法进行碰撞检测,在这里,使用物理函数Physics2D.OverlapCircle()进行射线检测物理函数Physics2D.OverlapCircle()函数是检测某个碰撞体是不是在某个圆形区域内,返回碰撞体。在玩家的物体下,挂一个空物体,命名为GroundC
24、heck,用于检测玩家是否已经着地,如下图所示检测玩家是否着地是用Physics2D.OverlapCircle()函数来检测是否着地,其中有三个参数,第一个参数点,第二个参数是检测的半径,第三个参数是检测的层定义三个参数,其中第一个是transform类型公有变量groundCheck,groundCheck.position这个参数传进检测函数里面,用于指定检测的物体的点,第二个参数是半径groundCheckRadius,第三个是定义一个公有的Layermask变量whatIsGround,等脚本编译后,在Unity编辑器里将Platforms的tilemap添加一个Layer为grou
25、nd,把Platforms拖进脚本的ground中核心实现代码如下:public Transform groundCheck; /检测玩家是否着地public LayerMask whatIsGround; /地面层isGrounded = Physics2D.OverlapCircle(groundCheck.position, groundCheckRadius, whatIsGround);3.7.2 设置多段跳(二段跳)由于玩家在跳跃的过程中,y轴上的速度有明显的区别,在玩家上跳的过程中,玩家的速度方向沿着y轴的正方向增加,下落的过程中,玩家的速度方向沿着y轴的负方向减少。因此,可以用
26、玩家速度的方向,把一套完整的跳跃的部分区分开。把一套跳跃动作分为三个部分,在Animator的参数列表中定义一个y轴上的速度,以y轴上的速度制作玩家跳跃的混合树,混合树分为三个阶段,第一个阶段是上升,第二个阶段是上升到顶点,第三个阶段是玩家达到最高点之后的下落阶段3.7.3 墙壁滑动状态在游戏中,玩家触碰到墙壁并且按着前方向的话,玩家不会因为重力马上掉下地面,而是和墙壁类似一种摩擦力让玩家游戏对象缓慢从墙壁上滑下来。由于玩家是在空中,并且触碰到墙按着前方向的时候,才能拥有这种行为,因此,玩家需要满足多项条件,第一项,玩家是在空中的状态,而不是在地上的状态,在地上触碰到墙,是无法拥有这种状态的。
27、第二项,玩家是触碰到墙,因为这种状态只有触碰到墙才能发生,第三项是,玩家按的方向和玩家游戏对象的前方向一致,所谓前方向,就是玩家的正面面向的方向,只有满足这三个状态,才能触发玩家沿着墙壁缓慢滑下的行为。在玩家的物体下,挂一个空物体,命名为wallCheck,用于检测玩家是否已经触碰墙壁检测玩家是否着地是用射线检测的方式检测玩家是否触碰墙壁,在本项目中不使用碰撞盒子检测的方法,而是使用射线检测,其对应的函数是Physics2D.Raycast(),用射线检测的好处是不用主角身上挂载太多碰撞盒子,其中有四个参数,分别是检测物体的点,方向,射线距离,射线检测的层。定义四个参数,其中第一个是trans
28、form类型公有变量wallCheck,wallCheck.position这个参数传进检测函数里面,用于指定检测的物体的点,第二个参数是方向,传进transform.right,即玩家的前方向,第三个参数是射线距离,定义一个float类型变量wallCheckDistance传进函数中,第四个参数是射线检测的层,把whatIsGround作为参数传进函数中因为玩家身上具有多种状态,状态与状态如果不用一些标志位进行区分,就会造成程序的混乱,为此,为玩家的滑动状态创建一个标志位变量isWallSliding在游戏的进行过程中,必须每个时候都要检测玩家当前所处的状态,因此,创建一个函数CheckI
29、fWallSliding,用来检测玩家是否处于墙壁滑动的状态。实现检测的核心代码如下 private void CheckIfWallSliding() if (isTouchingWall & movementInputDirection = facingDirection & rb.velocity.y 0 & !canClimbLedge) isWallSliding = true;/如果已经触碰到了墙壁,y轴上的速度是小于0(下落中),按键输入的方向是玩家正面的朝向 else isWallSliding = false; 有了能检测玩家是否处于滑动状态的函数,就必然要有处理玩家滑动行为
30、的方法,在检测玩家滑动状态结果中,根据检测的结果,处理玩家墙壁滑动的行为,实现滑动行为的代码如下if (isWallSliding) /当玩家正在处于墙壁滑动的状态时 if(rb.velocity.y -wallSlideSpeed) rb.velocity = new Vector2(rb.velocity.x, -wallSlideSpeed); 3.7.4 玩家向前跳由于自己定义的方法只能是在原地进行跳跃,在游戏中,常常需要根据玩家输入的方向进行相应方向的跳跃,所以,在原来的基础上,结合输入的方向,往该方向添加相应的力便能往该方向进行跳跃。实现步骤:因为开始的跳跃是只是在原地进行跳跃,由
31、于游戏有多个跨度比较大的平台,玩家需要跳跃到对应的平台完成任务,所以定义 一个在空中移动的力量movementForceInAir定义一个Vector3的变量,把movementForceInAir*movementInputDirection的值传进这个变量。作为x的值。刚体通过AddForce(),添加这个力添加到玩家刚体上3.7.5 二段跳跃和蹬墙跳跃在一些游戏中,二段跳和蹬墙跳跃是拓展玩家操作的一个有实际意义的操作。二段跳的使用场景玩家在跳上一些跨度比较大,或者高度比较高的平台的时候,二段跳可以帮助玩家弥补跳跃宽度或者跳跃高度不足的缺陷。蹬墙跳的使用场景是玩家在一些需要跳跃一些比较高的
32、高台时,而且玩家使用二段跳也无法达到的高度时,玩家可以借助墙壁,将自己身体反弹,通过不断反弹 ,达到玩家能够达到的高度。二段跳:当玩家在空中按下一次跳跃时,再按下跳跃键的时候,让玩家往一个方向上产生一定大小的力蹬墙跳:玩家触碰到墙,通过判断玩家是否能达到能蹬墙跳的条件,然后根据玩家的朝向,往一定方向产生一定大小的力检测蹬墙跳的核心代码if(!isGrounded & isTouchingWall & movementInputDirection != 0 & movementInputDirection != facingDirection) WallJump();/如果不在地上,触碰到墙,有
33、输入方向 实现蹬墙跳核心代码:/ / 墙壁跳跃 / private void WallJump() if (canWallJump) rb.velocity = new Vector2(rb.velocity.x, 0.0f); /用一个力来跳跃,而不是像正常跳跃那样直接设定速度,如果我们有一个向下的速度,我们失去了力,向下的速度越大,在你加上力后,我们向上的速度就越小 isWallSliding = false; /一开始就将y轴的速度设置为0 amountOfJumpsLeft = amountOfJumps; amountOfJumpsLeft-; Vector2 forceToAdd
34、= new Vector2(wallJumpForce * wallJumpDirection.x * movementInputDirection, wallJumpForce * wallJumpDirection.y); rb.AddForce(forceToAdd, ForceMode2D.Impulse); /1,2是右上角的方向 jumpTimer = 0; /计时器清零 isAttemptingToJump = false; /尝试跳跃关闭 checkJumpMultiplier = true; turnTimer = 0; canMove = true; canFlip = t
35、rue; hasWallJumped = true; wallJumpTimer = wallJumpTimerSet; lastWallJumpDirection = -facingDirection; 3.7.6 墙角攀爬系统墙角攀爬系统是玩家除了二段跳和蹬墙跳之外的一种玩家移动的拓展方式。墙角攀爬系统是当玩家通过跳跃,跳上一个平台的角落边缘下落时,能够停靠在边缘的位置,并且产生一小段的位移,到达平台上,即玩家能进行一个攀爬动作,然后登上这个平台,而不至于玩家因为跳跃高度只能达到墙角跳不上平台,掉下地面首先判断地图中,那些是属于平台墙角的物体,只要玩家接触到这些墙角,就能自动播放攀爬的动作
36、,所以,首先是判定玩家什么时候才能悬挂。如图所示,判断的条件应该是,首先,玩家的头顶上没有额外的平台,和墙壁,并且下方应该是有其他的墙壁的,还有游戏角色判定应该离墙壁不是那么地远,角色的头顶发出的射线没有碰撞到物体,而角色身体的射线应该有碰撞到物体,只有符合这个条件,才能判定为悬挂状态检测的核心代码如下isTouchingWall = Physics2D.Raycast(wallCheck.position, transform.right, wallCheckDistance, whatIsGround);isTouchingLedge = Physics2D.Raycast(ledgeCh
37、eck.position, transform.right, wallCheckDistance, whatIsGround); if(isTouchingWall & !isTouchingLedge & !ledgeDetected) ledgeDetected = true; ledgePosBot = wallCheck.position;/把攀爬下缘设置为身体射线的位置 等播放完玩家的攀爬动画之后,玩家的游戏对象会根据墙角攀爬系统计算出来的结果而产生一段小的位移,到达平台上面:具体的实现代码如下private void CheckLedgeClimb() if(ledgeDetect
38、ed & !canClimbLedge) canClimbLedge = true; if (isFacingRight) ledgePos1 = new Vector2(Mathf.Floor(ledgePosBot.x + wallCheckDistance) - ledgeClimbXOffset1, Mathf.Floor(ledgePosBot.y) + ledgeClimbYOffset1); ledgePos2 = new Vector2(Mathf.Floor(ledgePosBot.x + wallCheckDistance) + ledgeClimbXOffset2, Ma
39、thf.Floor(ledgePosBot.y) + ledgeClimbYOffset2); else ledgePos1 = new Vector2(Mathf.Ceil(ledgePosBot.x - wallCheckDistance) + ledgeClimbXOffset1, Mathf.Floor(ledgePosBot.y) + ledgeClimbYOffset1); ledgePos2 = new Vector2(Mathf.Ceil(ledgePosBot.x - wallCheckDistance) - ledgeClimbXOffset2, Mathf.Floor(l
40、edgePosBot.y) + ledgeClimbYOffset2); canMove = false; canFlip = false; anim.SetBool(canClimbLedge, canClimbLedge); if (canClimbLedge) transform.position = ledgePos1; 在动画状态机中,设置好攀爬动画的转换条件和动画和动画之间转换的参数之后,在攀爬动画中,调出Animation面板,在Animation面板中打开攀爬动画,在攀爬动画的最后一帧,添加动画事件,把动画播放完之后要调用的事件函数传进去3.7.7 玩家前冲残影效果前冲残影是指
41、当玩家输入了前冲的操作时,玩家以一个十分迅速的速度进行一段比较长的位移,因为是玩家短时间内进行一段比较长的位移,使用残影效果突出玩家移动的迅捷。所谓残影现象,是指眼睛捕获移动事物的速度不及事物自身的移动速度时,使眼睛无法看清事物在运动中的位置,但因视觉暂留的影响,眼睛能看见事物之前位置的影像,这种影像被称为残影。衬托玩家的移动速度快,使用残影最合适不过了。在玩家移动的过程中,记录玩家移动过的位置,将玩家移动过的位置存进一个物体中,让这个物体跟随着物体,根据移动的距离的不同,设置相应数量的残影,残影的透明度也会随着玩家位置的增多而变淡。核心原理是对象池技术,由于在游戏中,频繁调用销毁方法,生成方
42、法会极大地消耗系统地资源,而对象池技术能很好地弥补了这个缺点。对象池背后的理念其实是非常简单的。我们将对象存储在一个池子中,当需要时在再次使用,而不是每次都实例化一个新的对象。池的最重要的特性,也就是对象池设计模式的本质是允许我们获取一个“新的”对象而不管它真的是一个新的对象还是循环使用的对象。创建一个脚本PlayerAfterImageSprite,挂载到一个空物体上,这个脚本用来记录玩家经过的单个位置,玩家的旋转,以及玩家位置变化的透明度值再创建一个空脚本PlayerAfterImagePool,挂载到一个空物体上,这个脚本用来管理每个AfterImage的产生与销毁,充当对象池的作用实现
43、对象池具体代码如下SerializeField private GameObject afterImagePrefab; private Queue availableObjects = new Queue(); public static PlayerAfterImagePool Instance get; private set; private void Awake() Instance = this; GrowPool(); private void GrowPool() for (int i = 0; i 10; i+) var instanceToAdd = Instantiate(afterImagePrefab); instanceToAdd.transform.SetParent(transform); AddToPool(instanceToAdd); public void AddToPool(GameObject instance) instance.SetActive(false); availableObjects.Enqueue(instance); public GameObject GetFromPool()
限制150内