版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
-·1前言1.1研究背景近年来,随着计算机技术和互联网的迅速发展,游戏产业蓬勃发展,成为全球范围内受众广泛的娱乐形式之一。尤其是FPS(第一人称射击)游戏,以其刺激的玩法、逼真的图形和音效效果,吸引了大量玩家的注意。同时,全球各地也面临着病毒传播和对抗的重大挑战。特别是在COVID-19大流行期间,人们对于病毒传播的认识和应对措施变得更加重要。了解病毒传播的方式、疫苗研发和疾病控制方法,对于公共卫生和全球安全具有重要意义。在这样的背景下,将游戏制作与病毒传播和对抗相关联,可以提供一个新颖而有趣的方式来增加公众对疾病传播和预防的认识和意识。通过游戏,人们可以亲身体验病毒威胁的情境,并通过游戏中的探索、对抗和解谜等方式学习如何应对疫情。此外,Unity作为一款广泛使用的游戏引擎,具有强大的功能和易于使用的工具,适合用于开发三维FPS游戏。它提供了可视化编辑器、丰富的资源库以及先进的渲染技术,可以帮助开发者快速搭建游戏场景、创建角色和实现动画效果。因此,基于Unity的三维FPS游戏《病毒危机》的设计与制作具有重要意义。通过这个课题的研究,可以提供一个创新的方式来推广疾病传播与预防的知识,同时也为游戏开发者提供有关三维FPS游戏制作的参考和指导,推动游戏技术的发展。1.2国内外研究现状1.2.1国外研究现状在国外,有一些相关研究已经涉及到了基于Unity的三维FPS游戏和病毒传播与对抗的主题。以下是一些国外的研究现状的例子:美国密苏里大学的研究:该大学的研究人员利用虚拟现实技术和Unity引擎,开发了一款名为"InfluenzaGame"的游戏。该游戏通过模拟流感病毒传播的过程,帮助玩家了解病毒的传播机制,并学习控制传染病的方法。荷兰瓦赫宁根大学的研究:该大学的研究人员使用Unity引擎,开发了一款名为"SeriousGameInfectionPrevention"的游戏。该游戏通过模拟病毒传播和感染控制的场景,帮助玩家学习预防感染的知识和技能。英国伦敦帝国理工学院的研究:该学院的研究人员开发了一款名为"PreventtheSpread"的虚拟现实游戏。该游戏通过模拟病毒传播和社交距离的重要性,帮助玩家了解疫情控制的重要性。1.2.2国内研究现状在国内,关于基于Unity的三维FPS游戏和病毒传播与对抗的研究相对较少,尚未发现针对病毒危机特定游戏的研究。然而,有一些相关研究关注类似主题的相关领域,例如病毒传播模拟、公共卫生教育和游戏化教学等。以下是一些国内研究的例子:中国科学院计算技术研究所的研究:研究人员使用Unity引擎,开发了一款名为"病毒传播模拟器"的游戏。该游戏通过模拟病毒传播的过程,让玩家亲身体验病毒传播的危害,并学习如何采取措施来控制疫情。北京航空航天大学的研究:研究人员开展了一项名为"虚拟现实技术在传染病防控中的应用研究"的项目。该项目利用虚拟现实技术和Unity引擎,开发了一款基于病毒传播的虚拟仿真系统,用于培训和教育医护人员在传染病防控方面的应对能力。上海交通大学的研究:研究人员运用游戏化教学的方法,利用Unity引擎开发了一款名为"疫情防控小游戏"的教育游戏。该游戏通过模拟疫情传播场景,让玩家学习疫情防控知识、培养危机应对能力。1.3研究的问题(1)游戏机制设计:需要设计游戏的核心机制,包括角色控制、武器系统、敌人设计、关卡设计等。需要考虑如何使游戏具有足够的挑战性和可玩性,同时与病毒传播和对抗的主题相符合。(2)病毒传播模拟:在游戏中模拟病毒的传播过程是关键的要素。您需要研究现有的病毒传播模型和算法,并将其应用于游戏中,以实现逼真的病毒传播模拟。(3)游戏教育性质:考虑到希望这款游戏有教育性质,需要思考如何在游戏中融入相关的教育元素和信息,以增加玩家对病毒传播和对抗的认识和理解。(4)用户体验设计:为了吸引和保持玩家的兴趣,需要设计良好的用户体验。这包括界面设计、音效、视觉效果、游戏进程和难度的平衡等方面。(5)用户反馈与评估:在游戏开发过程中,考虑进行用户反馈和评估,以了解玩家对游戏的体验和理解程度。这可以帮助改进和优化游戏的设计。1.4研究的目的和意义(1)增进对病毒传播和对抗的认识:通过设计和制作基于Unity的三维FPS游戏《病毒危机》,可以提供一个互动的平台,让玩家亲身体验和了解病毒传播和对抗的过程。这有助于增进公众对病毒传播机制、疫情控制和个人防护的认识和理解。(2)教育和宣传工具:游戏是一种具有吸引力和趣味性的媒介,通过将教育元素融入游戏中,可以提供一种有趣而有效的教育和宣传工具。《病毒危机》可以被用作公共卫生教育、疫情防控宣传和培训等方面,以提高公众的健康意识和应对能力。(3)游戏设计与开发实践:通过设计和制作一款基于Unity的三维FPS游戏,《病毒危机》可以作为游戏设计与开发的实践案例。这将为游戏开发者、教育者和相关领域的研究人员提供一个参考,可以借鉴和应用于其他类似主题的游戏设计和开发项目中。(4)用户参与与反馈:通过实际玩家的参与和反馈,可以评估游戏的效果和用户体验,进一步改进和优化游戏的设计。这有助于提高游戏的可玩性和教育效果,并为游戏设计和用户体验研究提供实证数据和经验。总之,该研究的目的是通过设计和制作基于Unity的三维FPS游戏《病毒危机》,增进公众对病毒传播和对抗的认识,提供教育和宣传工具,推动游戏设计与开发实践,并通过用户参与与反馈不断改进游戏的设计。这将有助于促进公众健康意识、疫情防控能力的提升,并为相关领域的研究和实践提供有益的经验和参考。2需求分析与开发工具2.1需求分析通过阅读黄冈.基于虚幻引擎的FPS游戏开发与设计[5]文献,在基于Unity的三维FPS游戏《病毒危机》课题研究的需求分析时,需要考虑以下方面的需求:(1)游戏机制:角色控制:确定玩家角色的移动、跳跃、射击等基本操作,并考虑角色与环境的互动。武器系统:设计不同类型的武器,包括近战和远程武器,考虑武器的伤害、射程、装弹等属性。敌人设计:确定不同类型的敌人,包括感染者和病毒变异体,考虑它们的行为模式、攻击方式和弱点。关卡设计:设计多个关卡,包括不同的地图、任务目标和难度,以提供游戏的进展和挑战性。(2)游戏教育性质:知识传递:融入相关的教育元素和信息,提供关于病毒传播机制、疫情控制策略和个人防护措施等知识。宣传效果:通过游戏中的故事情节和任务设置,宣传公共卫生意识,强调疫情防控的重要性。(3)用户界面和交互:菜单设计:设计直观易用的菜单界面,包括开始游戏、选项设置、存档等功能。游戏界面:提供信息展示,如血量、弹药、任务进度等,以及交互元素,如按钮、物品收集等。控制方式:支持键盘、鼠标等多种控制方式,以满足不同玩家的需求。(4)视觉和音效效果:场景设计:创建逼真的游戏场景,包括城市街道、医疗设施、实验室等,以展现病毒传播的环境背景。角色设计:设计精细的角色模型和动画,使其与游戏主题相符合。特效和音效:提供视觉特效和音效,如爆炸、感染特效和各种环境音效,以增强游戏的沉浸感。(5)难度和平衡:游戏难度:根据关卡的进展和玩家技能,设计适度的游戏难度,使游戏既具有挑战性又不过于困难。游戏平衡:平衡玩家的能力与敌人的强度,确保游戏的公平性和可玩性。(6)用户反馈与评估:用户反馈:收集玩家的反馈意见和建议,了解他们对游戏机制、教育内容和用户体验的看法。评估指甲方对于基于Unity的三维FPS游戏《病毒危机》课题研究的需求分析如下:(7)游戏机制:角色控制:确保玩家角色具有流畅的移动、跳跃和射击等基本操作,使其易于操作和掌握。武器系统:设计多样化的武器选择,包括近战和远程武器,以满足不同玩家的游戏风格和策略需求。敌人设计:创建多种类型的敌人,具备独特的行为模式和攻击方式,以增加游戏的挑战性和变化性。关卡设计:设计多个精心构思的关卡,包括不同的地图布局、任务目标和难度级别,以提供丰富的游戏体验和持续的兴趣。2.2开发工具unity引擎Unity引擎是一款广泛应用于游戏开发和虚拟现实应用的跨平台开发工具。下面是对Unity引擎的介绍:Unity引擎由UnityTechnologies开发,通过阅读胡磊.基于Unity3DFPS游戏开发[10]文献,是一款强大的可视化开发工具,旨在帮助开发者创建高质量的游戏和交互式虚拟现实应用。Unity支持多个平台,包括Windows、Mac、iOS、Android和主要的游戏主机等。以下是Unity引擎的一些主要特点和功能:跨平台开发:Unity引擎支持跨多个平台进行开发,开发者可以使用同一套代码基于不同的平台发布游戏或应用程序。这大大简化了开发过程和发布流程,提高了开发效率。可视化编辑器:Unity引擎提供了一个直观的可视化编辑器,使开发者能够轻松创建、编辑和管理游戏场景、角色、动画和其他资源。通过拖放和属性设置等方式,开发者可以快速实现想法并进行迭代调整。2D和3D图形引擎:Unity引擎内置了强大的2D和3D图形引擎,支持各种视觉效果和渲染技术。开发者可以创建精美的游戏场景、角色模型、特效和动画,以及应用光照、阴影和材质等技术来提升游戏的视觉质量。物理模拟:Unity引擎提供了物理引擎的集成,使开发者能够模拟真实的物理效果,如重力、碰撞和刚体动力学等。这使得游戏中的物体可以更加真实地运动和互动,增加了游戏的逼真感和可玩性。脚本编程:Unity引擎支持使用C#脚本进行游戏逻辑编程。开发者可以编写自定义的脚本来实现游戏中的各种功能和行为,例如角色控制、碰撞检测、游戏逻辑和人工智能等。这提供了灵活性和可扩展性,使开发者能够根据项目的需求进行自定义编程。社区支持和资源丰富:Unity引擎拥有庞大的开发者社区,开发者可以在论坛、博客和教程等资源中获取帮助和支持。此外,UnityAssetStore是一个集成在引擎内的在线资源商店,开发者可以在其中找到各种插件、工具和资源,加速开发过程。多人合作开发:Unity引擎支持团队的多人协作开发。多个开发者可以同时编辑同一个项目,通过版本控制工具进行协同工作,加快开发速度和减少冲突。移动平台优化:Unity引擎针对移动平台进行了优化,使得开发者能够在iOS和Android等移动设备上创建高性能的游戏和应用程序。此外,Unity还提供了移动平台的特定功能和插件,如移动输入、加速计和虚拟现实的支持。2.3开发工具VisualStudioVisualStudio是一款由微软公司开发的集成开发环境(IDE),用于软件开发和应用程序的构建。下面是对VisualStudio开发工具的介绍:多语言支持:VisualStudio支持多种编程语言,包括C#、C++、Java、Python、JavaScript等。开发者可以根据自己的需求选择适合的语言进行开发,而无需切换不同的开发环境。强大的代码编辑器:VisualStudio提供了强大的代码编辑器,具有智能感知、语法高亮、代码自动补全和重构等功能。它能够提供实时错误检查和格式化,并支持快速导航和查找替换等操作,提高开发效率。调试和测试工具:VisualStudio提供了强大的调试工具,开发者可以在开发过程中逐步调试程序,查找和修复错误。它还支持单元测试和性能分析工具,帮助开发者编写可靠和高效的代码。GUI设计工具:VisualStudio提供了可视化的GUI设计工具,如WindowsForms和WPF(WindowsPresentationFoundation),使开发者能够轻松创建用户界面。开发者可以通过拖放和属性设置等方式设计和布局界面元素,并为其添加交互和事件处理。版本控制集成:VisualStudio集成了常见的版本控制系统,如Git和TeamFoundationServer(TFS),方便开发者进行代码管理和团队协作。开发者可以轻松地查看、比较和合并代码,并进行版本控制操作,以保证代码的安全和可追溯性。扩展和插件:VisualStudio支持扩展和插件,开发者可以根据自己的需求选择和安装各种工具和扩展,以增强开发环境的功能。这些扩展可以提供额外的语言支持、调试工具、代码生成器等功能,满足不同开发需求。云服务集成:VisualStudio与Azure云服务平台紧密集成,开发者可以轻松地构建、调试和部署云应用程序。它提供了一系列的云服务和工具,包括虚拟机、数据库、存储和身份验证等,使开发者能够快速开发和部署云端解决方案。社区支持和资源丰富:VisualStudio拥有庞大的开发者社区,开发者可以在论坛、博客和教程等资源中获取帮助和支持。此外,VisualStudioMarketplace是一个集成在开发环境中的在线商店,提供了各种扩展、模板和工具,方便开发者在项目中应用。2.4建模工具3dsMax3dsMax是由Autodesk公司开发的一款专业的三维建模、动画和渲染软件。下面是对3dsMax建模工具的介绍:三维建模:3dsMax提供了强大的三维建模工具,可以创建复杂的几何体、曲线和表面。它支持多种建模技术,如多边形建模、NURBS建模和体素建模,使用户能够以各种方式创建和编辑模型。动画制作:3dsMax具有出色的动画制作功能,可以创建高质量的动画效果。它支持关键帧动画、路径动画、物理模拟和粒子系统等技术,使用户能够制作逼真的角色动画、物体动画和特效动画。渲染和照明:3dsMax内置了强大的渲染引擎,可以实现逼真的渲染效果。它支持全局照明、实时预览和高动态范围图像处理等功能,使用户能够创建真实感和令人印象深刻的渲染图像。材质和纹理:3dsMax提供了丰富的材质和纹理编辑工具,可以为模型添加表面材质、纹理和贴图。用户可以调整材质的属性、添加反射和折射效果,并使用各种纹理映射技术实现更加细致的视觉效果。插件和脚本:3dsMax支持插件和脚本扩展,用户可以根据自己的需求选择和安装各种插件和脚本,增强软件的功能和效率。这些插件和脚本可以提供额外的建模工具、动画效果和渲染选项,满足不同项目的需求。集成和兼容性:3dsMax与其他Autodesk产品和第三方软件具有良好的集成性和兼容性。用户可以与Autodesk的AutoCAD、Revit和Maya等软件进行无缝协作,并导入导出多种文件格式,如FBX、OBJ和STL等,方便与其他软件进行数据交换。建模库和资源:3dsMax提供了丰富的建模库和资源,包括预设的模型、材质、纹理和动画效果等。用户可以直接使用这些资源,节省建模和设计的时间,并快速创建出色的作品。3游戏玩法与介绍3.1键位介绍本项目与市面上众多FPS游戏类似,都是通过鼠标与键盘进行输入,在Unity项目中进行输出。鼠标键位:移动鼠标对主角人物的第一视角进行旋转控制,对鼠标进行单击则是射击触发按键,遇到“狙击枪”枪械则可右键进行开镜瞄准。键盘键位:通过键盘输入,“W”键位对主角人物进行向前行走,“S”键位对主角人物进行向后行走,“A”键位对主角人物进行向左行走,“D”键位对主角人物进行向右行走。“R”键位对枪械进行换弹处理,“shift”键位对主角人物进行加速行走,“空格”键位对主角人物进行跳跃处理。3.2游戏开始界面游戏开始界面有“开始游戏”与游戏介绍两个按钮。点击“开始游戏”按钮则跳转场景,进入到游戏界面,如图3.1所示。图3.1游戏开始UI点击“游戏介绍按钮”,则会弹出对本项目游戏的背景故事,如图3.2所示。图3.2游戏介绍UI3.3游戏关卡介绍本项目分为主关卡与副本关卡,其中主关卡一共分为三关,副本关卡共两关。主关卡第一关:人物主角出生在“花坛”中,通过拾取武器的方式消灭第一关卡中出现的所有怪物以及Boss,从而获取通过钥匙,打开第一关的通关门。人物主角靠近通关门则会触发答题系统,内容关于新冠疫情,玩家不管答对与否都会通过通关门。具体如图3.3~图3.7所示。图3.3出生界面图3.4获取武器界面图3.5主角人物死亡界面图3.6击败Boss获取通关钥匙图3.7通关门答题系统主关卡第二关:通过第一关卡的通关门之后跳转到副本关卡传送通道,如图3.8所示。靠近如图3.9所示中的“Doctor医生”后,会弹出进入副本对话框,点击是则跳转到“副本关卡1”中。图3.8第二关通道图3.9副本关卡1对话框副本关卡1:如图6.10所示“副本人物1”手持双枪,通过“W,A,S,D”键位对人物进行移动处理,如图3.11所示,单机鼠标左键进行射击。如图3.12所示游戏一共分为三波,消灭出现的怪兽则游戏通关,从而显示游戏胜利UI,点击确定返回主游戏,如图3.13所示。图3.10副本游戏1场景图3.11主角人物对怪物进行射击图3.12游戏胜利UI返回主场景,地面会出现“步枪”,从而获取更大的伤害,对第二关的Boss造成强力的伤害。第二关Boss如同第一关Boss一样,击败Boss从而打开“通关门2”进入主场景的第三关。主关卡第三关:如图3.13所示进入第三关卡通道出现“Doctor医生”,点击对话框“是”跳转“副本关卡2”图3.13副本关卡2对话框副本关卡2:“小飞机”作为本游戏主体,与“副本关卡1”操作同理,通过“W,A,S,D”键位对“小飞机”进行移动处理,单机鼠标左键进行射击。如图3.14所示,左下角红色条代表当前剩余血量。消灭怪物得1分,直到得分达到50分从而通关,如图3.15所示,跳转游戏胜利场景,点击确定返回主场景。图3.14副本关卡2图3.15副本关卡2通关UI与第二关通关相同,地面出现“狙击枪”,“狙击枪”可以通过鼠标右键进行开启瞄准镜,如图3.16所示。图3.16狙击枪瞄准镜3.4游戏结束界面如图3.17所示,通过击败第三关Boss,进入游戏胜利场景,三个Boss进行跳舞来庆祝游戏的胜利。如图3.18所示,停留五秒钟之后跳转游戏胜利UI。图3.17三个Boss跳舞庆祝胜利图3.18游戏胜利UI界面
4模型场景设计4.1游戏主场景设计图4.1游戏主场景设计如图4.1所示本项目主场景是一个类似空间站的场景,场景中有覆盖满植被的房间,也有普通的空间站房间,以及走廊,具体的建模步骤为:创建基本几何体:开始时,可以使用3dsMax中的基本几何体(如盒子、圆柱体、球体等)来创建空间站的整体结构。根据你的设计,使用适当的几何体来模拟房间和走廊的形状和尺寸。组合和布局:使用3dsMax的组合工具,将各个几何体组合成房间和走廊的基本结构。通过调整、旋转和缩放等操作,将它们合理地布局在场景中,形成整个空间站的结构。添加细节和装饰:一旦基本结构完成,可以开始添加细节和装饰来增强场景的真实感。这包括添加墙壁纹理、门、窗户、灯具、终端等元素。使用3dsMax的建模工具和纹理映射功能,将这些元素精细地放置在场景中。照明和照明效果:为了营造适合空间站场景的氛围,需要设置适当的照明。通过在场景中添加光源(如点光源、聚光灯等)和调整光照属性,可以创建合适的照明效果。使用阴影、反射和折射来增加逼真度。建模怪兽和病毒元素:根据设计,使用3dsMax的建模工具创建怪兽和病毒元素。可以从头开始建模,也可以使用参考图像或导入外部模型。确保将它们放置在适当的位置,并与场景中的其他元素相互作用。设置相机和视角:通过设置相机的位置和视角,来确定场景的观察点。可以在3dsMax中调整相机属性,如焦距、透视和景深,以实现所需的视觉效果。通过尝试不同的视角和镜头设置,找到最佳的呈现方式。渲染和后期处理:如图4.2所示完成场景的建模和布置后,使用3dsMax的渲染引擎进行渲染。通过阅读李樊.基于Unity3D的游戏场景设计[14]文献,选择适当的渲染设置和输出格式,并进行渲染。如果需要进一步的图像处理,使用3dsMax或其他图像编辑软件进行后期处理,颜色校正、特效添加等。图4.2游戏处理后效果4.2游戏敌人模型设计与制作以史莱姆状病毒敌人模型制作举例。设计概念和参考:首先,确定史莱姆病毒的外观和特征进行一些概念设计,或者参考现有的史莱姆病毒形象,如其他游戏、动画或插图。确立一个清晰的设计目标。建模:使用三维建模软件3dsMax,根据设计概念开始创建史莱姆病毒的模型。从基本的几何形状开始,逐渐添加细节和特征,以形成一个具有病毒特征的模型。材质和纹理:为史莱姆病毒模型添加材质和纹理,使其外观更加逼真和有趣。使用纹理绘制软件SubstancePainter创建病毒的纹理贴图,并将其应用到模型上。骨骼和动画:创建史莱姆病毒的骨骼系统,并制作相应的动画。通过骨骼系统,为病毒模型添加动态的效果,如行走、攻击、受伤等动作。使用动画Animation系统制作和编辑动画。导入和调整:将史莱姆病毒模型导入到Unity引擎中,并进行调整和优化。调整碰撞体积、优化模型的多边形数量、设置材质属性等,以确保模型在游戏中的性能和表现良好。特效和音效:为史莱姆病毒添加一些特效,粒子效果、发光效果等,以增强其视觉效果。此外,为史莱姆病毒添加相应的音效,行走声、攻击声等,以增强游戏的听觉体验。具体效果图如图4.3所示。图4.3Shilaimu敌人模型效果图其他模型制作步骤同上最终模型效果如图4.4图4.5与图4.6所示。图4.4GermSpike敌人模型效果图图4.5GermSlime敌人模型效果图图4.6HeartStone敌人模型效果图5游戏开发总设计5.1第一人称射击主角制作与介绍5.1.1第一人称射击主角介绍通过阅读杜汝涛.Unity3D射击类游戏的开发[17]文献,在本项目的中,我开发了一个第一人称射击游戏的主角角色。该主角具备多种功能,包括移动、射击、旋转视角和切换武器。首先,主角可以通过输入控制进行移动。实现了角色移动的逻辑,包括前进、后退、向左和向右移动,以及根据玩家的输入改变移动速度。这样,玩家可以自由探索游戏世界。其次,实现了主角的射击功能。玩家可以按下特定的按键来发射子弹或其他射击物体。编写了相应的代码,使得子弹可以从玩家的位置朝着准星所指的方向发射。这样,玩家可以与游戏中的敌人或目标进行交互。另外,还实现了主角视角的旋转功能。通过玩家的鼠标移动,我让主角的视角跟随鼠标的方向进行旋转。这样,玩家可以通过移动鼠标来改变主角的视角,增加游戏的沉浸感和操作体验。最后,为主角添加了切换武器的功能。玩家可以使用特定的按键来切换不同的武器或工具。我编写了相应的代码,使得主角可以在游戏中切换不同的武器,每种武器具有不同的特点和功能,从而增加了游戏的策略性和多样性。如图5.1所示通过以上的功能实现,开发了一个具备移动、射击、旋转视角和切换武器等功能的第一人称射击游戏的主角角色。这些功能提升了游戏的可玩性和乐趣,使玩家能够更加自由地探索和体验游戏世界。图5.1第一人称设计主角介绍5.1.2第一人称移动逻辑制作通过获取玩家的输入来控制角色的移动方向和速度,在每一帧更新时,根据输入计算移动距离,并使用CharacterController组件的Move()方法进行实际的移动操作。同时,根据玩家的输入判断是否奔跑,并将实际速度应用到移动距离上。最后,根据水平和垂直输入的值判断是否停止移动。代码逻辑如下:privatevoidMove(){//根据玩家输入的"Run"按钮判断是否奔跑,决定实际速度actualSpeed=Input.GetButton("Run")?runningSpeed-decreaseSpeed:moveSpeed-decreaseSpeed;//获取玩家的水平和垂直输入floath=Input.GetAxis("Horizontal");floatv=Input.GetAxis("Vertical");//创建一个新的Vector3对象来表示移动方向Vector3move=newVector3(h,0,v);move.Normalize();//将移动方向进行单位化,确保长度为1//根据实际速度和时间步长计算移动距离move=move*actualSpeed*Time.deltaTime;//将移动方向转换为相对于角色的世界坐标方向move=transform.TransformDirection(move);//使用CharacterController组件的Move()方法进行移动,并获取碰撞信息collisionFlags=characterController.Move(move);//如果水平和垂直输入都小于等于0.1,则将实际速度设为0,表示停止移动if(h<=0.1f&&v<=0.1f){actualSpeed=0;}}5.1.3第一人称屏幕旋转逻辑制作获取鼠标在水平和垂直方向上的移动量,根据鼠标灵敏度将其转化为旋转角度,并将旋转角度应用到角色和摄像机的欧拉角上,实现了玩家角色的屏幕旋转功能。玩家可以通过移动鼠标来改变视角,增加游戏的交互和沉浸感。其中,Y轴的旋转角度控制角色的水平旋转,X轴的旋转角度控制摄像机的垂直旋转,并通过
Mathf.Clamp
方法限制X轴的旋转角度在合理的范围内。代码逻辑如下:privatevoidTurnAndLook(){//获取鼠标在水平方向上的移动量,并乘以鼠标灵敏度得到旋转角度floatturnAngle=Input.GetAxis("MouseX")*mouseSensitivity;//将旋转角度添加到Y轴的旋转角度上angleY=angleY+turnAngle;//更新角色的欧拉角,只改变Y轴的旋转角度transform.eulerAngles=newVector3(transform.eulerAngles.x,angleY,transform.eulerAngles.z);//获取鼠标在垂直方向上的移动量,并乘以鼠标灵敏度得到旋转角度floatlookAngle=-Input.GetAxis("MouseY")*mouseSensitivity;//将旋转角度添加到X轴的旋转角度上,并使用Mathf.Clamp方法限制旋转角度在-90度到90度之间angleX=Mathf.Clamp(angleX+lookAngle,-90f,90f);//更新摄像机的欧拉角,只改变X轴的旋转角度cameraTrans.eulerAngles=newVector3(angleX,cameraTrans.eulerAngles.y,cameraTrans.eulerAngles.z);}5.1.4第一人称角色跳跃逻辑制作角色跳跃的逻辑。当玩家按下跳跃键且角色在地面上时,角色离开地面并开始跳跃,跳跃过程中根据时间步长逐渐减小跳跃速度,并使用CharacterController组件的Move()方法进行跳跃移动。如果碰撞信息表示在下方碰撞到了地面,停止跳跃并恢复isGrounded为true,表示角色着陆在地面上。同时,在角色离开地面上,如果与其他碰撞器没有发生碰撞,则播放落地音效。具体代码逻辑如下:privatevoidJump(){//检测玩家是否按下跳跃键且当前在地面上if(Input.GetButton("Jump")&&isGrounded){//离开地面,设置isGrounded为falseisGrounded=false;//设置跳跃速度为初始值jumpSpeed=5;//播放跳跃音效AudioSourceManager.Instance.PlaySound(jumpClip,0.8f,1.1f);//设置可以播放落地音效的标志canPlayLandClip=true;}//如果不在地面上(已经跳起来了)if(!isGrounded){//根据时间步长逐渐减小跳跃速度jumpSpeed=jumpSpeed-10*Time.deltaTime;//创建一个新的Vector3对象表示跳跃方向Vector3jump=newVector3(0,jumpSpeed*Time.deltaTime,0);//使用CharacterController组件的Move()方法进行跳跃,并获取碰撞信息collisionFlags=characterController.Move(jump);//如果碰撞信息表示在下方碰撞到了地面if(collisionFlags==CollisionFlags.Below){//停止跳跃,恢复isGrounded为truejumpSpeed=0;isGrounded=true;}}//如果在地面上且没有与其他碰撞器发生碰撞if(isGrounded&&collisionFlags==CollisionFlags.None){//如果可以播放落地音效的标志为真if(canPlayLandClip){//播放落地音效canPlayLandClip=false;AudioSourceManager.Instance.PlaySound(landClip,0.8f,1.1f);}//离开地面,设置isGrounded为falseisGrounded=false;}}5.1.5拾取武器与切换武器逻辑制作实现武器的拾取和切换功能。切换当前武器到指定的武器编号
id。该方法会根据当前的武器字典
weaponsDict
中的武器数量和指定的
id
进行判断和调整,以确保切换到正确的武器。如果
id
与当前武器编号相同或者武器字典为空,则不进行切换。方法中还包括隐藏上一把武器和显示当前武器的逻辑。ChangeCurrentWeapon
方法是一个控制函数,用于根据不同的输入方式切换武器。如果
autoChange
参数为
true,则自动切换到最新拾取的一把武器;否则,根据鼠标滚轮或数字键输入切换武器。PickUpWeapon
方法用于拾取武器。如果当前已经拥有该编号的武器,则只会补充弹药;否则,将该武器添加到武器字典和弹药库存中,并切换到该武器。综上所述,通过
ChangeCurrentWeapon
方法可以根据不同的输入方式切换武器,而
PickUpWeapon
方法用于拾取新的武器并更新弹药信息。这些方法共同实现了武器的切换和拾取功能。具体代码如下:publicvoidChangeCurrentWeapon(boolautoChange=false)//切换武器方法{if(autoChange){//切换到最新拿到的一把武器ChangeWeapon(weaponsDict.Keys.Last());}else{//使用鼠标滚轮切换武器if(Input.GetAxis("MouseScrollWheel")<0){ChangeWeapon(currentWeaponID+1);}elseif(Input.GetAxis("MouseScrollWheel")>0){ChangeWeapon(currentWeaponID-1);}//使用数字键1~10切换武器for(inti=0;i<10;i++){if(Input.GetKeyDown(KeyCode.Alpha0+i)){intnum;//处理数字键0对应的情况if(i==0){num=10;}else{num=i-1;}//如果拥有对应编号的武器,则切换到该武器if(weaponsDict.ContainsKey(num)){ChangeWeapon(num);}}}}}//拾取武器publicvoidPickUpWeapon(intweaponID){if(weaponsDict.ContainsKey(weaponID)){//补充弹药Weaponweapon=weaponsDict[weaponID];ammoInventory[weapon.GetID()]=weapon.GetInitAmount();weapon.clipContent=weapon.clipSize;//如果当前武器就是拾取的武器,更新弹药显示if(currentWeaponID==weaponID){UIManager.Instance.UpdateBulletNum(weapon.clipSize,weapon.GetInitAmount());}}else{//如果当前没有拥有该编号的武器,则添加到武器字典和弹药库存中,并切换到该武器weapons[weaponID].clipContent=weapons[weaponID].clipSize;weaponsDict.Add(weaponID,weapons[weaponID]);ammoInventory.Add(weaponID,weapons[weaponID].GetInitAmount());ChangeWeapon(weaponID);}}5.1.6主角状态血量的制作逻辑通过编写TakeDamage
方法,实现主角受到伤害的逻辑。根据伤害值的正负和当前生命值的情况,执行相应的逻辑,包括治疗、受伤、死亡状态的处理,以及音效、界面显示等反馈。具体代码逻辑如下:publicvoidTakeDamage(intvalue){if(dead){return;}//检查伤害值是否小于0,如果小于0表示为恢复生命值的治疗效果if(value<0){if(currentHP<initHP){currentHP-=value;if(currentHP>=initHP){currentHP=initHP;}}}else{currentHP-=value;}//判断当前生命值是否小于等于0,如果是则角色死亡if(currentHP<=0){dead=true;//设置相机位置和旋转为死亡状态cameraTrans.localPosition=deadPostionTrans.localPosition;cameraTrans.eulerAngles=deadPostionTrans.eulerAngles;weaponPlaceTrans.gameObject.SetActive(false);//隐藏武器currentHP=0;UIManager.Instance.ShowDeadUI();//显示死亡界面AudioSourceManager.Instance.PlaySound(deadClip);//播放死亡音效}else{//当前生命值大于0,表示收到伤害if(value>0){AudioSourceManager.Instance.PlaySound(hurtClip);//播放受伤音效UIManager.Instance.ShowTakeDamageView();//显示受伤提示cameraShaker.SetShakeValue(0.2f,0.5f);//设置相机震动效果}}UIManager.Instance.UpdateHPValue(currentHP);//更新生命值显示}首先,检查角色是否已经死亡(dead
标志),如果已经死亡,则直接返回,不执行后续逻辑。判断伤害值value是否小于0,如果小于0,表示为治疗效果,将当前生命值恢复。在当前生命值小于初始生命值时,才会执行恢复操作,并确保恢复后的生命值不超过初始生命值。如果伤害值value大于等于0,表示受到伤害,直接从当前生命值中减去伤害值。检查当前生命值是否小于等于0,如果是,则将角色标记为死亡状态。设置相机位置和旋转为死亡状态,隐藏武器,将当前生命值设置为0,显示死亡界面,并播放死亡音效。如果当前生命值大于0,表示收到伤害。播放受伤音效,显示受伤提示界面,设置相机震动效果。最后,更新生命值的显示。5.2敌人的制作逻辑5.2.1敌人制作逻辑介绍通过阅读何柳青.Unity3的角色动作游戏战斗系统研究与实现[15]文献,在本项目中,实现了怪物的移动、监听主角并追踪攻击的功能,以及怪物被武器攻击后的掉血和死亡效果。如图5.2所示这些功能的实现使得游戏中的怪物具有了更加智能和逼真的行为。当主角进入怪物的感知范围时,怪物会开始追踪主角,并不断调整自己的位置以保持接近主角。一旦怪物接近到攻击范围内,它会发动攻击并对主角造成伤害。当怪物受到主角武器的攻击时,它会根据受到的伤害减少相应的血量。如果怪物的血量降至零或以下,它将被标记为死亡状态,并展示相应的死亡效果,如停止移动并播放相应的动画。这些功能的实现为游戏增添了战斗和挑战的元素,提升了游戏的可玩性和乐趣。图5.2敌人制作逻辑介绍5.2.2敌人智能行为巡逻与追踪主角如图5.3所示实现敌人移动和追踪主角的逻辑。通过控制敌人的位置、旋转和状态转换,实现了敌人的智能行为,使其能够在游戏中追踪和攻击主角:privatevoidMove(){//使用Translate()方法将敌人沿着自身的前方向移动//移动距离由速度currentMoveSpeed和时间Time.deltaTime决定transform.Translate(transform.forward*Time.deltaTime*currentMoveSpeed,Space.World);//使用Slerp()方法使敌人的旋转平滑过渡到目标旋转targetRotation//过渡比例为0.1ftransform.rotation=Quaternion.Slerp(transform.rotation,targetRotation,0.1f);}Move()方法用于控制敌人的移动。通过Translate()方法将敌人沿着自身的前方向移动,移动距离由速度
currentMoveSpeed
和时间
Time.deltaTime
决定。同时,使用Slerp()方法使敌人的旋转平滑过渡到目标旋转
targetRtectedvirtualvoidOnCollisionEnter(Collisioncollision){//如果当前状态为巡逻状态(PATROL)且碰撞对象的图层不是11(假设11代表主角)//并且距离上次转向的时间超过5秒if(currentState==ENEMYSTATE.PATROL&&collision.gameObject.layer!=11&&Time.time-canTurnTimer>5){//更新上次转向的时间canTurnTimer=Time.time;//将目标旋转targetRotation设置为当前朝向的反方向targetRotation=Quaternion.LookRotation(-transform.forward,transform.up);//更新最后行动时间为当前时间lastActTime=Time.time;}//如果当前状态为追逐(CHASE)、返回(RETURN)或攻击(ATTACK)状态elseif(currentState==ENEMYSTATE.CHASE||currentState==ENEMYSTATE.RETURN||currentState==ENEMYSTATE.ATTACK){//将刚体设为运动学rigid.isKinematic=true;//在1秒后调用CloseIsKinematicState()方法Invoke("CloseIsKinematicState",1);}}图5.3敌人智能行为巡逻与追踪主角OnCollisionEnter()方法在敌人发生碰撞时被调用。首先,判断当前状态是否为巡逻状态(PATROL)且碰撞对象的图层不是11(这里假设11代表主角)。同时,通过计时器判断上次转向的时间是否超过5秒,避免过于频繁转向。如果满足条件,将目标旋转
targetRotation
设置为当前朝向的反方向,以改变敌人的移动方向。另外,如果敌人处于追逐(CHASE)、返回(RETURN)或攻击(ATTACK)状态,则将刚体设为运动学(isKinematic),并通过Invoke()方法在1秒后调用CloseIsKinematicState()方法,再次将刚体设为非运动学状态。protectedvirtualvoidReturnToInitPos(){//使用Translate()方法将敌人沿着自身的前方向移动//移动距离由速度currentMoveSpeed和时间Time.deltaTime决定transform.Translate(transform.forward*Time.deltaTime*currentMoveSpeed,Space.World);//使用Slerp()方法使敌人的旋转平滑过渡到目标旋转targetRotation//过渡比例为0.1ftransform.rotation=Quaternion.Slerp(transform.rotation,targetRotation,0.1f);//如果敌人与初始位置的距离小于等于1if(Vector3.Distance(transform.position,initPos)<=1){//将当前状态设置为巡逻状态currentState=ENEMYSTATE.PATROL;}}如图5.4所示ReturnToInitPos()方法用于使敌人返回初始位置。敌人通过Translate()方法沿着自身的前方向移动,移动距离由速度
currentMoveSpeed
和时间
Time.deltaTime
决定。同时,使用Slerp()方法使敌人的旋转平滑过渡到目标旋转
targetRotation。当敌人与初始位置的距离小于等于1时,将当前状态设置为巡逻状态。图5.4敌人智能行为巡逻与追踪主角protectedvirtualvoidCheckDistance(){//如果当前状态为返回状态(RETURN),直接返回if(currentState==ENEMYSTATE.RETURN){return;}//计算敌人与主角位置的距离floatdistance=Vector3.Distance(playerTrans.position,transform.position);//如果距离小于等于攻击范围(attackRange)且敌人可以攻击(canAttack)if(distance<=attackRange&&enemyFunction.canAttack){//将当前状态设置为攻击状态(ATTACK)currentState=ENEMYSTATE.ATTACK;}//如果距离小于等于追逐范围(chaseRange)且敌人可以追逐(canChase)elseif(distance<=chaseRange&&enemyFunction.canChase){//将当前状态设置为追逐状态(CHASE)currentState=ENEMYSTATE.CHASE;}//如果距离大于等于安全范围(safeRange)且敌人可以返回(canReturn)elseif(distance>=safeRange&&enemyFunction.canReturn){//如果当前状态为巡逻状态且敌人与初始位置的距离大于等于8if(currentState==ENEMYSTATE.PATROL&&Vector3.Distance(transform.position,initPos)>=8){//将当前状态设置为返回状态(RETURN)currentState=ENEMYSTATE.RETURN;//使用MoveTowards()方法使敌人移动到初始位置transform.position=Vector3.MoveTowards(transform.position,initPos,Time.deltaTime*currentMoveSpeed*2f);//如果敌人与初始位置的距离小于等于1if(Vector3.Distance(transform.position,initPos)<=1){//将当前状态设置为巡逻状态currentState=ENEMYSTATE.PATROL;}//如果距离小于等于攻击范围(attackRange)且敌人可以攻击(canAttack)if(distance<=attackRange&&enemyFunction.canAttack){//将当前状态设置为攻击状态(ATTACK)currentState=ENEMYSTATE.ATTACK;}CheckDistance()方法用于检测敌人与主角的距离,并根据距离和敌人的功能进行状态转换。首先,检查当前状态是否为返回状态(RETURN),如果是,则直接返回。然后,通过Vector3.Distance()方法计算敌人与主角位置的距离。根据距离和敌人的功能进行状态转换:如果距离小于等于攻击范围(attackRange)且敌人可以攻击(canAttack),则将当前状态设置为攻击状态(ATTACK);如果距离小于等于追逐范围(chaseRange)且敌人可以追逐(canChase),则将当前状态设置为追逐状态(CHASE);如果距离大于等于安全范围(safeRange)且敌人可以返回(canReturn),则根据当前状态进行进一步判断:如果当前状态为巡逻状态且敌人与初始位置的距离大于等于8,则将当前状态设置为返回状态,并将目标旋转
targetRotation
设置为指向初始位置的旋转;如果当前状态为追逐状态,则同样将当前状态设置为返回状态,并将目标旋转
targetRotation
设置为指向初始位置的旋转。protectedvirtualvoidChase(){//使用LookAt()方法使敌人面向主角的位置transform.LookAt(playerTrans);//使用Translate()方法将敌人沿着自身的前方向移动//移动距离由速度currentMoveSpeed和时间Time.deltaTime决定transform.Translate(transform.forward*Time.deltaTime*currentMoveSpeed,Space.World);}Chase()方法用于追逐主角。首先,使用LookAt()方法使敌人面向主角。然后,通过Translate()方法将敌人沿着自身的前方向移动,移动距离由速度
currentMoveSpeed
和时间
Time.deltaTime
决定。5.2.3敌人状态血量的制作逻辑如图5.5所示实现敌人的状态血量逻辑。当敌人受到伤害时,其当前血量会减去给定的伤害值。然后,攻击范围值会得到恢复。如果有音效(soundPlayer)存在,则会随机播放一个音效;否则,会播放指定的受伤音效(hurtClip)。如果当前血量仍大于0,则表示敌人仍然存活,方法返回。如果存在一个销毁特效(destroyEffect),则从对象池中获取一个粒子系统实例,并在敌人位置附近播放该特效。最后,将敌人的游戏对象禁用,使其不再参与游戏场景中的逻辑和渲染。具体代码逻辑如下:publicvirtualvoidTakeDamage(floatdamageValue){//减去伤害值damageValue从当前血量currentHealthcurrentHealth-=damageValue;//恢复攻击范围值RecoverAttackRangeValue();//播放随机音效(如果soundPlayer不为空)if(soundPlayer!=null){soundPlayer.PlayRandomSound();}//否则播放受伤音效hurtClipelse{AudioSourceManager.Instance.PlaySound(hurtClip);}//如果当前血量大于0,则返回if(currentHealth>0){return;}//如果存在销毁特效destoryEffectif(destoryEffect){//从对象池中获取一个粒子系统实例ParticleSystemps=PoolManager.Instance.GetInstance<ParticleSystem>(destoryEffect);//将粒子系统的时间重置为0ps.time=0;//播放粒子系统ps.Play();//设置粒子系统的位置为敌人的位置加上一个偏移量ps.transform.position=transform.position+newVector3(0,0.5f,0);}//禁用敌人游戏对象gameObject.SetActive(false);}图5.5敌人状态血量的制作逻辑6游戏总测试6.1功能测试如图6.1与图6.2图6.3所示,游戏中的各项功能按预期工作。测试包括玩家移动、攻击、与非玩家角色(NPC)的交互、任务完成等功能。测试效果符合预期。图6.1玩家移动测试效果图图6.2玩家攻击与敌人交互测试效果图图6.3任务完成获得奖励测试效果图6.2游戏场景测试如图6.4所示测试游戏中的各个场景,包括地图布局、环境设计、道具放置等。场景的可玩性和可视化,测试效果符合预期。图6.4游戏场景测试效果图6.3游戏流程测试如图6.5与图6.6所示,测试游戏的整体流程,包括开始界面、关卡切换、任务流程等。游戏流程能够顺畅进行,并且没有出现异常或错误,测试效果符合预期。图6.5开始界面测试效果图图6.6关卡切换测试效果图6.4游戏性测试通过阅读罗文.移动游戏处理器能效优化技术研究[3]文献,测试游戏的难度平衡、操作体验、敌人AI等。测试结果:游戏的难度适中,玩家能够享受游戏过程,并且游戏中的敌人具有合理的行为模式和反应能力。6.5多平台测试如图6.7所示游戏在多个平台上发布,PC、移动设备等,需要进行多平台测试,确保游戏在各个平台上的兼容性和性能表现,测试结果符合预期暂定PC端发布。图6.7PC端测试效果图6.6兼容性测试测试游戏在不同硬件配置和操作系统版本上的表现。测试结果:游戏在各种硬件设备和操作系统上能够正常运行,并且没有出现兼容性问题。6.7性能测试如图6.8所示测试游戏的性能,包括帧率、加载时间、内存占用等指标。测试结果:游戏在各种情况下都能够保持流畅的性能表现。图6.8性能测试效果图6.8用户体验测试邀请用户参与游戏测试,收集他们的反馈和意见。通过用户反馈改进游戏的可玩性、界面设计、音效等方面,以提升整体的用户体验。总
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年安徽省合肥市法检系统书记员招聘笔试模拟试题及答案详解
- 2026年承德市双滦区街道办人员招聘考试备考试题及答案详解
- 2026年合肥庐江县康捷新能源有限公司外包岗位面向社会招聘(第二批)笔试备考试题及答案详解
- 2025年德阳市旌阳区中小学教师招聘考试试题及答案详解
- 2026年汽车智能制造MES系统
- 2026年吕梁地区离石区街道办人员招聘考试备考题库及答案详解
- 2026年肇庆市鼎湖区法检系统书记员招聘笔试模拟试题及答案详解
- 2026年河南省洛阳市法检系统书记员招聘笔试模拟试题及答案详解
- 2026年广西壮族自治区北海市中小学教师招聘笔试备考题库及答案详解
- 2026年岳阳市云溪区中小学教师招聘笔试备考题库及答案详解
- 2024年重庆沙坪坝区西部重庆科学城沙兴实业发展集团有限公司招聘笔试参考题库含答案解析
- 《meta分析入门》课件
- 油脂加工与油脂知识教学课件
- 盘扣脚手架技术交底
- 招商银行智慧营销体系规划方案(2022年-2023年)
- von frey丝K值表完整版
- 《勾股定理》整章综合测试(一)338345
- NB/T 10943-202210 kV及以下有源型电压暂降治理设备检测规程
- GB/T 17880.6-1999铆螺母技术条件
- YY 0899-2020医用微波设备附件的通用要求
- JJF 1915-2021倾角仪校准规范
评论
0/150
提交评论