内容摘要 随着中国游戏以及互联网科技的发展, 游戏越来越受到人们的欢迎, 不管是手机游戏,电脑游戏,还是主机游戏,都在中国市场中占有很大
的份额,游戏的交互性不同,以及按玩家年龄分类,分层等特点使得它 适合各种年龄层的人。在各种游戏中,角色扮演类游戏得到大多数人的 青 睐,在此之上衍生出的动作角色扮演类游戏由于动作元素的加入成为 更多人的选择。 动作角色扮演类游戏是一种融合了动作类游戏以及角色扮演 类游戏 的一种游戏类型 , 玩家可以在体验游戏剧情的同时体验到游戏丰富的动 作系统。本次毕业设计制作的游戏便是一款角色扮演类游戏, 但是求其 风格偏向做出了调整,与以往追求爽快简单的动作角色扮演类游戏不同 的是,本游戏加入了市面上一种新的“魂式”玩法,即更多的操 作要求 以及更难的难度,更加强调玩家的生存感,而是否能将这两者成功进行 结合,产生一个新的方向,则是本论文所需要探讨解决的问题。此 外, 游戏将使用 Unity3D 引擎进行制作。 关键词 :Unity3D ;3D 技术;动作角色扮演类游戏 Abstract W ith the development of Chinese games and Internet technology, gam es are becoming more and more popular among people. Whether it is mobile games, computer games or console games, they all have the ir own position in the Chinese market. The game itself is also in the Chinese market. With a large share, the game''s interactivity , classification, and stratification make it suitable for people of all ages. Among them, role-playing games are favored by most p eople in various games, and the action-playing games derived from them are the choice of more people because of the addition of ac tion elements. Action role-playing games are a type of game combi ning action-type games and role-playing games. Players can experi ence the game''s rich action system while experiencing the plot of the game. The game designed by this graduation is a role-playing game, but its style has been adjusted. Unlike the previous pursu it of refreshing and simple action role-playing games, this game has added a new type on the market. "Soul-style" gameplay, that i s, more operational requirements and more difficult difficulty, a nd more emphasis on the player''s sense of survival, and whether t he two can be 1 successfully combined to produce a new direction, this paper needs to explore solved problem. In addition, the gam e will be produced using the Unity3D engine. Keywords :Unity3D 3D technology Action R 目录 第一章 绪论................................... ............ 3 1.1 选题的目的和意义 ..................................... ..................................... 3 1.2 国内外研究现状 ............. ................................................................. 4 1.3 论文组织结构 ................................................... ............................... 4 第二章 开发工具介绍 .................... ................... 5 2.1 Unity3D 游戏引擎........................... ................................................ 5 2.1.1 U nity3D 软件介绍 . ................................ 5 2.1.2 物理引擎 ........... ............................. 5 2.1.3 U nity 常用生命周期的函数 .......... ............... 6 2.1.4 用户界面 UI . ............................... ...... 6 2.2 模型与动画 .............................................. ........................................ 6 2.3 C# 开发语言........... ................................................................. .......... 6 2.4 Visual Studio 2017.............................. ............................................ 6 第三章 游戏设计.......... ................................. 7 3.1 游戏场景设计与制作 ............... ....................................................... 7 3.1.1 游 戏场景制作 .................................... 7 3.2 游戏主角设计与功能实现 .... .......................................................... 8 3.2. 1 人物模型设置 .................................... 8 3.2.2 角色的基本设计与实现 ........................... 1 0 3.2.3 角色的攻击设计与实现 ................ ........... 1 2 2 3.2.4 角色的防御设计与实现 ........................... 1 6 3.3 怪物(敌人)设计与实现 ............................................... .............18 3.4 战斗设计与实现 ..................................... .......................................21 3.4.1 战斗伤害实现 .......... ......................... 2 1 3.4.2 战斗死亡实现 ...................... ............. 2 3 3.4.3 战斗交互实现 .................................. . 2 4 3.4.4 角色升级实现 ................................... 2 5 3.5 游戏 音效管理 ............................................................ ....................26 第四章 游戏界面与视觉效果 ............................ .... 27 4.1 角色属性以及图标显示 .......................................... ......................27 4.2 游戏菜单功能实现 ........................... .............................................31 4.2.1 开始场景界面与功能实现 ......................... 3 1 4.2.2 游戏中界面与功能实现 ................. .......... 3 3 4.3 游戏中的视觉效果 ..................................... ...................................35 第五章 游戏剧情制作 ................ ...................... 36 第六章 游戏测试以及打包 .......................... ........ 40 第七章 总结.............................................. 42 参考文献 ................................................. 42 致谢 错 误!未定义书签。 第一章 绪论 1.1选题的目的和意义 随着现代科技的发展,电子游戏变得越来越多样化,更是形成了一种独特的游 3
戏文化,各式各样的游戏层出不穷。在中国,随着2014 年游戏机禁令正式解除,索 尼,微软,任天堂的游戏机以及游戏作品也是给中国玩家 带来了更多的游戏体验, 更是给中国游戏市场注入了新的力量,如今,中国的游戏发展迎来了全盛期,以腾 讯,网易为首的游戏公司为玩家们带 来了丰富多样的游戏,让中国的游戏业焕发了 新生。 在最近的游戏发展中,产生了许多非常优秀的游戏,而在众多种类的游戏中, 动作角色扮 演类游戏更是经久不衰,其下众多的分支更是给这类游戏注入了强大的 生命力,玩家喜欢动作角色扮演类游戏的原因大多是因为其优秀的动作手感 以及剧 情给玩家带来的代入感,不同于传统 RPG 回合制的战斗,ARPG 带来的战斗多样性 策略多变性更是引人入胜,因此我觉得开发 一款 ARPG 游戏不仅能锻炼自己作为游 戏制作者的能力,更能试着去为玩家带来更多的玩法。 Unity3D 引擎同时也是国内 开发 产商最喜欢使用的游戏引擎,其轻便,核心化的开发功能更是为开发者们带来 了便利,优秀的动作管理模块也为动作游戏的设计提供了基础,Ti meline 组件则能 为人物剧情动画的设计提供帮助,是一款十分优秀的游戏制作引擎。 1.2 国内外研究现状 1952 年,剑桥大 学一名计算机科学家开发出了史上第一款有记录的电脑游戏 《Noughts&Crosses 》 , 这是一款能在计算机运行的井字游戏, 游戏的历史从此开始, 在接下来的几十年里,计算机的崛起以及计算机语言的出现,游戏开始慢慢的发展 起来,直到 1972 年,雅达利公 司的 Nolan Bushnell and Al Alcorn 开发出了一款名叫 《Pong 》的游戏,这款游戏成为第一款在商业上 取得成功的视频游戏产品,且在其 后,越来越多“山寨” 《Pong 》的游戏出现,推动了整个视频游戏行业的发展,雅达 利在商业上取得 成功的同时,游戏业也开始迅速发展,街机游戏等开始充斥在大街 小巷,特别是在 1980 年《吃豆人》这款游戏出现后,世界更是掀起了一 股游戏热潮 随后,任天堂开始进军游戏界,为玩家带来了无数经典的作品,更是在当时成 功垄断了日本的游戏产业,开启了游戏业的全新时代, 接下来的几年内, PC 端游戏 《Doom》的出现,索尼和世嘉等各大游戏制作公司的加入,使得游戏行业开始往多 元化发展,时至今日, 国外游戏仍然蓬勃发展,游戏种类众多,玩法也朝着多种玩 法相结合的方向发展。 1.3 论文组织结构 最开始构思论文后,对相关专业资料 进行了查证以及参考,由此确定了此动作 角色扮演游戏的设计与开发的可行性,并结合相关游戏开发流程,包括整个开发周 4 期和个人能力的 预期,将此论文分为六章,其中每个章节的大致内容如下所示: 第一章:绪论,主要描述了此项目的目的以及意义,此项目在国内外的发展研 究 现状; 第二章:对本项目的开发需要用到的各种开发工具的介绍; 第三章:拆分游戏功能模块,具体讲述每一个模块的具体实现方法 第四章: 描述游戏内的 UI 设计的以及实现 第五章:游戏的剧情制作 第六章:对游戏进行打包以及测试 第七章:本论文的总结 第二章 开发工具 介绍 2.1 Unity3D 游戏引擎 2.1.1 Unity3D 软件介绍 Unity3D 是一个由 Unity Technol ogies 开发的 3D 引擎,不仅是游戏,借助 Unity3D , 制作者还可以创建建筑可视化, 三维动画等待, 其友好的可视化 开发环境, 能够让新手快速上手, 而且 Unity3D 几乎不经过修改代码就可以实现跨平台的特性, 更是在移动游戏快速发展的今天显 得尤为重要。 Unity3D 引擎自身拥有许多优势,相比一些产商需要付费使用的游戏引擎, Unity3D 向广大游戏制作者免费开发 ,只有当游戏盈利超过一定金额才会向制作者 收取一定费用,且引擎本身拥有充足的现成资源,其官方商城中更是拥有许多优秀 的资源供制作者 使用,制作者只需将资源整合,并为自己玩法编写一些脚本,便能 制作属于自己的游戏,其便捷性是其他游戏开发引擎所不能比拟的。 2.1. 2 物理引擎 物理引擎就是模拟现实中真实的物理碰撞, 重力反应, 掉落等刚体行为的引擎, 举个例子,愤怒的小鸟就是基于物理引擎制作 的,小鸟被射出后掉落,撞击,都是 物理引擎的应用, Unity3D 使用的物理引擎为 Nvidia 的 PhysX ,物理引擎是一 个计 算机程序模拟牛顿力学模型,利用质量,速度,摩擦力和空气阻力等变量,来预测 不同情况下的效果,被大量运用在计算机物理学,电子游 戏,以及动画当中。 5 2.1.3 Unity常用生命周期的函数 Unity3D 中的生命周期函数需要继承 Mono Behavi or 类才可以使用, 且其生命周 期函数全部都由系统定义好,系统自动调用,调用顺序和自行编写的顺序无关。 Unity3D 中有一些 最常用的一些生命周期函数 ,这份官方文档详细了讲解了这些函数 [2] 的用法 。 2.1.4 用户界面 UI 本游戏的系统 UI 主要利用 Unity3D 自带 UI 插件 UGUI 进行制作, 从 Unity3D4.6 版本之后,UGU I 被集成到 Uni ty 的编辑器中,相较于旧的 UI 系统,它有了质的飞 跃,其中主要优点在于灵活,快速,以及可视化,可视化的UI 制作能够让制作者 更 加直观地看到成果,也使得制作效率更高,执行效果更好,以及更加简单上手,所 有的布局,控件,调整后都能直接体现出结果,使得制作者 能更容易地制作出更加 好看的 UI 界面 2.2模型与动画 本游戏的模型以及动画的素材来自网络上的素材资源,再经过 Unity3D 的动画 系统进行调整,整合,最终达到游戏中呈现的效果。游戏中亦包含剧情动画,则运 用 Unity3D 的 TimeLine 插件 进行编辑,以及脚本进行控制所制作出来。 2.3 C#开发语言 Unity3D 中脚本文件使用的编程语言是 C# 语言 ,面向对象类 型安全,来源自 C 语言系列,C 、C++ 、Java 和 JavaScript 程序员很快就可以上手使用。 C# 能够很好地在 Mac 、Linux 、Android 、Windows 还有 IOS 上运行;它之所以 是很多人的最佳选择, 是因为 C# 是编 程语言创新方面的领导者, 是原生跨平台移动 应用程序的最佳选择,并且还有很多的优点超乎的想象。 2.4 Visual Studio 2017 Visual Studio 是美国微软公司的开发工具包系列产品, VS 是一个基本完整的开 发工具集,它包括了整个软件 生命周期中所需要的大部分工具,如 UML 工具、代 码管控工具、 集成开发环境 (IDE )等等。 所写的目标代码适用于微软支持的 所有平台。 6 第三章 游戏设计 3.1 游戏场景设计与制作 整个游戏的场景包括开始游戏选择场景,剧情场景,游戏场景,三个场景,其 中场景均是运用网络素材进行搭建,游戏选择场景搭配人物动画以及选单,显得更 加动态化,剧情场景则结合 Timeline 动画进行设 计,游戏场景为一个地牢大场景, 其中又包括几个不同的小场景,小场景结合关卡流程进行设计。 3.1.1 游戏场景制作 首先将下载的场 景素材进行解包,基于素材进行场景大概构思,这里需要先完 成游戏中地牢大场景的大概制作,然后进行细化,然后开始游戏选择场景和剧情则
可以选择大场景中的一个小场景进行部分进行独立分化更改,加入人物以及动画。 图 3-1 为则第一个小场景的搭建雏形 . 图 3-1 场景搭建雏形 将场景搭建完整,加入光源,物件,地牢大场景的俯瞰图如图 3-2 所示: 图 3-2 地牢场景俯瞰图 7 3.2 游戏 主角设计与功能实现 游戏中玩家控制的主角为一名骑士,在这里需要实现玩家的行走操控,动画控 制器设计,攻击设计,技能设计,以及设置主 角的跟随摄像机。 3.2.1 人物模型设置 首先将从网上下载下来的人物模型进行解包,放入场景内,并将其 Animation Typ e 设置成 Humanoid 。如图 3-3 和图 3-4 所示 图 3-3 角色模型展示图 图 3-4 角色 Animation Type 类型图 接下来将剑和盾导入场景,放在模型相应的部位下面,必须放在主角 prefa b 下 相应的子关节下,不然后面设置 动画时会出现武器不跟手的情况,如图 3-5 所示: 8 图 3-5 角色绑定装备展示图 最后一个步骤就是给角色加上一些必要的组件, 这里需要 Rigibody,Capsule Collider ,以及 Animator ,AudioSource ,如图 3-6 所示: 图 3-6 角色必备组件图 9 3.2.2 角色的基本设计与实现 这小节需要编写脚本让玩家能够操控角色进行移动,首先,需要 规划好人物的 动作控制器,新建一个新的动画控制器,绑定到主角身上,预期主角需要三层动作, 第一层是默认状态的动画控制,第二层则是玩 家攻击的动画控制,第三层是玩家防 御时的动画控制,因此做好规划后,建立三个层级,如图 3-7 所示: 图 3-7 角色动画层图 接 下来进入基本层,添加一个 Base Layer ,将走动的三个动画拖进去,并且设 定其不同的权重,再回到基本层,将死亡动画以及滚动 动画拖进这里,这里的触发 条件都设置为 Trigger 类型, 由于死亡是单向性的所以不用有回去的连线, 还有一个 重要的点就是为 了动画的流畅性,必须消勾连接线的“Has Exit Time ”选项,设置 完毕的动画基本层如图 3-8 所示: 图 3-8 角色 基本动画层设计图 然后创建脚本 PlayerMovement ,利用脚本控制动画播放以及控制人物的移动, 关 键脚本如下: 1. float lh = Input.GetAxis("Horizontal" ); 2. float lv = Input.GetA xis("Vertical" ); 3. 4. Vector3 output = Vector3.zero; 5. 6. outp ut.x = lh Mathf.Sqrt(1 - (lv lv) / 2.0f); 7. output.z = lv Mathf.Sqrt(1 - (lh lh) / 2.0f); 8. 9. moveInput = new Vector3(o utput.x, 0, output.z); 10. 10 11. Vector3 cameraForward = mainCam era.transform.forward; 12. cameraForward.y = 0; 13. 14. Quaternio n cameraRelativeRotation = Quaternion.FromToRotation(Vector3.forw ard, c ameraForward); 15. Vector3 lookToward = cameraRelativeRota tion moveInput; 16. 17. if (moveInput.sqrMagnitude > 0) 18. { 1 9. Ray lookRay = new Ray(transform.position, lookToward); 20. tra nsform.LookAt(lookRay.GetPoint(1)); 21. } 22. moveVelocity = tran sform.forward playerSpeed moveInput.sqrMagnitude; 这里原本写完脚本之后, 发现移动的时候加入往斜向方向移动时,速度会比上 下左右移动要快些,这是因为控制上下左右是基于直角坐标轴,在斜向速度就会出 现根号二 倍速度的平方和的情况,这里有一篇论文提供了这种问题的解决方法,给 [13] 出了一个公式,将直角坐标轴转换成圆形的坐标轴 ,利用这 个公式,可以解决这 个问题了。 大部分的参数都设置成 Public , 这样便于在 Unity 的面板里进行设置以及 控制,就是做 了可视化的处理,将脚本绑定到角色身上后,可以看到如图 3-9 的面 板,给玩家设置运动速度,便可以通过键盘上的 W,A,S,D 控 制角色移动。空格键进 行翻滚。 图 3-9 角色基本设置图 在这里需要注意的一点是,由于进入翻滚动画转换条件设置的是 Trigge r 类型, 假如玩家按键的速度快过动画播放速度,就会造成信号累积,按键结束后还有动画 播放,因此需要用脚本在玩家按下一次后清理一次 信号,编写一下脚本并绑定在 BlendTree 上。进行设置,如图 3-10 所示: 11 图3-10 动画控制器信号清理设置图
在进行基本设计的最后一步,需要摄像机能对玩家的运动进行追踪,将目标始 终对准角色,因此需要编写一个摄像机控制脚本: 1. publ ic class RPGcamera : MonoBehaviour 2. { 3. public float cameraHei ght; 4. public float cameraDisctance; 5. 6. private Transform Pla yerTran; 7. 8. 9. void Start() 10. { 11. this .PlayerTran = GameO bject.FindGameObjectWithTag( "Player" ).transform ; 12. } 13. 14. void Update() 15. { 16. this .transform.position = new Vector3(t his .PlayerTran.position.x, th is .PlayerTran.position.y + this . cameraHeight, this .PlayerTran.position.z - this .camer aDisctanc e); 17. this .transform.LookAt(this .PlayerTran); 18. 19. 20. } 2 1. } 将脚本绑定到摄像机之后,设定角度,测试无误,角色的普通状态基本操作就 实现。 3.2.3 角色的攻击设计与实现 在进入角 色的攻击动画层次以及脚本编写之前,需要完成角色一些状态参数的 设计,比如玩家的血量,经验值等。需要在玩家状态脚本里面创建一些参数, 后期 这些参数会在 UI 设计的时候进行同步, 也就是更加直观的表现给玩家, 以下是需要 的一些基本参数,血量,经验值,攻击力,技 能攻击力,等级,攻击范围,这些参 数在后面进行与敌人发生战斗的数值交换中会用到,现在先配置给玩家,将脚本绑 定在角色身上,进行参数 设置。 12 1. public Slider playerExp; 2. public Slider playerHP; 3. public int playerHealth; 4. float exp = 0; 5. int playerLevel = 1 ; 6. public int damage; 7. public int spDamge; 8. public float ra nge; 第二步就是进行玩家的攻击动画层的设计,在这里采用了两端普通攻击一段特 殊技能攻击的设计,触发条件同样选择 Trigger 类型,攻击同理,为了动画效果的 流畅,需消勾“Has Exit Time”选项,攻击动画层设置后如图 3-11 所示: 图3-1 1 角色攻击层动画设计 接下来则是控制攻击脚本的编写,以下为攻击与特殊攻击初步实现的关键代码: 1. public bool at tack; 2. public bool spAttack; 3. private bool lastAttack; 4. flo at timer; 5. 6. 7. 8. bool newAttack = Input.GetMouseButtonDown(0 ); 9. if(newAttack != lastAttack && newAttack == true && !isDefen d) 10. { 11. attack = true; 12. anim.SetTrigger("attack"); 13. }
14. else 15. { 16. attack = false; 13 17. } 18. if (Input.GetMous eButtonDown(1) && timer == 5) 19. { 20. spAttack = true ; 21. ani m.SetTrigger( "spAttack" ); 22. timer = 0; 23. } 24. else 25. { 2 6. spAttack = false ; 27. } 接下来需要通过脚本控制 Animator 切换不同的动画层, 来实现普通层 和攻击层 之间的切换,首先需要在攻击层的 Idle 动画和 slash 动画增加一个脚本,这个脚本 的主要作用是用来向挂载有 An imator 组件的角色的兄弟组件传信息,脚本的关键代 码如下: 1. public string [] onEnterMessa ges; 2. override public void OnStateEnter(Animator animator, Anim atorStateInfo stateInfo , int layerIndex) { 3. 4. foreach (var ms g in onEnterMessages) 5. { 6. animator.gameObject.SendMessageUpwa rds(msg); 7. } 8. } 9. } 也就是起到一个传递信息的作用,需要先在动画上设置,在攻击脚本中便能接 收这个信息 ,在玩家按下攻击按键时,动画层能接收到信息,然后改变动画层的权 重,如图 3-12 所示: 3-12 图 攻击层信号设置图 在两个 不同状态,一开始接收到 AttackIdle 的信号,攻击层的权重为 0,当按下 攻击键,开始攻击,攻击层的权重就变成 1,这样就 实现了普通层到攻击层的转换, 关键代码: 14 1. void OnAttackIdle() 2. { 3. pm.inputEn able = true ; 4. anim.SetLayerWeight(1, 0); 5. } 6. void OnAttack () 7. { 8. pm.inputEnable = false ; 9. anim.SetLayerWeight(1, 1); 10. } 然后,与普通层翻滚状态的信号累积一样,必须定时清除攻击状态的信号,如 图 3-13 图 3-13 攻击状态信号清楚设 置图 测试发现,按下攻击键与技能键都可以正常触发角色动画,最后需要给角色的 技能加入一个冷却时间以及技能特效,由于技能的伤害太大, 需要限制玩家使用, 否则游戏将变得没有难度。只需要在角色脚本写一个计时器,设置好冷却时间来限 制技能的使用条件就可以了,技能特效只 需要在释放技能动画的结尾添加一个帧事 件,并在脚本中当帧事件发生时,编写一个生成特效的方法让特效生成就可以了, 技能效果如图 3- 14 所示,关键代码如下所示: 1. float timer; 2. timer += Time.deltaTime; 3. if (timer>= 5) 4. { 5. timer = 5; 6. } 7. if (In put.GetMouseButtonDown(1) && timer == 5) 8. { 9. sp Attack = true; 10. anim.SetTrigger("spAttack"); 11. timer = 0; 12. } 15 技能特效生成代码: 1. public Transform sp; 2 . 3. void SpAttack() 4. { 5. GameObject instance = (Gam eObject)Instantiate(effect, sp.transform.posit ion, sp.transform. rotation); 6. Destroy(instance,4); 7. } 图 3-14 角色技能效果 图 3.2.4 角色的防御设计与实现 角色拥有防御的动作,由于防御只需要用到角色上半身,所以在防御层中给套 上一个只有上半身的 A vatar Mask ,如图 3-15 所示: 16 图 3-15 角色 Avatar Mask 示例图 接下来设计出角色的防御层 动画,与攻击层一样,给其加上对角色传递信息控 制动画层级的脚本以及定时清理防御信号的脚本,触发条件选择 bool 类型,整个防 御 层动画设计完成后如图 3-16 所示: 图 3-16 角色防御层动画设计图 触发防御的关键代码: 1. void Defende( ) 2. { 3. if (Input.GetKey(KeyCode.E)) 4. { 5. anim.SetBool( "isD efend" , true ); 6. isDefend = true ; 7. 8. } 9. else 10. { 11. a nim.SetBool( "isDefend" , false ); 12. isDefend = false ; 13. } 1 4. } 17 3.3 怪物(敌人)设计与实现 游戏中存在两种怪物,一种是普通怪物,存在于地牢的许多地方,玩家在穿过 地牢的时候会 不断遇到, 另一种怪物是游戏的 Boss ,属于游戏中的强力怪物, 难度较 大,会出现在游戏中的最后时刻,在这里将分开设计。 首先 将普通怪物的 Prefab 拉入场景当中,对其进行一些简单的设置,需要给其 加上 Animator ,Audio Source , 以及 Capsule Collider 三个组件。然后需要给怪物新 建一个新的动画控制器,由于怪物没有主角拥有那么多复杂的动作,所 以动画控制 器中只需要有一层便足够了,这一层动画包括怪物的移动,攻击以及死亡,动画层 设计如图 3-17 所示: 图 3-17 普 通怪物动画设计 其中由于死亡是单向性, 因此不用设置回去的连线, 死亡的触发类型是 Trigger , 移动则是使用 Float 类型判断,攻击使用与主角一样的 Bool 类型触发。 接下来开始给普通怪物新建控制脚本,在最开始,与玩家角色一样,需要给他 设置几 个基本属性,包括生命值,攻击力,怪物的比较简单,这些属性将会在后面 的战斗设计中起到作用,如下所示: 1. public int enemyHealth; 2. public int damage; 然后就需要让怪物能够执行上面的动画,发现玩家,追逐玩家,攻击 玩家,不 过需要注意的一点是,现在只是先让怪物动起来,任何攻击动作包括玩家的攻击还 没有涉及到数值的交换。首先这里需要 Unity 3D 的一个官方组件,Nav Mesh Agent [7] 组件,该组件是用来实现自动寻路功能的,文献 中详细对该插件进行了介绍以 及 该如利用它制作自动寻路功能,在这里可以借用该组件,让怪物对的主角导航,实 现追逐玩家的功能。首先需要将地图上的地面刷成可导航区 域,点击 Unity 窗口上 的 Window →AI →Navigation , 出现功能窗口, 需要设置以下自动寻路区域的 s tatic , 允许怪物自动寻路的高度,上台阶的高度,以及半径等,如图 3-18 所示: 18 图 3-18 Navigation 设置图 紧接着需要将地牢场景的 static 设置成 Navigation static ,按下 Navigation 面板的
bake , 然后场景将变成怪物的可寻路区域, 然后回到怪物身上, 需要给他加一个 Nav 组件,并设置寻路的速度,停止距离等参数 ,如图 3-19 所示: 图 3-19 怪物 Nav Mesh Agent 设置图 完成这一步后,最后需要给怪物新建一个脚本,用来 调用 navmesh 组件以及给 予怪物目标,完成动画的播放,关键代码如下: 1. if (CanSeeTarget() && V ector3.Distance(transform.position,player.position ) < 15) 2. { 3 . nav.SetDestination(player.transform.position); 19 4. patrolling = false ; 5. if (nav.remainingDistance < nav.stoppingDistance) 6 . { 7. anim.SetBool( "isAttack" , true ); 8. } 9. else 10. { 11. anim.SetBool( "isAttack" , false ); 12. } 13. } 14. else 15. { 16 . anim.SetBool( "isAttack" , false ); 17. if (!patrolling) 18. {
19. nav.SetDestination(lastKnowPosition); 20. if (nav.remainingDi stance < nav.stoppingDistance) 21. { 22. patrolling = true ; 23. StartCoroutine( "GoToNextPoint" ); 24. } 25. } 26. } 27. anim.Set Float( "forward" , nav.velocity.sqrMagnitude); 这里给敌人设置了一个眼睛的对象, 需 要在 Unity 里新建一个空对象拖进 Prefab 里眼睛的位置,敌人通过射线检测自身与目标的位置而进行判断要不要进行追踪, 到 达一定距离后,就会按照动画控制的设置攻击玩家,假如不在范围之内,敌人则 会在设置的两个点进行巡逻,将目标对象设置成 public, 在怪物 Prefab 下能够见到, 只需要将主角的 Prefab 拖进去,这样的主角就成为了目标,怪物也能够识别到目标 了,最后将 普通敌人的 prefab 复制多个,分组放在场景不同区域,到这里,普通怪 物的设置就完成了。 接下来就是 Boss 怪物的设置,这 里 Boss 与普通怪物使用同一个脚本,也就是 AI 基本是一致的,只需要做出模型差异,大小差异,数值差异以及动画差异,首先 将 Boss 的 Prefab 拖进场景最终区域, 对其进行与普通怪物一致的设置, 并对其设置 一套类似的动画控制器,需注意的一点就是 Boss 的基本数值比普通怪物高出不少, 确保游戏难度以及体验, 设置完毕后发现 Boss 也能够对玩家进行追踪以及做出攻击 动 画,整个怪物以及 Boss 的设置就完成了。 20 3.4 战斗设计与实现 在前面的章节中,玩家角色以及敌人的基本设置已经完成,在 这一章节,将主 要进行具体玩法设置,也就是战斗内容的设计,本游戏的战斗采用经典 ARPG 的战 斗方式,通过键盘控制玩家角色移动, 鼠标则作为攻击键,选中敌人进行攻击。敌 人则发现玩家,追踪玩家,到达攻击距离进行攻击。 3.4.1 战斗伤害实现 首先需要在角色控 制脚本申明一个 GameObject 对象,称其为 opponent ,这个对 象实际上就是的敌人,需要在敌人的脚本写一个 OnM ouseOver 的方法, 当鼠标指向 敌人的时候,敌人将会把自己作为 opponent 传给角色脚本,具体代码如下所示: 1. void OnMouseOver() 2. { 3. player.GetComponent().opp onent = gameObject; 4. } 然后再角色控制脚本中,在控制攻击的脚本那里,需要补上判断 opponent 物件 是否为空,也就是是否选中敌人,如果选中,则将角色方向朝向敌人,这样攻击的 方向也就正确了,如下所示: 1. if (pm.att ack) 2. { 3. anim.SetTrigger("attack"); 4. if (opponent != null) 5. { 6. transform.LookAt(opponent.transform.position); 7. 8. } 9. } 10. if (pm.spAttack) 11. { 12. if (opponent != null) 13. { 14. 15. transform.LookAt(opponent.transform.position); 16. } 17. } 然后需要编写游戏的攻击距离,先申明一个距离 range ,设置为 public 类型,方 21 便再游戏中进行调整,然后编写一个 bool 函数,判断是否在攻击距离内,判断的依 据是玩家与敌人的位置坐标距离小 于等于 range ,则返回 true ,否则返回 false 。 最后是攻击时,攻击数值的交换,首先需要在敌人控制脚本里编写一个 受击方 法,为了方便角色脚本调用,这个方法要申明成 public,且需要传入一个 int 类型的 伤害值,这个方法的作用就是让敌人 受击,生命值会等于当前生命值减去伤害值。 回到角色脚本,编写一个攻击的方法,当目标不为空时且在攻击距离内,调用敌人 的受击方法,且 传入角色的伤害值,技能伤害的做法一样,只是传的值改为技能伤 害值,关键脚本示例如下: 1. bool InRangeAttack( ) 2. { 3. if (Vector3.Distance(opponent.transform.position, trans form.position) <= ra nge) 4. { 5. return true; 6. } 7. el se 8. { 9. return false; 10. } 11. } 12. void IsAttack()
13. { 14. if (opponent != null && InRangeAttack()) 15. { 16. opponent.GetComponent().GetHit(damage); 17. 18. } 19. } 20. 敌人的攻击和角色的一样,只是反过来编写,需要注意的时,角色拥有防御的 机制,因此在编写敌人攻击方 法的时候需要判断玩家是否处于防御状态,当角色处 于防御状态,敌人伤害会降低。关键代码如下: 1. if (player.GetCo mponent().isDefend) 2. { 3. damag e = 1; 4. } 22 最后,在选中敌人的时候,需要一个高亮边框的效果,这里需要进入 AssetStore 下载 一个第三方插件——HighlightingSystem,这个插件的作用是能让鼠标选中物 体产生高亮边框效果,下载完毕后需要给敌人P refab添加一个Highlighter的脚本, 并设置边框颜色,给 Main Camera 添加一个 Highlighting Renderer 的脚本叫可以 实现边框效果了,如图 3-20所示: 图 3-20 选中敌人高亮效果图 3.4.2 战斗死亡实现
在前面的动画设置中,角色和敌人都设置了自身的死亡动画,现在,只需要角 色或者怪物的生命值减少到 0 的时候,判断角色死亡,让角色与 敌人正常死亡。需 要注意的一点是,当怪物死亡的时候,必须在规定时间内消除 Prefab。关键代码如 下: 角色脚本: 1. boo l IsDeath() 2. { 3. if(playerHealth == 0) 4. { 5. return true; 6. } 7. else 8. { 9. return false; 10. }
11. } 12. void Dead() 13. { 14. anim.SetTrigger("is Death"); 15. pm.inputEnable = false; 16. pm.a ttack = false; 经过测试,当角色和敌人的生命值为 0时,能够正常执行死亡流程。 23 3.4.3 战斗交互实现 在战 斗中,角色可以拾取分布在场景中的血瓶,在角色的生命值快要消耗完的 时候,玩家可以通过按下 Q 键使用药瓶恢复生命值。 首先,需要先 制作血瓶,在场景中创建一个 Capsule ,将其改成红色,并且加上 Capsule collider 组件,将 Is Trigg er 属性打勾,同时将 Prefab 的设置成 potion ,这样 就能让角色使用碰撞检测拾取药瓶。 回到角色脚本,先申明一个 int 类型的药瓶数量,用于表示角色拾取的数量, 还 有就是申明一个 bool 类型的参数,用于判断药瓶可交互的状态,最后编写一个 具体 的恢复生命值的方法,以及 On Trigger Enter 碰撞检测方法,关键代码如下: 1. void Heal() 2. { 3. 4. if (interactable == true) 5. { 6. poti on += 1; 7. interactable = false; 8. } 9. if (pot ion>0) 10. { 11. if (Input.GetKeyDown(KeyCode.Q)) 12. { 13. playerHP.value += 20; 14. pl ayerHealth += 20; 15. potion -= 1; 16. }
17. } 18. if (playerHealth>100) 19. { 20. p layerHealth = 100; 21. } 22. } 23. 24. void OnTriggerEnte r(Collider other) 25. { 26. if (other.gameObject.tag == "potion ") 27. { 28. interactable = true; 29. D estroy(other.gameObject); 30. } 24 31. } 32. void OnTrigg erExit(Collider other) 33. { 34. if (other.gameObject.tag == "p otion") 35. { 36. interactable = false; 37. } 38. } 经过测试,发现角色碰撞到药瓶 prefab 时药瓶数量 +1 ,按下 Q 键能正常恢复生 命值,最后将 pr efab 复制多个,放在场景中的不同地方,药瓶的设置就完成了。 3.4.4 角色升级实现 在前面进行角色设置的时候,角色拥有经验值 这一参数,在这里就需要用到这 一参数,经验值随着玩家击杀的敌人数量增长,当经验值每积满一次,角色就会升 级,此时角色的攻击力会上升 ,生命值也会恢复,然后经验值又重新归零,等待下 一次升级。关键代码如下: 1. public void LevelUp() 2. { 3. if (opponent != null) 4. { 5. if (opponent.GetCompon ent().enemyHealth == 0 ) 6. { 7. exp = exp + 0.15f; 8. if (exp >= 100) 9. { 10. exp = 0; 11. playerLevel += 1; 12. playerHealth = 100; 13. damage += 10; 14. playerHP.value = playerHealth; 15. G ameObject instance = (GameObject)Instantiate(lvUp, fx.transform.
position, fx.transform.rotation); 16. Destroy(insta nce, 0.5f); 17. } 18. } 19. } 经过测试,发现玩家在经验值达到 1 00 时能正常升级,这一步就完成了 25 3.5 游戏音效管理 游戏中存在背景音乐以及动作音效,本节将会把音乐元素加入游戏当中,首 先 需要在场 main camera 中加入一个 Audio source 组件,将游戏背景音乐拉进去,并设 置成循环播放,如图 3-21 所示: 图 3-21 游戏背景音乐设置图 为了方便游戏中角色和敌人的声音的管理,需分别创建一个角色以及敌人用的 声音管理 脚本,这些声音包括移动的脚步声,攻击音效等,然后将脚本挂载再角色 身上,将相应的声音文件加进去。 为了让声音准确的在某些时刻发出, 就需要用到动画的帧事件,举个例子,在 添加角色走路声前,需要到角色走路动画下面,选中角色的脚接触到地面的两个时 间点, 加入帧事件 , 再到声音管理脚本中用方法实现事件, 调用走路的声音。 图 3-22 为帧事件设置示例图。 26 图 3-22 帧事件设置示例图 调用帧事件代码示例: 1. public AudioClip footStep; 2. 3. void Start() 4. { 5. playerAudio = GetComponent(); 6. 7. }
8. void FootStep() 9. { 10. this.playerAudio.clip = this.footSt ep; 11. playerAudio.Play(); 12. } 将游戏中角色以及敌人需要的音效都按照以上方法配 置,保存,进行测试,发 现角色在进行移动,攻击,释放技能,翻滚,死亡时都能播放正确的音效。敌人的 所有动作也能播放正确音效,到这里 ,游戏的音效效果就实现了。 第四章 游戏界面与视觉效果 4.1 角色属性以及图标显示 游戏中的一些关键属性, 需要通过 UI 的形 式在游戏中展现出来, 方便玩家更直 观地了解角色的状态,以及在游戏中可以进行的一些操作。本节将会设计玩家在游 戏中一些属性界面,按 键提示,以及游戏中的图标。 在游戏中玩家的生命值,经验值,目前都是没有直观的表现,因此首先需要为 角色制作血条,经验条。在场景中新 建一个 Canvas ,游戏中的 UI 物件都应该放在这 里面。首先创建一个 Slider ,将其底下的滑块物件隐藏,将其 Fil l Area 设置成红色, 并将 Slider 的参数调整至如图 4-1 所示: 27 图 4-1 血条 slider 属性设置图 然后将该 Slider 进行复制,将其 Fill Area 改成蓝色,设置锚点,将两个 Slider 并排放置在 Canvas 的左上角。接下来需要将其与角色的相关属性进行关联, 来到角 色脚本, 申明两个 Slider , 在 Star 方法里, 将血条 Slider 的值等于角色的初始生命值, 经验条 Slider 的值等于 0, 并在角色受击方法和升级方法里分别编写 Slider 随着属性 值的变化而变化。经验值 slider 的设置与血条一致,只需要写入升级的方法就可以, 关键代码如下: 1. publi c Slider playerExp; 2. public Slider playerHP; 3. 4. void Start() 5. { 6. playerHP.value = playerHP.maxValue = playerHealt h; 7. playerExp.value = playerExp.minValue = exp; 8. anim = GetComponent(); 9. pm = GetComponent rMovemont>(); 10. } 11. public void PlayerGetHit( int damage)
12. { 13. playerHealth -= damage; 28 14. playerHP.v alue = playerHealth; 15. if (playerHealth <= 0) 16. { 17. playerHealth = 0; 18. } 19. } 最后需要给角色加入头像以及等级显示, 在角色脚本中申明一个 Text 组件,用 来显示角色等级,当用 Tostring 方法将角色等级等于 Text 显示的内容,将其放 在血 条的上方,再在 Canvas 下创建一个 Image 组件,将其背景图设置为角色的头像图, 全部设置完毕后,角色的属性状态显 示如图 4-2 所示: 图 4-2 角色属性状态显示图 接下来需要给游戏中的 Boss 添加一个血条, 由于 Boss 在关卡的最 后才会出现, 因此他的血条一开始必须是隐藏的,运用与给角色添加血条的方法,给Boss 制作一 个类似的血条,置于游戏窗口下面,并一 开始将他隐藏,接着在接近Boss 的地方放 置一个 Cube ,并将其 Mesh Renderer 隐藏,添加刚体,并设置为 Tr igger ,在脚本中 加入碰撞检测,当玩家接触碰撞体,则显示 Boss 的血条, 如图 4-3 所示: 图 4-3 Boss 血 条图 游戏中还存在药瓶以及技能的图标,首先在 Canvas 下创建两个 Image 组件,分 别将代表技能以及药瓶的图片放入,并将 其放在游戏场景中的左下方。 其中药瓶图标下需要能够显示目前所拥有的药瓶数量以及按键提示,因此,创 建两个个 Text 组件,将其放 在图标下,一个用于按键提示,一个用于与脚本中的药 瓶数量相关联,关键代码如下: 1. public Text potionQuan tity; 2. 29 3. potionQuantity.text = potion.ToString(); 技能图标同样需要一 个按键提示,且需要在技能冷却时做变灰的处理,这个只 需要在技能图标上面蒙一层灰色透明的图片,并在脚本中编写代码让其技能冷却时 启用 就可以了。关键代码如下: 1. public GameObject skillIm; 2. float timer; 3. boo l isSkill1; 4. void Update() 5. { 6. timer += Time.deltaT ime; 7. if (timer >= 5) 8. { 9. timer = 5; 10. isSkill1 = true; 11. skillIm.SetActive( false); 12. } 13. else { 14. skillIm.SetActive( true); 1 5. } 16. if (Input.GetMouseButton(1) && timer == 5) 17. { 18. timer = 0; 19. } 完成后经过测试,发现两个图标都能正常的显示其功 能,效果如图 4-4 所示: 图 4-4 游戏中图标效果图 30 4.2 游戏菜单功能实现 4.2.1 开始场景界面与功能实现 玩 家打开游戏首先见到的是开始游戏的场景,以及其界面菜单,这里包含游戏 的名称,选择开始游戏以及退出游戏。 首先新建一个场景, 将地牢 场景中的最后区域复制进去, 当成开始场景的背景, 接着将游戏主角也放进场景中,让其循环播放 Idle 动画,营造动态效果。然后开始 制作菜单界面,首先创建一个 Canvas ,在其下面创建一个空 Prefab , 命名为主菜单, 再创建一个 Text , 两个 Button ,分别是游戏名称,一个开始按钮,一个退出按钮。分 别将字体调至满意的效果。将主菜单放置在场景的右边,调整摄像头的位 置,使得 场景呈现如图 4-5 所示: 图 4-5 游戏开始场景预览图 点击开始游戏后到游戏场景的过程中,包含一个 Loading 的过程,要实现这个 效果,首先需要一张 Loading 用的背景图,然后创建一个 Slider , 对其进行类似血条 的处理,只 不过要将其初始值设置为 0 ,将其与图片放在一起,并隐藏。接下来脚 本在点击开始游戏后启用。 接着创建一个用于按钮点击事件的菜单控 制脚本,绑定在主菜单 Prefab 中,在 脚本中写下对应不同点击事件的方法,包括开始游戏,结束游戏, Loading 进入游戏
以及游戏中会用到的重启游戏,暂停游戏,继续游戏。同时,关键代码如下: 1. public GameObject loading;
2. public Slider lo; 3. public void PlayGame( int sceneIndex) 31
4. { 5. StartCoroutine(LoadAsynchronously(sceneIndex)); 6 . Time.timeScale = 1; 7. } 8. public void Quit() 9. { 1 0. Application.Quit(); 11. } 12. IEnumerator LoadAsynch ronously( int sceneIndex) 13. { 14. AsyncOperation operat ion = SceneManager.LoadSceneAsync(sceneIndex); 15. loading. SetActive( true); 16. while (!operation.isDone) 17. { 18. f loat progress = Mathf.Clamp01(operation.progress / .9f); 19. lo.value = progress; 20. yield return null; 21. } 22. } 23. public void ReStar() 24. { 25. SceneMan ager.LoadScene(2); 26. Time.timeScale = 1; 27. } 28. publ ic void Stop() 29. { 30. Time.timeScale = 0; 31. } 32. public void Conttinue() 33. { 34. Time.timeScale = 1; 35. } 最后就是对按钮的点击事件进行设置, 以及将开始场景以及游戏场景放入 Build Setting 中设置好顺序,如图 4- 6 所示和图 4-7 所示: 图 4-6 按钮点击事件设置示例图 32 图 4-7 Scenes 顺序设置图 保存以后, 打开开始 场景, 点击开始按钮, 正常进入 Loading 状态后进入游戏场 景中,这一部分就完成了 4.2.2 游戏中界面与功能实现 在游 戏中除了战斗功能部分,还需要实现菜单以及交互,在死亡或者游戏通过 时弹出对应的菜单以及选项。 首先在 Canvas 下新建两个 P anel ,分别命名为 Win 以及 Lose ,代表通关以及失 败弹出菜单。 在两个菜单下, 分别创建一个 Text 提示以及两 个 Button , 分别代表重新 开始游戏和返回开始菜单。 Lose 菜单下则调整其字体效果,以及运用上一小节编写 的菜单脚本, 给两个按钮添加点击事件。需要注意的是,点击返回开始菜单并执行 的过程中仍然需要一个载入的效果,这里直接把开始场景的载入 Prefa b 复制过来并 设计点击事件就可以了。最后将两个菜单隐藏,为了让其能够在游戏完成或者游戏 失败时准确弹出,需要运用动画的帧事件, 分别在 Boss 死亡动画以及角色死亡动画 添加动画的帧事件,然后编辑脚本,帧事件发生时分别调用不同菜单,并暂停时间, 关键代码分 别如下: 1. public void Win() 2. { 3. winMenu.SetActive( true); 4. Time.timeScale = 0; 5. } 1. void DeadMenu() 2. { 3. deadMenu.SetActive( true); 4. Time.timeScale = 0; 5 . } 完成后,胜利菜单以及失败菜单如图 4-8 和图 4-9 所示: 33 图 4-8 游戏胜利菜单 图 4-9 游戏死亡 菜单 同时,在游戏中,也可以通过菜单键暂停游戏,打开菜单,进行返回开始菜单, 重新开始游戏等操作。首先在 Canvas 下创建一个 Button 作为打开暂停菜单的接口, 通过添加点击事件弹出菜单。仿照通关菜单以及死亡菜单做一个暂停菜单,菜单里 包含一个按键帮 助的 Tips 。完成后如图 4-10 所示: 34 图 4-10 游戏暂停菜单 经过测试所有菜单功能都能正常运行,这一部分功能就 完成了。 4.3 游戏中的视觉效果 为了让游戏的整体视觉效果看起来更好,需要给游戏添加一些游戏特效以及后 处理效果,比如抗锯齿,环 境光遮蔽,景深效果等。这里需要借助一个 Unity3D 的 官方插件——Post Processing 。先去 Unity3D 的 Asset Store 下载并导入这个插件,然 后给 Camera 加入一个 Post Processing Behavior 的组件,且新建一个 Behavior 组件, 并调整效果强度, 如图 4-11 所示, 并拖入 Camera 的 Post Pro cessing Behavior 中, 游 戏的视觉效果便能获得较大提升。 35 图 4-11 Post Processing B ehavior 游戏特效设置图 然后需要给场景加上一些光源,新建一些点光源,将其放置在场景中的不同位 置,设置强度,模拟场景中蜡烛 的光影投射,这样整个场景看起来就变得十分真实, 视觉效果这一部分设置完成。 第五章 游戏剧情制作 在游戏中有剧情动画的存在,交代游 戏的背景,玩家将在进入游戏后看到剧情 动画,在 Unity 中,动画的制作涉及的东西很多,在本游戏中,制作的剧情动画比 较浅显易懂 ,属于长镜头动画。 首先需要创建一个新的场景,选取游戏场景中的一部分区域,复制到剧情场景 中,作为动画背景。接着将主角以及NPC 的模型放入场景中,在动画中将交代主角 接受一个委托,进入地牢里面救人的剧情。 剧情动画的制作需要用到 Unity3D 的 Time Line 插件进行, 首先需要先设计一下 36 大概的动画走向,并下载相关的动作动画,然后打开 Unity3D 的 TimeLin e 窗口,并 在角色身上新建一个 TimeLine 文件。 首先需要让角色走到 NPC 的跟前, 在 TimeLine 下添加一条 Animation Track ,并将角色拖进去,然后将动画拖进去,设置动画长度 以及位移,如图 5-1 所示: 图 5-1 角 色 Animation Track 设置示例图 接下来将结合 NPC 的动作以及剧情走向, 将接下来所需的动作都设置完成,拖 动 TimeLine 的进度滑块,能看到角色以及 NPC 的动作符合剧情的走向。接着需要 加上不同角度的摄像头,且需要在剧情播放的时候 能够流畅地进行切换,首先需要 给 TimeLine 添加一条 Cinema chine Track , 将 Main Camera 拖进去, 接着创建 5 个不 同的 Virtual Camera 用于剧情中不同视角的使用, 设置好每个 Virtual Cam era 的位置, 并设置其对准或者跟随的目标, 将其拖进 TimeLine 中与剧情中相应的时间节点对应, 如图 5-2 和图 5 -3 所示: 图 5-2 Cinema chine Track 设置图 37 图5-3 Virtual Camera 设置示例图
这里基本的动画剧情走向就完成了,接下来就需要给剧情动画加入对话字幕, 由于剧情是安排好的,因此对话也只是在设计好的地方出现,因此只 要编写一个脚 本,利用碰撞检测,判断角色到达某个地点就使用那个对话,以及利用计时器控制 多段对话就可以了,关键代码示例如下: 1. public GameObject[] text; 2. int textTime; 3. float timer; 4. 5. void Update() 6. { 7. if (textTime == 1) 8. { 9. text[0].SetActive( true); 10. Destroy(text[0], 2 ); 11. } 12. Conversation(); 13. } 14. void Conv ersation() 15. { 16. if (textTime==2) 17. { 38 18. timer += UnityEngine.Time.deltaTime; 19. if (timer < 4) 20 . { 21. text[1].SetActive( true); 22. Destroy(text[1], 4); 23. } 24. else if ( timer>4 && timer<8) 25. { 26. text[2].S etActive( true); 27. Destroy(text[2], 4); 28. } 29. } 30. 只需创建几个碰撞体放在相应的区域, 然后创建几个 Text 文件, 写入对话内容, 拖入角色就可以了,如图 5-4 所示: 图 5-4 剧情文本设置图 最后就是将剧情场景加入游戏中,这里需要将场景拉入 Build Setting 中,将其 顺序设置为 2,更改一下前面的场景顺序,从开始菜单点击开始游戏后将会进入到 游戏的剧情中,播放剧情后将自动进入游戏,剧情示例如图 5-5 所示: 39 图 5-5 剧情动画示例图 当然这里为了方便玩家,也加入了一个按钮可以选择跳过,按钮的点击事件、 背景音乐以及剧情进入游戏的 Loading 界面都与前面的设置相同, 这里不再进行详细 描述,到这里,整个游戏的开发就完成了。 第六章 游戏测试以及打包 游戏开发完成后需进行多次测试,这里打开游戏开始场景,从开始测试,经过 测试,所有场景切换正常,且游戏中玩家控制,战斗体验,游戏功能都能正常运行, 游戏也能够流畅运行,基本符合一开始的设计预期, UI 菜单等都能够正常显示,音 频,动画也能正常播放,因此通过多次测试之后,游戏可以开始打包。 在工具栏选择 File->Build Setting ,在左下角的导出模式中可选择导出平台,选 择好导出模式之后,点击 Build 就可以实现打包发布了,此时会在选定文件夹中生 成一个 exe 可执行文件,一个 Data 数据文件夹。如图 6-1 所示: 40 图 6-1 游戏打包示例图 图 6-2 打包后文件图 41 总结 随着这个游戏的制作完成,也意味着毕业设计进入了尾声,两年的游戏设计的 学习让我收获很多,通过这次的游戏制作也让我对动作冒险类游戏的认识更加的深 刻。 在这次毕业设计进行的过程中,我同时在进行着与游戏相关的实习工作,正巧, 实习工作的内容也与此次毕业设计的选题有着不少的关系,我从中分析了许多关键 的要素,包括动作冒险游戏的重要组成,以及有关战斗设计的关键,动作冒险游戏 如何与剧情进行结合等。设计之初也想过许多大胆的想法,但是因为时间以及成本 的关系不能全部实现。 总体来说,这一次的游戏制作对于是十分具有实验性的,首先,传统的动作冒 险类游戏,其核心都偏向于追求爽快,难度一般不会太大,这次的毕业设计则是结 合了现在市面上一些难度较大的游戏玩法,诸如《黑暗之魂》系列中更为缓慢的动 作以及闪避等要素,令人感到意外的是,这种结合反而令这类游戏有了新的体验, 这是具有突破性的。 Unity3D 作为一款游戏开发引擎,在制作游戏的过程中一次又一次的让我感觉 到他的便捷以及强大。其各种服务于现代游戏开发的工具以及插件可以让开发者节 省很多时间。Unity3D 引擎的日渐成熟将能为游戏行业带来更多更好的游戏,而我 本人也将继续深入学习,以开发出更好的国产游戏作为目标,继续前行。 参考文献 [1] 解构 Unity的腳本物件模型 Milo Yip 2010-02-26 00:11 [2] Unity.Unity3D参考手册.Unity,2010:94-121 [3] 郗锐- 浅谈电子游戏运营模式与机制设计[J]. 电脑知识与技术,2017,(03)20-221 [4] 何敏- 从游戏之外到游戏之中[D].湖南师范大学,2014. [5] 郭睿静,张帅-基于 Unity3D游戏动作的控制和设计 [6] 陈健松 ,徐从富 ,潘云鹤 . 基于地形的三维场景绘制方法 [J]. 计算机工程与应用, 2006,(08):31-33 [7] 刘方周-基于 Unity3D的第三人称游戏设计与实现,2016 [8] 李兵川-基于 Unity3D引擎角色扮演类游戏设计及开发。2018 [9] 丘熹-角色扮演类游戏中非玩家角色人工智能的实现方式 CNKI:CDMD:2.1017.856686 [10] 于潇翔,彭月橙,黄心渊-基于 Unity 3D 的道具系统研究与开发 2014 42 [11] 王树斌 -浅析 Unity3D 开发游戏流程及常用技术 2012 [12] 谢韬 - 基于 Unity3D 粒子系统的游戏特效实现 《现代计算机》 , 2015 (16) :30-32 [13] Chamberlain Fong-Analytical Methods for Squaring the Disc Seoul ICM 2014 [14] Jackson, Simon - Mastering Unity 2D game development become an expert in Unity3D''s new 2D system, and then join in the adventure to build a full RPG game framework 2014 43 |
|