📢博客主页:肩匣与橘
📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
📢本文由肩匣与橘编写,首发于CSDN🙉
📢生活依旧是美好而又温柔的,你也是✨
基于Unity3D引擎的冒险游戏的设计与实现
📢前言
摘要
Abstract
1 绪论
1.1 选题背景
1.2 研究目的及意义
2 开发工具及环境
2.1 开发工具
2.1.1 C#简介
2.1.2 Unity引擎简介
2.1.3 Game Framework简介
2.1.4 Microsoft Visual Studio简介
3 系统开发分析
3.1 需求分析
3.2 可行性分析
3.2.1 技术可行性
3.2.2 经济可行性
3.2.3 法律可行性
3.2.4 操作可行性
3.2.5 时间可行性
3.2.6 社会可行性
4 总体功能设计
4.1 程序功能模块设计
4.2 程序流程设计
5 详细设计与实现
5.1 场景模型的搭建
5.2 系统功能的设计与实现
5.2.1 灯光模块的设计与实现
5.2.2 音乐模块的设计与实现
5.2.3 扫描机模块的设计与实现
5.2.4 主角模块的设计与实现
5.2.5 摄像机模块的设计与实现
5.2.6 激光门模块的设计与实现
5.2.7 自动门模块的设计与实现
5.2.8 电闸模块的设计与实现
5.2.9 钥匙模块的设计与实现
5.2.10 电梯门模块的设计与实现
5.2.11 电梯模块的设计与实现
5.2.12 机器人模块的设计与实现
5.3 场景雾气的效果优化
5.4 系统的打包
6 数值策划
6.1 数值策划的目的
6.2 数值策划的方法
6.3 数值详细设计
6.3.1 主角模块数值
6.3.2 机器人模块数值
6.3.3 电梯模块数值
6.3.4 摄像机模块数值
6.3.5 激光门模块数值
6.3.6 虚拟轴模块数值
7 功能测试
7.1 测试目的
7.2 测试方法
7.3 测试用例
7.3.1 角色移动模块测试
7.3.2 电闸模块测试
7.3.3 机器人模块测试
7.3.4 摄像机模块测试
7.3.5 电梯模块测试
7.3.6 激光门模块测试
7.3.7 自动门模块测试
7.3.8 扫描机模块测试
7.3.9 灯光模块测试
7.3.10 音乐模块测试
7.3.11 场景雾效测试
7.3.12 系统导包测试
7.3.13 角色喊叫功能测试
7.3.14 角色静步测试
8 总结
致谢
附录
📢写在最后
📢前言
在学生时代的最后一个阶段,毕业论文是每位大学生必须要完成的一项重要任务。然而很多本科毕业论文小白可能拿到论文题目后就手足无措了……不要急,接下来就给大家分享我大学时期的毕业论文。我将展示是如何从选题、可行性分析、设计和实现等方面去书写的这篇论文。在这篇毕业论文中,介绍我所采用的游戏设计原则、技术和工具,并详细描述了游戏的各种模块的实现方式。通过这篇论文,我希望能够为步入大四的同学们提供一些有价值的思路和建议,帮助你们顺利完成自己的毕业论文,同时也能够为游戏开发爱好者提供一些参考和启示。
摘要
伴随着计算机网络和硬件技术的快速发展,电子游戏逐步从2D转变为大型的3D大作。而研发游戏的必备工具就是所谓的游戏引擎。而不同的游戏引擎都有各自的优缺点,其中Unity引擎凭借它的灵活性使开发人员能够为超过20个平台进行创作和优化内容。
本系统使用Unity引擎进行游戏的开发,实现人物移动、道具拾取、AI人物的巡逻导航和攻击、激光门响应、音效灯光响应、摄像头扫描等功能;制作过程中使用了多个常见的Unity组件,包括但不局限于灯光、声音、触发器、碰撞器、脚本组件。整个游戏开发过程中所用到的编程语言是C#,全程使用了面向对象的编程思想来编写脚本。游戏界面清晰明了,可视化程度高且具有很好的交互性。
关键词:Unity3D;游戏开发;C#
Abstract
With the rapid development of computer networks and hardware technology, video games have gradually transformed from 2D to large-scale 3D masterpieces. The necessary tool for developing games is the so-called game engine. While each game engine has its strengths and weaknesses, Unity's flexibility allows developers to create and optimize content for over 20 platforms.
The system uses the Unity engine for game development, to achieve character movement, props pick up, AI character patrol navigation and attack, laser door response, sound and light response, camera scanning, and other functions; Several common Unity components were used, including, but not limited to, lights, sounds, triggers, colliders, and scripting components. The programming language used in the whole game development process is C#, and the whole process uses object-oriented programming ideas to write scripts. The game interface is clear, highly visible, and interactive.
Key Words:Unity3D; Game development; C#
1 绪论
1.1 选题背景
近年来随着我国游戏产业链持续升级,包括电子竞技、游戏直播等新业态为游戏产业的发展提供新的增长点。现在是一个很好的时代,作为独立游戏开发者,可以选择各种开源的游戏框架来搭建自己的游戏引擎,也可以选择自己喜欢的游戏引擎来开发游戏。这里重点所说的是设计中所用到的Unity引擎。目前全球排名前1000的游戏中超过70%的游戏是用Unity开发的。在我国的增速也是特别迅速地,像2010年的爆款游戏《原神》、2021年网易公司的《永劫无间》及腾讯公司的《英雄联盟手游》都是用Unity引擎开发的。
目前Unity支持包括IOS、Android、PC、Switch、PS4、PS5和包括所有VR、AR的20多个平台,跟所有的硬件都是保持同步更新的。因为Unity跨平台强大的兼容性使得开发者可以做到一次性开发多平台部署。截止2020年底,Made With Unity应用每月的下载量达到50亿次,全球月Unity用户达150万,Unity创建和运营业务所触达的全球平均月活玩家数量达28亿人次。如今Unity引擎不仅仅运用在游戏行业,甚至应用在汽车、运输、制造、建筑、工程、施工、影视动画领域和教育领域。
随着Unity3d引擎的不断更新,Unity渐渐地不仅仅是一个游戏创作工具,更是一个实时3D的交互式内容创作和运营平台,提供了开发到运营的一站式服务去赋能开发者去构建一个完整的元宇宙生态。使得Unity最有可能成为未来虚拟世界的底座平台。
在人们日益提高的娱乐需求之下,使用一款应用成熟且功能强大的引擎开发一款游戏是尤为重要的,并且可以符合快节奏生活之下高压力人群的减压需求。
1.2 研究目的及意义
近年来,5G网络与云计算等技术的进步与革新成为推动游戏产业发展的重要因素。同时,我国游戏产业链持续升级,包括电子竞技、游戏直播等新业态为游戏产业的发展提供新的增长点。自主研发能力是决定一款游戏品质的核心因素,直接决定产品的可玩性、平衡性和稳定性,而可玩性、平衡性和稳定性又是决定游戏产品是否成功的重要因素。并且游戏中的角色技能的设计、游戏道具的开发等一系列游戏数值的策划对游戏的可玩性和平衡性也有重大影响,因此在此情况下,使用游戏引擎从无到有地制作一款功能比较全面的游戏并记录过程,可以使得大众对游戏开发的过程加以了解。并通过人们对游戏开发的了解来激发对游戏开发探索的兴趣,在开发的过程中萌发出更多游戏设计创新的点子,制作出更多新颖有趣的娱乐游戏,不仅丰富了人们的娱乐生活,而且对促进中国游戏产业的发展具有重要的现实意义。
2 开发工具及环境
2.1 开发工具
系统所用的编程语言为C#,所用到的开发工具为Unity 2019.4.29f1c2 (64-bit),以及Visual Studio 2019,框架使用的是Game Framework。
2.1.1 C#简介
C#是由微软公司发布的。C#是一个现代的、通用的、面向对象的编程语言,由 Ecma和ISO核准认可的。由Anders Hejlsberg和他的团队在.Net框架开发期间开发。C#是专为公共语言基础结构(CLI)设计的。CLI由可执行代码和运行时环境组成,允许在不同的计算机平台和体系结构上使用各种高级语言。虽然C#的构想十分接近于传统高级语言C和C++,是一门面向对象的编程语言,但是它与Java非常相似,有许多强大的编程功能,因此得到广大程序员的青睐。C#的主要功能也是很多的,例如:布尔条件(Boolean Conditions)、自动垃圾回收(Automatic Garbage Collection)、标准库(Standard Library)、组件版本(Assembly Versioning)、属性(Properties)和事件(Events)、委托(Delegates)和事件管理(Events Management)、易于使用的泛型(Generics)等等。
2.1.2 Unity引擎简介
Unity3D是集游戏开发、交互开发、虚拟现实、增强现实等交互开发的一款软件。近年以来,Unity中国本地化研发速度迅速,不断地推出了新的功能,例如Multiplay,Vivox(跨端通讯方案)等。
目前Unity支持包括IOS、Android、PC、Switch、PS4、PS5和包括所有VR、AR的20多个平台,跟所有的硬件都是保持同步更新的。因为Unity跨平台强大的兼容性使得开发者可以做到一次性开发多平台部署。
如今Unity引擎不仅仅运用在游戏行业,甚至应用于ATM领域应用(制造、汽车、运输)、AEC领域应用(建筑、工程、施工)、影视动画领域和教育领域。
随着Unity3d引擎的不断更新,Unity渐渐地不仅仅是一个游戏创作工具,更是一个实时3D的交互式内容创作和运营平台,提供了开发到运营的一站式服务去赋能开发者去构建一个完整的元宇宙生态。使得Unity最有可能成为未来虚拟世界的底座平台。
2.1.3 Game Framework简介
Game Framework是一款以 Unity引擎为基础的游戏架构,很大程度地规范开发过程、加快开发速度并保证产品质量。它可以极大地加快游戏开发速度,快速地实现各种功能集。有助于在游戏制作过程中把更多的部分放在gameplay之上,不必在创建菜单或设置等其它基础知识上花费过多精力。
完整的 Game Framework 包含三部分:GameFramework 、UnityGame Framework. Runti me 以及UnityGameFramework.Editor 。
2.1.4 Microsoft Visual Studio简介
Microsoft Visual Studio(VS)是一款非常强大的程序员使用的IDE工具。并且在最新发布的2022版本中首次成为了64位的IDE工具。Visual Studio可以开发适用在Android、iOS、Mac、Windows、Web 和云的应用,Visual Studio具有可以快速地编写代码、轻松调试和诊断、根据开发者的喜好扩展和自定义、高效协作等特点。在Visual Studio中所编写出的目标代码可以适用在微软所支持的所有平台。
3 系统开发分析
3.1 需求分析
我试图从以下几个方面来分析这款游戏的需求:
首先,玩家游戏发布在什么平台来提供给玩家游玩,这是尤为重要的一点。因为玩游戏的设备是多种多样的,不同的设备可以玩不同的游戏,带给玩家的体验感也是不同的。例如游戏设备包含PC、Switch、PS4及手机等。PC是依靠着鼠标和键盘来操作游戏,Switch和PS4是依靠着手柄来操作游戏,手机则是操作屏幕进行游戏。
其次,玩家分布的年龄段,不同的年龄,他们会玩不同的游戏。游戏的类型是各式各样的,例如RPG(Role Playing Game)角色扮演游戏、ARPG(Action RPG)动作角色扮演类游戏、SRPG(Simulation RPG)模拟角色扮演类游戏、FPS(First Person Shooting)第一人称射击游戏、RTS(Real Time Strategy)即时战略游戏、AVG(Advanture Game)冒险类游戏、EDU(education)养成类游戏、FLY(Fly Game)飞行模拟类游戏、TAB(Table Game)桌面类游戏、SPG(Sport Game)体育类游戏、FTG(Fighting Game)格斗类游戏。通过调查发现0-9岁的玩家中,受喜爱的游戏类型为动作类和益智类。在10-14岁的玩家中,受喜爱的游戏类型为动作类、角色扮演类以及沙盒类。在15-18岁的玩家中,受喜爱的游戏类型为动作类和即时战略类。19-24岁的玩家中,受喜爱的游戏类型为动作类、角色扮演类、即时战略类。25-30 岁的玩家中,受喜爱的游戏类型为动作类、益智类、即时战略类。31-59岁的玩家中,受喜爱的游戏类型为棋牌类、角色扮演类。59岁以上的玩家中,仅对棋牌类和益智类较为喜爱。通过调查,角色扮演类和动作类游戏所涉及的年龄段范围比其他类型的游戏更广。
再者就是玩游戏的时长,在快节奏的生活下,很多的玩家更喜欢交互性强且时长恰当的游戏。通过对部分游戏进行了单次游戏时长的调查:王者荣耀:15-30分钟;英雄联盟:20-30分钟;炉石传说:5-20分钟;原神:20-40分钟的日常任务;通过调查,可以看出,较短的单机时间在市场中具有更大的优势。
所以,如何控制游戏的持续时间,并确保其互动性,是这款游戏在设计过程中需要注意的的另一项重要内容。
对以上的分析进行设计,制作一款名字叫做为《Stealth》的3D的冒险游戏,这是一款内容操作简单、特别容易上手、友好程度高的3D冒险游戏。我对这个游戏的定义为青少年和上班族放松心情和娱乐消遣。
根据分析把需求大致分为以下几点:作为冒险游戏的首要目标就是对游戏主角的控制,然后就是设置对应的障碍,例如:移动门(靠近时会打开),通关钥匙,最重要的就是添加AI机器人,机器人可以巡逻,发现主角会追踪并攻击。
3.2 可行性分析
可行性分析又称可行性分析。可行性分析的目的在于从技术、经济、社会环境等多个层面来分析该方法的可行性,以及在最短的时间内,以最少的成本和资金来解决问题。
3.2.1 技术可行性
制作整个系统所用到的主要是Unity引擎,编程语言为C#。在开发过程中,主要的技术主要是通过C#编程来进行功能的实现,在Unity引擎中进行相关的操作,首先是对各类所需组件的添加,例如:Audio Source(声音)组件、Rigidbody(刚体)组件、Animator(动画)组件等等;然后就是对各个组件的设置,例如声音组件中的音量、2D和3D的切换等等;还有就是动画树,材质球的设置等。其中运用到的大多专业知识在Unity引擎发展多年的今天达到了很成熟的水平。而其所用到的知识都是在学校课堂或者网上搜索可以学到的,对于相关专业学生来说是可以实现的。因此在技术上完全是可行的。
3.2.2 经济可行性
整个游戏系统全程在Unity引擎中进行场景和游戏对象的设置,整个设计所需要的脚本则在Visual Studio中进行制作,制作系统所需的两个软件可以通过相对应的官方网站进行免费下载和使用。运行游戏所使用的设备性能需求也比较低,日常使用的设备都可以用来运行系统。本着开源共享的理念,游戏也不存在任何付费功能,因此使用者可以任意的游玩和修改。因此在经济上是可行的。
3.2.3 法律可行性
本作品用于免费使用,包含的材质模型、视频、音频都有注明来历,且不用于商业游戏或应用。系统不会涉及到隐私信息和权限获取,整个游戏的设计都是符合法律的规定,因此在法律上是可行的。
3.2.4 操作可行性
本着娱乐休闲的目的开发的这款游戏,因此在使用上是特别容易上手的,操作也特别简单,新手不用几分钟时间就能学会,且游戏内不包含恐怖和色情等内容,适合各个年龄的玩家进行操作。因此在操作上是可行的。
3.2.5 时间可行性
制作此系统将通过可行性分析、功能设计、详细设计和系统测试的步骤逐一实现,将合理控制整个制作的规模和时间安排,保证在一定的时间内达到预定的要求,因此在时间上是可行的。
3.2.6 社会可行性
此系统完全符合道德标准,未出现社会负能量的内容。该系统的开发符合了政府的相关法规和行业的相关要求。本着开源和免费的理念,其他环境的变化并不会影响该系统的开发。
4 总体功能设计
4.1 程序功能模块设计
本游戏的功能模块包含灯光模块、主角模块、AI机器人模块、电闸模块、激光门模块、音乐模块模块、电梯门模块、电梯模块、扫描机模块、摄像机模块、自动门模块。主要为操作模块,主要负责用户的操作,包含角色的移动、呼喊及道具拾取。
该游戏的功能总体模块设计图如图4-1所示。
图4-1功能模块图
在整个系统中,主要围绕主角进行设计,场景中的模块也有着各自的功能。
灯光模块:切换场景中的氛围灯和触发警报的灯
主角模块:主要的作用就是获取主角的按键然后进行移动和钥匙的获取,主角包含着角色背包和血量。
AI机器人模块:在地图中进行巡逻导航、追捕、射击。
电闸模块:获取玩家按键开启,可以关闭对应的激光门。
激光门模块:玩家触碰会触发警报。
音乐模块:切换场景中的背景音乐和触发警报的音乐。
电梯门模块:首先是判断玩家是否获取钥匙,当玩家背包中包含钥匙靠近电梯门(触碰触发器),电梯门就会自动打开,玩家此时就可以进入电梯。
电梯模块:当电梯门打开后,玩家就可以进入电梯,随后电梯上升,游戏结束。
扫描机模块:扫描机自动旋转扫描判断玩家是否路过,触发后会进入警报模式。
摄像机模块:第三人称的摄像机跟随功能。
自动门模块:玩家靠近,自动门会自动打开。
4.2 程序流程设计
通过对该系统的需求详细的分析,用户通过操作主角行动进行游戏。操作流程图如图4-2所示。
图4-2系统操作流程图
通过流程图的设计对游戏的玩法进行了简单的设计,在游戏开始后操作玩家移动躲避AI机器人的巡逻和扫描机的扫描,如果触发二者就会被AI攻击致使死亡而重新开始游戏,在保证没有触发到二者,则寻找机会关闭电闸并进行钥匙的获取,获取到钥匙后进入电梯,便可以通关游戏获得最终的胜利。
5 详细设计与实现
5.1 场景模型的搭建
整体的场景模型、视频、音频使用了Unity官方提供的一套资源包。首先进行整体游戏的场景搭建,在搭建完成后为场景添加碰撞器,保证碰撞器可以包裹好场景中的各个物体。以此来保证人物,AI机器人等游戏对象可以在场景中运动而不产生大规模穿模等异常。游戏场景如图5-1所示。
图5-1游戏场景
在系统实现中会涉及到人物和机器人在场景中的移动,为此需要为场景添加网格组件,并为其添加场景资源中包含的专属网格。场景网格如图5-2所示。
图5-2场景网格
5.2 系统功能的设计与实现
5.2.1 灯光模块的设计与实现
在Hierarchy面板创建一个灯光对象(ection_alarmion_alarm)调整光照颜色为红色;修改光照强度intensity为0并添加脚本AlarmLight。编写脚本,通过控制光强的强弱,使得灯光的强弱在0-1的范围内调整,从而达到在玩家触发机关或者被机器人追踪时正常光和警报灯可以流畅的切换的效果。正常氛围灯如图5-3所示。危险氛围灯如图5-4所示。
图5-3正常氛围灯
图5-4危险氛围灯
5.2.2 音乐模块的设计与实现
在Hierarchy面板创建一个声音对象(gamecontroller)并添加脚本LastPlayerSighting,添加Audio Source(声音)组件,并附加子对象secondmusic同样添加Audio Source(声音)组件。编写脚本,通过检测警报和安全位置来平滑的开启和关闭灯光以及声音,来控制安全情况下的音乐灯光样子以及危险状态下的音乐灯光样子。背景音乐设置为2D,2D的作用是保证整个游戏场景的音量大小是一致的。背景音乐模块如图5-5所示。
图5-5音乐模块
5.2.3 扫描机模块的设计与实现
在Hierarchy面板找到扫描机对象(prop_cctcCams),向扫描机的最底层添加一个空物体(trigger),放在摄像机模型的最底层;添加一个Light,Rang=40,Type=SpotSpo tAngle=62,color=红色,光强为4, cookie=fxcameraView_alp; 添加一个MeshCollider,设置为触发器,并通过Animation来添加一段动画达到左右摆动的效果;添加AlarmTrigger脚本。编写脚本判断是否为玩家,通过触发器检测是否有玩家如果检测到玩家,触发警报从而进入危险情况。扫描机模块如图5-6所示。
图5-6扫描机模块
为使得扫描机能够流畅的左右摆动进行扫描,为其添加Animation,设置曲线摆动的最大幅度为90度。扫描机动画曲线如图5-7所示。
图5-7扫描机动画曲线
5.2.4 主角模块的设计与实现
在Hierarchy面板找到主角对象(prop_cctcCams),animator选择:PlayerAnimator Controller;添加刚体,使用重力,冻结由物理引擎产生的在xyz三个方向的旋转和y轴方向的偏移;为人物添加一个胶囊碰撞体,调整合适位置;添加AudioSource:Clip=player_footsteps,初始不播放,但是循环播放,2D声音;添加控制移动的脚本(PlayerMovement),玩家背包的和脚本(PlayerBag),玩家血量的脚本(PlayerHealth)。在Edit面板中的ProjectSetting中找到InputMananager,并对Horizontal和Vertical、Sneak、Shout进行设置,编写绑定的几个脚本,移动脚本使得玩家可以通过键盘按键控制角色移动和喊叫,背包脚本是为了判断是否进行了钥匙的获取,血量脚本则检测玩家血量状态,血量小于等于0时加载死亡动画[14]。主角模块如图5-8和图5-9所示。
图5-8主角动画详情
图5-9主角模块
5.2.5 摄像机模块的设计与实现
为了让摄像机能够平滑的跟随主角的移动,在Hierarchy面板找到主摄像机(camera _main),添加脚本CameraFollow,编写脚本控制跟随速度和偏移量使得玩家操作时,摄像机平滑的跟随主角移动。摄像机模块如图5-10所示。
图5-10摄像机模块
5.2.6 激光门模块的设计与实现
在Hierarchy面板找到激光门对象(fx_laserFence_lasers),添加脚本AlarmTrigger,添加触发器,当主角碰撞到激光门时门会触发警报。激光门模块如图5-11所示。
图5-11摄像机模块图
5.2.7 自动门模块的设计与实现
在Hierarchy面板找到自动门对象(door_generic_slide),添加脚本LittleDoorTrigger,添加声音组件使得开门时发出对应的开门声音,添加触发器检测角色靠近时门会自动开启,在此处为控制开关门动画的管理,使用Atimator融合树控制开关门,自动门的Animation动画如图5-12所示。自动门模块如图5-13所示。
图5-12自动门动画图
图5-13自动门模块图
5.2.8 电闸模块的设计与实现
在Hierarchy面板找到电闸对象(prop_switchUnit),为小电脑的 prop_switchUnit(父层)添加:BoxCollider碰撞器;AudioSource:Clip=switch dea ctivation默认不播放,不循环,初始声音最大,2D声音;添加Box的触发器,比碰撞器要大一点设置成触发器;添加脚本SwitchUnitController,编写脚本,一个电闸开关控制一个激光,玩家在电闸旁边按下z来关闭对应激光,对应的电闸可以关掉对应的激光门[15]。电闸模块如图5-14所示。
图5-14电闸模块图
5.2.9 钥匙模块的设计与实现
在Hierarchy面板找到钥匙对象(prop_keycard),animatior设置成"KeyAnimatorController”;添加一个灯光Light,渲染下:点光源PointRange=5, Color=蓝色,光强为3;添加一个球形的触发器y=1,r=1添加触发器组件,添加脚本PickUpKeyCard,玩家触发到之后销毁。添加声音,在玩家出发后发出声音。钥匙模块如图5-15所示。
图5-15钥匙模块图
5.2.10 电梯门模块的设计与实现
在Hierarchy面板找到电梯门对象(door_exit_outer),添加触发器组件,添加脚本BigRedDoorTrigger,检测玩家是否有钥匙,添加开门和屏蔽的声音,添加同自动门一样的Atimator融合树控制开关门。当玩家具备钥匙且靠近电梯门(进入电梯门的触发器范围内)电梯门打开,并同时发出开门声。电梯门模块如图5-16所示。
图5-16电梯门模块图
5.2.11 电梯模块的设计与实现
在Hierarchy面板找到电梯对象(prop_lift_exit),添加声音组件添加电梯上升的声音,添加脚本LiftRaise,编写脚本,检测玩家是否背包包含钥匙,如果玩家已经获取钥匙则进入后电梯上升。电梯模块如图5-17所示。
图5-17电梯模块图
5.2.12 机器人模块的设计与实现
在Hierarchy面板找到机器人对象(char_robotGuard),添加刚体组件,设为is Kinematic,不添加任何约束;添加胶囊体碰撞器;添加球形碰撞器.半径为10;添加导航控制器navmesh agent,默认设置即可;添加脚本EnemyPower并编写使得机器人可以通过视觉和听觉来检测玩家。添加脚本EnemyAnimation并编写使得机器人可以朝着目标位置移动。添加脚本EnemyAI并编写使得机器人根据规划路径巡逻导航路线,使用Atimator组件制作融合树来添加机器人的攻击,追踪及停止的行为。在机器人模型的右手位置添加手枪“prop_sciFiGun_low”;添加子物体Effects,营造效果;Effect上增加Light组件,setActive=false;Range=10;光强为2;默认添加脚本EnemyShooting并编写机器人的攻击动画。机器人模块如图5-18所示。
图5-18机器人模块
对脚本EnemyAI进行编写,编写中使用了四个公有类,即可以添加四个点进行挂载,当设置好四个点并挂在到脚本,脚本也挂载到机器人上之后,开始游戏就可以使得机器人根据规划路径巡逻导航路线导航路线如图5-19所示。
图5-19机器人导航路线
5.3 场景雾气的效果优化
在场景中添加雾气的效果可以使得游戏场景更加具有冒险氛围,在Windows下找到Rendering下的Lighting Setting。在OtherSetting中的color来进行设置,然后在主摄像机camera_main的Inspector找到Rendering Path 设置为Legacy Deferred。最终实现的效果如图5-20所示。
图5-20雾气效果图
5.4 系统的打包
为方便系统的使用,将通过打包的形式,将整个系统打包为一个exe文件。在File面板下找到Bulid Settings,首先进行工程的添加,接下来进行发布平台的选择(此系统为PC),最后进行Bulid,即可打包为可执行文件。打包流程及结果如图5-21和图5-22所示。
图5-21打包流程
图5-22打包结果
6 数值策划
6.1 数值策划的目的
数值策划虽不能确定游戏的好不好玩,但是一个游戏是不是不好玩并且玩家能够玩多深入就和数值有着特别大的关系。一款游戏的娱乐性来自于玩法也可以说是规则的确立,相对于规则的量化表现就是数值,严格意义来说能够反应设计思想的数值设置就是好的数值。数值可以说是一种工具,规范游戏数值不仅可以降低研发的成本,还可以降低运营的成本。有句话叫行百里半九十。数值的重要性就体现在最后的10上,毕竟游戏感受这种东西太过主观,如何用数字驱动起各类系统,达到预设目的,就是数值最大的作用。
6.2 数值策划的方法
数值的策划方法包含很多种,大多数数值都采用一些公式的套用计算。不同的游戏也会采用不同的公式来进行细微的计算以此来保证游戏的公平性,即游戏平衡性。为保证其平衡性,将在系统使用中逐步设置数值,并反复使用系统来不断调试更改。
6.3 数值详细设计
经过系统化的设计,将系统中所包含的所有模块带有的数值进行命名规范,并对其数值的大小进行归纳。
6.3.1 主角模块数值
为保证玩家可以拥有转身和血量等功能的使用,经过数值设计,主角模块各项数值如表6-1所示。
表6-1 主角模块数值
名称 | 脚本名称 | 数值 |
主角名称 | Char_ethan | |
转身速度 | turnSpeed | 5f |
主角血量 | playerHP | 500 |
背包钥匙获取 | HasKey | 空 |
主角移动速度 | 跟随动画 | |
初始位置 | 000 |
6.3.2 机器人模块数值
经过数值设计,机器人模块各项数值如表6-2所示。
表6-2 机器人模块数值
名称 | 脚本名称 | 数值 |
机器人名称 | char_robotGuard | |
追捕速度 | chasingSpeed | 5f |
巡逻速度 | patrolingSpeed | 2f |
巡逻点 | wayPoints | 4 |
等待间隔时间 | interval | |
死角度数 | deadZone | 20 |
视野范围最大角度 | fieldOfView | 110 |
能否看到玩家 | playerInSight | |
伤害 | playerHealth.TakeDamage | 50 |
6.3.3 电梯模块数值
经过数值设计,电梯模块各项数值如表6-3所示。
表6-3 电梯模块数值
名称 | 脚本名称 | 数值 |
电梯名称 | prop_lift_exit | |
等待上升的时间 | waitRaise | 1f |
电梯上升速度 | moveSpeed | 3f |
电梯声音播放时间 | clipPlayInterval | 3f |
游戏结束声音等待时间 | endGameClipWaitInterval | 5f |
游戏结束声音片段 | endGameClip |
6.3.4 摄像机模块数值
经过数值设计,摄像机模块各项数值如表6-4所示。
表6-4 摄像机模块数值
名称 | 脚本名称 | 数值 |
摄像机名称 | camera_main | |
移动速度 | moveSpeed | 3f |
旋转速度 | turnSpeed | 10 |
摄像机动态调节档位 | gears | 5 |
跟随的目标 | followTargetl | |
射线碰撞检测器 | hit |
6.3.5 激光门模块数值
经过数值设计,激光门模块各项数值如表6-5所示。
表6-5 主角模块数值
名称 | 脚本名称 | 数值 |
激光门名称 | fx_laserFence_lasers_005_twinkle | |
间隔时间 | interval | 2 |
6.3.6 虚拟轴模块数值
为保证玩家可以通过虚拟轴来进行前后左右移动及其他行为,经过数值设计,虚拟轴模块各项数值如表6-6所示。
表6-6 虚拟轴模块数值
名称 | 脚本名称 | 数值 |
前行 | Vertical | w |
后退 | Vertical | s |
左转 | Horizontal | a |
右转 | Horizontal | d |
喊叫 | Shout | x |
操作电闸 | Sneak | z |
潜行 | Shift | Shift |
7 功能测试
7.1 测试目的
因为整个开发过程较为复杂,功能也比较多,因此难免会出现一些问题,通过功能的测试可以检查系统各个功能模块的界面是否符合需求设计,如果存在问题便可以在游戏发布前解决问题,不仅可以保证游戏的稳定性还能保证用户在使用系统时的体验感。
7.2 测试方法
在游戏的各个功能初步完成后便开始进行游戏的运行,检测各个模块是否正常运行,保证游戏的体验满足需求分析中的要求,包括主角移动,机器人巡逻、追踪攻击,自动门的开关,警报灯和警报声音的触发等。
7.3 测试用例
7.3.1 角色移动模块测试
对角色模块的虚拟轴进行移动进行测试,保证使用系统时可以操作角色进行各种操作,具体的测试结果如表7-1、图7-1所示。
表7-1 角色移动测试
名称 | 操作 | 预期结果 | 实际结果 |
角色正常移动 | 键盘分别按下WASD | 前后左右进行移动 | 同预期 |
角色无法移动 | 键盘按下WASD以外的键 | 角色不移动 | 同预期 |
图7-1 角色移动测试
对角色模块的拾取功能进行测试,具体的测试结果如表表7-2、图7-2所示。
表7-2 角色拾取测试
名称 | 操作 | 预期结果 | 实际结果 |
角色正常拾取 | 角色进入钥匙触发器范围 | 拾取成功 | 同预期 |
角色无法拾取 | 角色未进入钥匙触发器范围 | 拾取失败 | 同预期 |
图7-2角色拾取测试
对角色模块的虚拟轴进行移动进行测试,具体的测试结果如表表7-3及图7-3所示。
表7-3 角色死亡测试
名称 | 操作 | 预期结果 | 实际结果 |
角色死亡 | 将角色血量调到0 | 角色死亡 | 同预期 |
角色生存 | 将角色血量调到0以上 | 角色生存 | 同预期 |
图7-3 角色死亡测试
7.3.2 电闸模块测试
为保证可以流畅的操作电闸来关闭激光门,使得玩家可以躲开机器人的追踪的同时还存在其他的路线可以行走,对电闸模块进行测试,具体的测试结果如表7-4和图7-4所示。
表7-4 电闸控制测试
名称 | 操作 | 预期结果 | 实际结果 |
电闸控制激光门关闭 | 靠近电闸按下z键 | 关闭对应的激光门 | 同预期 |
电闸未关闭激光门 | 未靠近电闸按下z键 | 没有关闭对应的激光门 | 同预期 |
图7-4 电闸控制测试
7.3.3 机器人模块测试
对机器人模块巡逻导航进行测试,具体的测试结果如表7-5和图7-5所示。
表7-5 机器人巡逻导航控制测试
名称 | 操作 | 预期结果 | 实际结果 |
机器人按照点waypoint的路径进行导航 | 游戏点击开始 | 机器人按照点waypoint的路径进行导航 | 同预期 |
机器人静止状态 | 游戏未开始 | 机器人静止状态 | 同预期 |
图7-5 机器人巡逻导航控制测试
对机器人模块追踪导航进行测试,具体的测试结果如表7-6和图7-6所示。
表7-6 机器人追踪导航控制测试
名称 | 操作 | 预期结果 | 实际结果 |
机器人追踪主角 | 角色触发警报 | 机器人追踪主角 | 同预期 |
机器人保持巡逻导航,未追踪主角 | 未触发警报,且主角未进入机器人视角范围内 | 机器人保持巡逻导航,未追踪主角 | 同预期 |
图7-6 机器人追踪导航控制测试
为保证机器人发现主角时可以产生攻击行为,对机器人模块攻击功能进行测试,具体的测试结果如表7-7和图7-7所示。
表7-7 机器人攻击测试
名称 | 操作 | 预期结果 | 实际结果 |
机器人攻击主角 | 主角被机器人追踪且进入机器人攻击范围 | 机器人攻击主角 | 同预期 |
机器人未攻击主角 | 主角未被机器人追踪且未进入机器人攻击范围 | 机器人未攻击主角 | 同预期 |
图7-7 机器人攻击测试
7.3.4 摄像机模块测试
对摄像机模块进行测试,具体的测试结果如表7-8和图7-8所示。
表7-8 摄像机测试
名称 | 操作 | 预期结果 | 实际结果 |
摄像机正常跟随 | 开始游戏,操作角色移动到墙角 | 摄像机正常跟随 | 同预期 |
摄像机跟随卡顿或者出现人物丢失 | 开始游戏,操作角色移动到墙角 | 摄像机正常跟随 | 同预期 |
图7-8 摄像机测试
7.3.5 电梯模块测试
为保证游戏的结束判断,需要在玩家进入电梯后,电梯可以产生上升行为,对电梯模块进行测试,具体的测试结果如表7-9和图7-9所示。
表7-9 电梯测试
名称 | 操作 | 预期结果 | 实际结果 |
电梯上升 | 主角进入电梯 | 电梯上升 | 同预期 |
电梯未运动 | 主角未进入电梯 | 电梯未运动 | 同预期 |
图7-9 电梯测试
7.3.6 激光门模块测试
为保证激光门接触到玩家时可以正常的触发警报,对激光门模块进行测试,具体的测试结果如表7-10和图7-10所示。
表7-10 激光门测试
名称 | 操作 | 预期结果 | 实际结果 |
触发危险警报 | 主角触碰激光门 | 触发危险警报 | 同预期 |
未触发危险警报 | 主角未触碰激光门 | 未触发危险警报 | 同预期 |
图7-10 激光门测试
7.3.7 自动门模块测试
对自动门模块进行测试,具体的测试结果如表7-11和图7-11所示。
表7-11 自动门测试
名称 | 操作 | 预期结果 | 实际结果 |
自动门打开 | 主角触发自动门的触发器 | 自动门打开 | 同预期 |
自动门未打开 | 主角未触发自动门的触发器 | 自动门未打开 | 同预期 |
图7-11 自动门测试
7.3.8 扫描机模块测试
对扫描机模块进行测试,具体的测试结果如表7-12和图7-12所示。
表7-12 扫描机测试
名称 | 操作 | 预期结果 | 实际结果 |
扫描机摆动扫描 | 开始游戏 | 扫描机摆动扫描 | 同预期 |
扫描机处于静止状态 | 未开始游戏 | 扫描机处于静止状态 | 同预期 |
图7-12 扫描机测试
7.3.9 灯光模块测试
为提高游戏体验,要保证场景的灯光可以平滑切换,对灯光模块进行测试,具体的测试结果如表7-13和图7-13所示。
表7-13 场景灯光测试
名称 | 操作 | 预期结果 | 实际结果 |
正常氛围灯和危险灯光平滑切换 | 主角从安全状况到触发危险障碍 | 正常氛围灯和危险灯光平滑切换 | 同预期 |
正常氛围灯和危险灯光无法平滑切换 | 主角从安全状况到触发危险障碍 | 正常氛围灯和危险灯光平滑切换 | 同预期 |
图7-13 场景灯光测试
7.3.10 音乐模块测试
对音乐模块进行测试,具体的测试结果如表7-14和图7-14所示。
表7-14 场景音乐测试
名称 | 操作 | 预期结果 | 实际结果 |
正常氛围音乐和危险音乐平滑切换 | 主角从安全状况到触发危险障碍 | 正常氛围音乐和危险音乐平滑切换 | 同预期 |
正常氛围音乐和危险音乐无法平滑切换 | 主角从安全状况到触发危险障碍 | 正常氛围音乐和危险音乐平滑切换 | 同预期 |
图7-14 音乐测试
7.3.11 场景雾效测试
在制作过程中添加了场景的雾效,为了保证雾效的完整显示,在此对场景雾效进行测试,具体的测试结果如表7-15和图7-15所示。
表7-15 场景雾效测试
名称 | 操作 | 预期结果 | 实际结果 |
场景雾效可以完整实现 | 添加完雾效后观察场景 | 场景雾效可以完整实现 | 同预期 |
场景中未产生雾效 | 未添加完雾效后观察场景 | 场景中未产生雾效 | 同预期 |
图7-15 场景雾效测试
7.3.12 系统导包测试
系统最后在PC端进行了导包,为保证最后的可执行文件可以和引擎中的效果保持一致,对系统的导包进行测试,具体的测试结果如表7-16和图7-16所示。
表7-16 系统导包测试
名称 | 操作 | 预期结果 | 实际结果 |
进行系统的导包并且运行成功 | 进行系统的导包并且运行 | 导包可正常运行 | 同预期 |
进行系统的导包但运行未成功 | 进行系统的导包并且运行 | 导包失败,运行失败 | 同预期 |
图7-16 系统导包测试
7.3.13 角色喊叫功能测试
对角色喊叫功能进行测试,具体的测试结果如表7-17和图7-17所示。
表7-17 角色喊叫测试
名称 | 操作 | 预期结果 | 实际结果 |
角色喊叫 | 游戏开始后按下z键 | 角色喊叫 | 同预期 |
角色未产生喊叫行为 | 游戏开始后未下z键 | 角色未产生喊叫行为 | 同预期 |
图7-17 角色喊叫测试
7.3.14 角色静步测试
对角色静步移动功能进行测试,具体的测试结果如表7-18和图7-18所示。
表7-18 角色喊叫测试
名称 | 操作 | 预期结果 | 实际结果 |
角色静步移动 | 角色移动过程中按住键盘的shift键 | 角色静步移动 | 同预期 |
角色未静步移动 | 角色移动过程中未按住键盘的shift键 | 角色未静步移动 | 同预期 |
图7-18 角色静步移动测试
8 总结
整个游戏系统全程在Unity引擎中进行场景和游戏对象的设置,整个设计所需要的脚本则在Visual Studio中进行制作,所用到的编程语言为C#。通过需求分析,总体设计和细节设计完成制作,最后进行系统测试完成。最终实现了一个控制角色移动躲避障碍,获取钥匙最终通关的一款冒险游戏。游戏界面简洁,上手简单且交互性强。整体的设计工作总结如下:
用多个方面进行软件需求分析来保证游戏的可玩性可娱乐性,然后就是进行游戏的框架设计和流程设计。
正式开发的第一步是整个游戏场景的搭建,来保证模型位置的合理性。然后逐步对每个模块进行脚本的编写和组件的添加设置。
在游戏各个模块完成后进行了游戏的测试,保证游戏的正常运行且满足最开始的系统需求。
经过以上的步骤,整个系统就完成了,期间虽遇到各种各样的问题,遇到了很多的失败,好在通过自己进行文档和网站资料查阅和反复尝试,困难都迎刃而解了,回想起虽充满艰辛却不乏创新和突破的乐趣。
最终实现的系统已将可以充分实现游戏场景中各个声音的及时响应、场景中灯光的变化、游戏角色的控制,角色的死亡、自动门的开关、通关道具的拾取、操作电闸来关闭激光门、AI机器人的自动巡逻、对人物的追踪和攻击。系统整体画面科技感强,游戏的可玩性高且入手简单,单局游戏时长适中。达到了预期的系统需求。
致谢
行文至此,落笔为终。也就意味着我的求学生涯也就到这里就结束了。始于20**的金秋,终于2022年的盛夏。逐梦*院,终要高别。目之所及,皆是回忆。虽有万般不舍但仍心存感激。在此感谢母校的培育与关怀。
感谢我的指导教师***,专业知识渊博,待人和蔼可亲,指导有方,让我由衷敬佩。特别是在论文写作过程中,遇到过各种各样的问题,王老师都有细心指导。王老师所倾注的心血难以计量。求学十余载,良师难得,定将一生铭记,一生感恩。
二十余载,少不了父母的默默付出,是他们让我得以遵从工自己的选择,不仅仅是经济上的支持,更多的是精神上的鼓励,是他们给了我前进的动力,在此感谢我的父母,祝他们身体健康。
感谢遇见***宿舍的舍友们,是你们给我的大学生活带来无数的温暖和欢乐,祝你们前程似锦,平安喜乐。
最后感谢自己,自己在大学明白了自己想要什么并一直努力着,想来毕业也是朝着U3d开发工程师的道路继续发展了,加油。
愿你我今后都能为着热爱之事引吭高歌!
附录
附录1:灯光模块程序代码
public class AlarmLight : MonoBehaviour {
public bool alarmOn = false;
/// <summary>
/// 过渡速度
/// </summary>
public float turnSpeed = 3;
//高光强
private float highIntencity = 3f;
//低光强
private float lowIntencity = 0f;
//目标光强
private float targetIntencity;
//灯光组件
private Light lt;
private void Awake()
{ lt = GetComponent<Light>(); }
private void Start()
{ //默认目标是高光强
targetIntencity = highIntencity; }
private void Update()
{ if(alarmOn)
{//过渡到目标光强
lt.intensity = Mathf.Lerp(lt.intensity, targetIntencity, Time.deltaTime * turnSpeed);
//当前已经到达了此时的目标光强,修改新的目标光强
if(Mathf.Abs(lt.intensity -
targetIntencity) < 0.05f)
{ //切换目标
if(targetIntencity == highIntencity)
{ targetIntencity = lowIntencity;
} else {
targetIntencity = highIntencity; } } }
else { //过渡到低光强
lt.intensity = Mathf.Lerp(lt.intensity,
lowIntencity, Time.deltaTime * turnSpeed);
//防止CPU冗余的计算
if(lt.intensity - lowIntencity < 0.05f){
lt.intensity = lowIntencity; } } }}
附录2:电梯门模块程序代码
public class BigRedDoorTrigger : MonoBehaviour {
public AudioClip doorOpenClip;
public AudioClip refuseOpenClip;
public Animator innerDoorAni;
public LiftRaise liftRaise;
private PlayerBag playerBag;
private Animator ani;
private void Awake()
{
playerBag = GameObject.FindWithTag(
TagsAndParamters.PLAYER).
GetComponent<PlayerBag>();
ani = GetComponent<Animator>();}
private void OnTriggerEnter(Collider other)
{ if(other.CompareTag(TagsAndParamters.
PLAYER))
{ if(playerBag.hasKey) {
//大红门打开 ani.SetBool(TagsAndParamters.
Paramter_DOOROPEN, true);
//栅栏门打开
innerDoorAni.SetBool(TagsAndParamters.
Paramter_DOOROPEN, true);
//开门声音
AudioSource.PlayClipAtPoint(
doorOpenClip, transform.position); }
else {//拒绝开门的声音
AudioSource.PlayClipAtPoint(
refuseOpenClip, transform.position); } } }
private void OnTriggerExit(Collider other) {
if(other.CompareTag(TagsAndParamters.PLAYER))
{ if(playerBag.hasKey) {
//关门
ani.SetBool(TagsAndParamters.
Paramter_DOOROPEN, false);
//栅栏门关闭
innerDoorAni.SetBool(TagsAndParamters.
Paramter_DOOROPEN, false);
//关门声音
AudioSource.PlayClipAtPoint(
doorOpenClip, transform.position);
//如果玩家已经走进了电梯内
if(PlayerInLift()) {//没收钥匙
playerBag.hasKey = false;
//触发计时,然后电梯上升
liftRaise.BeginRaise(); }} }}
/// <summary>
/// 判断玩家是否在电梯内
/// </summary>
/// <returns><c>true</c>, if in lift was playered, <c>false</c> otherwise.</returns>
private bool PlayerInLift() {
//大门指向玩家的方向向量
Vector3 dir = playerBag.transform.position - transform.position;
//叉乘运算
Vector3 normal = Vector3.Cross(transform.forward, dir);
//法向量朝上,说明玩家在电梯里面
if (normal.y > 0)
return true; else return false; }}
📢写在最后
作为一个即将毕业的大学生和游戏开发爱好者,你们面临着无尽的可能性和挑战。毕业论文只是你们职业生涯的一个开始,但它也是你们展示自己才华和能力的一次机会。
无论你们未来选择哪个领域,都需要勇气、创造力和不断学习的精神。在游戏开发领域特别如此,因为这是一个快速变化的行业,需要时刻关注最新技术和趋势。
同时,要记得保持对游戏开发的热情和兴趣。游戏开发是一项富有挑战性和创造性的工作,需要付出大量的时间和精力。但只要你们保持热情和兴趣,你们就能够享受到游戏开发带来的乐趣和成就感。
最后,祝愿所有即将毕业的大学生和游戏开发爱好者在未来的职业生涯中取得成功。无论你们选择何种道路,都要坚定信心,迎接挑战,不断前进。