《基于Unity3D消防员角色扮演游戏设计与实现.docx》由会员分享,可在线阅读,更多相关《基于Unity3D消防员角色扮演游戏设计与实现.docx(32页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、基于Unity3D消防员角色扮演游戏设计与实现 基于Unity3D的消防员角色扮演嬉戏的设计与实现 Design and implementation of fireman role playing game based on Unity3d 内容摘要 近几年来,市场上的科普嬉戏越来越受人们重视,而在现有的市场上,关于消防员的嬉戏普遍都是以2D或2.5D画面为主,并且皆是玩家简洁地操作嬉戏人物进行灭火,科普效果并不显著。因此,开发一款以第一人称为视角并且加入训练元素的消防员角色扮演类嬉戏非常有意义。 本次课题通过收集消防员的日常训练资料、真实的火灾危害数据以及救援方式数据,再结合影视作品、书籍
2、等方向进行探讨探讨,从而制作具有肯定真实性的嬉戏关卡。本次课题探讨开发的嬉戏是一款基于Unity3D嬉戏开发引擎开发的第一人称视角的消防员角色扮演类嬉戏,嬉戏首先以地形编辑器Terrain制作嬉戏地形,以模型制作软件3D Studio Max制作以及修改模型加以协助,结合Unity引擎自带的粒子效果控件,创建具有真实感的火灾现场场景。在嬉戏中的人物操作则是通过运用Unity3D嬉戏开发引擎中自带的角色限制器CharacterController实现人物移动限制以及视角限制。再利用射线检测碰撞、碰撞触发器算法以及Enum算法等方式实现了在嬉戏中不同的状态拥有着不同的效果发生,提高了嬉戏的可玩性与
3、真实性。最终结合设定好的流程,使玩家更好地代入消防员角色之中。综上所述,本次课题探讨开发的嬉戏具有完整性以及创新性,具有较高的研讨价值及运用价值和学习价值。 关键词: Unity3D 消防员 角色扮演 真实 学习 Abstract In recent years, popular science games in the market have attracted more and more attention from people. However, in the existing market, firefighter games are generally based on 2D or
4、 2.5d pictures, and players simply operate the game characters to put out the fire. The popular science effect is not significant. Therefore, it makes sense to develop a firefighter role-playing game with the first person as the perspective and training elements. This project collects the daily trai
5、ning data of firefighters, the real data of fire hazards and the data of rescue methods, and then conducts research and discussion in combination with film and television works, books and other directions, so as to make a certain authenticity of the game level. This topic research and development of
6、 the game is a based on Unity3D game engine development firefighters role-playing games with a first-person perspective, game first with the Terrain editor Terrain landform, model making software 3 d Studio Max assist production and modify the model, combined with the Unity engine controls own parti
7、cle effect, creating realistic fire scenarios. The character manipulation in the game is to achieve the character movement control and perspective control through the use of the CharacterController built into the Unity3D game development engine. By means of ray detection collision, collision trigger
8、 algorithm and Enum algorithm, different effects are achieved in different states of the game, which further improves the playability and authenticity of the game. Finally, combined with the set process, make the player better into the fireman role. To sum up, the game researched and developed in th
9、is project has integrity and innovation, and has high research value, application value and learning value. Key words: Unity Firemen Role play Authentic Study 目 录 第一章 绪论 1 1.1本课题的探讨背景与意义 1 1.2消防员嬉戏在国内外的探讨现况 1 1.2.1消防员嬉戏在国内的探讨现况 1 1.2.2消防员嬉戏在国外的探讨现况 2 1.3本次课题的探讨设计运用的开发软件 3 1.3.1 Unity3D 3 1.3.2 3D St
10、udio Max 3 1.3.3 Microsoft Visual Studio 3 1.4本次课题的主要探讨内容 4 其次章 嬉戏的需求分析与总体设计方案 5 2.1 消防员角色扮演嬉戏的需求分析 5 2.1.1 玩家需求分析 5 2.1.2 功能需求分析 5 2.1.2 性能需求分析 6 2.2嬉戏的总体设计方案 7 2.2.1嬉戏结构设计方案 7 2.2.2总体结构设计方案 7 第三章 嬉戏具体设计与实现 10 3.1角色限制模块 10 3.1.1 角色移动限制 10 3.1.2 角色视角限制 11 3.1.3 鼠标锁定与解锁 12 3.2火焰效果模块 12 3.2.1 火焰部署 12
11、3.2.2 灭火功能实现 13 3.3 烟雾效果模块 15 3.4 灭火器模块 18 3.4.1 灭火器模型设置 18 3.4.2灭火器放射灭火剂功能实现 18 3.4.3 多种类灭火器问题 19 3.4.4 灭火器拾取与放下功能实现 20 3.5 氧气与健康值效果模块 22 3.6嬉戏UI模块 23 第四章 嬉戏测试 25 4.1功能测试 25 4.2性能测试 27 4.3嬉戏测试结论 27 第五章 总结与展望 28 5.1总结 28 5.2展望 28 参 考 文 献 30 致谢 31 第一章 绪论 1.1本课题的探讨背景与意义 本次课题探讨是运用嬉戏编程、Unity3D嬉戏开发引擎开发、3
12、D Studio Max模型制作软件制作和修改模型以及计算机图形学等相关技术实现的一个“寓教于乐”的第一人称消防员角色扮演单机嬉戏项目。其中带有边玩嬉戏以及边学习学问等特点:首先玩家扮演的是一名消防员,任务包括灭火任务以及救援任务,在这方面运用第一人称能使玩家更好的代入嬉戏当中;其次是玩家在嬉戏过程中,可以通过嬉戏中自带的训练以及关卡设置的机关中学习到肯定的日常消防学问;再者,在现有的消防题材嬉戏当中,分为两种:一种是网页的儿童类小嬉戏,简洁来说就是用鼠标点击火焰图标灭火,科普性极低;其次种则是以老牌IP“消防第六分队”“急难先锋”等策略性嬉戏,科普性高,但是运用的皆是2.5D界面,职业代入感
13、较差。因此,本次课题探讨拥有着极高的探讨价值以及市场价值。 1.2消防员嬉戏在国内外的探讨现况 1.2.1消防员嬉戏在国内的探讨现况 消防员嬉戏目前在国内并不得到重视,在网上搜寻得到的中国消防员的嬉戏基本皆为网页小嬉戏。以百度搜寻引擎为例,搜寻消防员嬉戏,出现的基本都为4399、7K7K等小嬉戏网站供应的网页小嬉戏,其中的嬉戏基本为简洁的点击火焰标记即可灭火,无论什么火情都是可以用水进行灭火。操作简洁,但是科普性极低,而且无论什么火情都可以用水进行灭火是一个极其严峻的错误,在一些特别的火情当中,运用水去灭火很可能会造成更加大的危急。这很简单使得我国玩家单纯的以为水可以灭万火,导致在火灾当中造成
14、二次损害。以下用国内小嬉戏举例:奇想咕噜团-英勇消防员。玩家运用鼠标操作角色,鼠标点击建筑中的火焰标记即可喷出水柱进行灭火。可玩性不高,科普性极低。奇想咕噜团-英勇消防员嬉戏截图如下图1-1所示: 图1-1 国内消防小嬉戏奇想咕噜团-英勇消防员嬉戏截图 1.2.2消防员嬉戏在国外的探讨现况 国外消防员题材嬉戏主要以老牌IP“消防第六分队”“急难先锋”等策略性嬉戏为主,玩家主要是上帝视角2.5D限制角色进行救援任务,科普性极高,可玩性也高,但是玩家的代入性却不高。以“消防第六分队”嬉戏为例,玩家须要限制的是多名消防员进行救援任务,但是在嬉戏的过程中,很简单专注于一个任务点的救援任务而忽视某个任务
15、点的消防队员,导致其死亡。当消防员出现危急时,嬉戏小地图会出现一个红色感叹号,但是在某处即将发生爆炸时,地图也是出现红色感叹号,玩家很简单将二者搞混,导致角色死亡。虽然此类嬉戏科普性极高,将各种火情的灭火条件都一一区分,例如水是无法熄灭油罐车的火情等等,但是假如是采纳第一人称的话,玩家可以更好的代入这个职业当中,从而有更加深刻的印象。消防第六分队嬉戏截图如下图1-2所示: 图1-2 消防第六分队嬉戏截图 1.3本次课题的探讨设计运用的开发软件 1.3.1 Unity3D 在当今电子嬉戏越来越得到人们重视的社会,Unity3D也成为了绝大多数嬉戏开发者首选的开发3D引擎,虽然名字中带着3D二字,
16、但是Unity3D也在2D嬉戏开发上有着极其优秀的表现。首先Unity3D采纳的ALL IN ONE设计思路,使得开发者运用其开发嬉戏时极其便利,它将全部的编辑器集于一身,这可以让你对模型操作时只须要简洁的选中模型、右键、弹出材质编辑器,然后对它的材质,碰撞体,结构等进行操作即可,让人觉得是在操作模型本身。其次Unity3D能够在编辑后立即运行,查看效果,也可以在运行时修改嬉戏中的参数,可以实时看到你所作的调整,而当你停止运行时,你在嬉戏中所修改的参数也将失效,避开因为调整而遗忘自己最起先所设置的参数,称之为“所见即所得”。再者Unity3D拥有独一无二的开发者商城 Asset Stone,我
17、们可以在这商城中购买到其他开发者开发的插件,可以用来借鉴使得我们得到更好的思路以摆脱当前所面临的逆境,这是在其他嬉戏开发引擎中所不具备的特点之一。1.3.2 3D Studio Max 3ds MAX软件是由Discreet公司开发的用于打造三维动画渲染的软件,后来被广泛应用于嬉戏开发建模以及建筑设计和影视行业等领域。本次课题探讨开发的嬉戏也将借助于3ds MAX强大且敏捷的模型制作实力,对嬉戏中出现的楼房、场景中燃烧的物品以及相关的消防设备等模型进行搭建。1.3.3 Microsoft Visual Studio 本次课题探讨开发的嬉戏是基于C#语言所开发的,因此利用的开发工具集是微软公司开
18、发Visual Studio。Visual Studio协作Unity嬉戏引擎开发嬉戏的最佳搭档,能够利用其强大的调试功能来帮助运用者调试Unity嬉戏而快速发觉问题。1.4本次课题的主要探讨内容 综合前文论述,本次课题是以Unity3D嬉戏开发引擎作为开发工具,并以3D Studio Max模型制作软件为技术辅佐,研发的一款第一人称实现消防训练、现场灭火以及火场救出人质等工作从而完成救援使命的消防员角色扮演嬉戏。 其次章 嬉戏的需求分析与总体设计方案 2.1 消防员角色扮演嬉戏的需求分析 2.1.1 玩家需求分析 一个嬉戏的好坏,在于玩家觉得这款嬉戏是否好玩,而好玩二字无非体现在这款嬉戏能否
19、让玩家在其中体验到:乐趣、吸引力、限制力以及挑战性,因此玩家最直观的需求也是以上几点。所以此嬉戏要求拥有1.简洁便利的操作模式;2.真实的火灾体验感;3.拥有挑战性的关卡。这样一来才能够让玩家有欲望玩下去,而不会半途而废。 2.1.2 功能需求分析 本嬉戏采纳的视角为第一人称,结合消防员这一职业,须要使得玩家拥有面对灾难的真实感觉,必需紧紧围绕“真实”二字来实现嬉戏的整体。首先,为了保证玩家在嬉戏初期训练关卡中能够快速学习嬉戏的限制方式,须要玩家与嬉戏的交互方式简洁便利,并且有肯定的交互反馈能让玩家体验到。其次,由于本嬉戏采纳的是第一人称视角,因此在嬉戏关卡中所设置的“火焰效果”以及“烟雾效果
20、”必需要真实,风格不行以为卡通风或者太过于假,拥有贴近现实的“火焰效果”以及“烟雾效果”能够极大程度的提升玩家对嬉戏的体验感。但是粒子效果也须要“适当”,不能因为追求华丽而对嬉戏性能造成影响。最终,还是围绕“真实”二字,制作氧气量的消耗。经过分析,在许多的救援案例中,百分之六十的消防员都是因为缺氧而导致伤亡,火焰燃耗会猛烈消耗氧气,再加上现场的燃烧产物有一氧化碳以及二氧化碳,这些都会造成消防员缺氧。因此打造一个氧气量消耗是非常必要的,能够极大提升嬉戏真实感。综上所述,将本次课题开发的嬉戏的功能需求大致分为以下几个模块: (1)人机交互:玩家通过运用键盘的WSAD四键来限制人物移动,空格键限制人
21、物跳动,再通过几个设置的按键进行触发设定好的效果。鼠标限制人物视角,左键限制激活水枪放射灭火剂、灭火器放射灭火剂等效果。(2)粒子效果:火焰粒子效果与烟雾粒子效果必需做到真实。不同的火焰须要区分开来,只有运用与之相对应的灭火器才能完成灭火操作;而烟雾则须要做到当火焰被熄灭时从燃烧物体上出现,以此提升玩家的真实感。(3)物理效果:人物在特定场景内会渐渐消耗事先设定好的氧气量,并且在氧气量消耗殆尽时会降低身体健康值,当身体健康值降为0时,会造成角色死亡,任务失败。嬉戏大体功能需求分析如下图2-1所示: 图2-1嬉戏大体功能需求分析图 2.1.2 性能需求分析 一款好的嬉戏,除了它的可玩性要高、内容
22、要足够丰富以外,还须要限制它对机器性能的损耗,假如这款嬉戏不能够流畅的运行,那么将会极大程度的降低玩家的嬉戏体验。但是,在本次课题探讨开发的嬉戏当中,制作真实的火灾现场必定会运用许多的粒子效果,而过多的粒子效果必定会损耗较多的机器性能,从而影响嬉戏性能。因此,在面对这些状况,必需在其它功能方面尽可能选择对机器性能损耗较低的方法实现。 2.2嬉戏的总体设计方案 2.2.1嬉戏结构设计方案 本次课题探讨开发的嬉戏结构以简洁便利为主,使得玩家玩家达到快速上手嬉戏的目的。本文嬉戏结构简洁分为起先嬉戏嬉戏主界面进行训练/干脆起先正式任务任务胜利/任务失败重新起先任务/退出任务主界面选择关卡/退出嬉戏,嬉
23、戏结构详情如下图2-2所示。 图2-2 嬉戏结构图 2.2.2总体结构设计方案 结合上文所述,可以得出本次课题探讨开发的嬉戏总体模块的架构如下图所示: 图2-3嬉戏总体模块架构图 对于本次课题探讨开发的嬉戏中各个模块的详细分析如下: (1)人机交互模块:嬉戏中的主界面、起先嬉戏界面以及嬉戏进行时的UI界面均由Unity3D嬉戏开发引擎中自带的UGUI模块来设计,运用C#脚原来监听识别玩家的操作,再通过UI的改变告知玩家此操作对嬉戏带来的影响,以此完成一系列的人机交互。在交互反馈方面,运用C#脚本编辑模块监听识别玩家的键盘输入或者鼠标点击事务,通过UI的颜色改变或者放大缩小又或者UI颜色递减等方
24、式与玩家进行交互,例如当玩家点击起先任务按钮可以通过按钮的改变来告知玩家是否已经点击到按钮;而在嬉戏训练关卡中,会以一部分字牌方式来提示玩家。 (2)嬉戏功能模块:嬉戏场景将运用由3ds MAX制作或修改的嬉戏建筑模型,协作Unity嬉戏开发引擎自带的Terrain地形编辑组件搭建完成。在救援现场建筑模块中,建筑模型的表面将协作火焰粒子效果以及烟雾粒子效果而制成真实的灾难现场效果。在建筑内部模块中,同样会添加火焰粒子效果以及烟雾粒子效果,同时再加入Unity嬉戏开发引擎中自带的Fog Light设定来增加烟雾降低玩家可见度的效果。当玩家进入特定区域之后,氧气剩余量或者身体健康值会发生递减改变来
25、告知玩家在此区域呆久可能会有生命危急;当玩家运用消防器材进行灭火时会以粒子效果改变来告知玩家此操作的是否有效,以达到提高玩家的嬉戏真实体验。 第三章 嬉戏具体设计与实现 3.1角色限制模块 3.1.1 角色移动限制 在本次课题探讨开发的嬉戏当中,角色操作模式与一般的第一人称射击类嬉戏操作方式大同小异,均是以键盘操作以及鼠标操作作为输入方式来对嬉戏事务进行触发以及操作。因此在本嬉戏中,人物移动是以WSAD限制前进、后退、向左以及向右,空格限制跳动。 在基于Unity3D嬉戏开发引擎开发的嬉戏当中,常见的限制角色移动方法有几种。第一种方法是干脆修改角色的transform.position属性,可
26、以利用if语句检测玩家的键盘输入来修改相对应方向的transform.position属性,以达到角色移动的目的,但这种方法有个缺点,就是角色移动起来会让人有一种卡顿的感觉;其次种是运用刚体Rigidbody组件,通过在相对应的方向施加力的作用来带动角色的移动,然而这种方法是具备物理特性的,意味着当你松开按键的时候,角色不会马上停下,而是会接着滑动一部分距离;第三种是运用Unity3D嬉戏开发引擎自带的角色限制器CharacterController,调用Move方法就可以实现角色的移动以及跳动。在本次课题探讨开发的嬉戏当中,为了削减代码开发量,我们选择运用第三种方法来实现角色移动。角色移动限
27、制脚本核心代码如下图3-1所示: 图3-1 角色移动限制脚本 3.1.2 角色视角限制 在本嬉戏中,角色的的视觉限制完全由鼠标完成,运用鼠标限制玩家前进的方向以及瞄准火源等操作。同时,与上文3.1.1同理,本嬉戏开发运用的视角限制代码也是Unity3D嬉戏开发引擎自带的MouseLook脚本。角色视角限制脚本核心代码如下图3-2所示: 图3-2 角色视角限制脚本 3.1.3 鼠标锁定与解锁 考虑到玩家有时候须要运用鼠标对嬉戏的设置进行操作,而鼠标又是角色视角的限制器,这时候就须要增加一个操作可以将鼠标解锁出来,使得玩家可以进行点击画面的设置UI,进入设置界面进行操作。首先定义一个Bool值为鼠
28、标的默认状态,再运用if语句检测玩家的鼠标解锁操作,变更这个Bool值,使鼠标显示出来,当玩家操作完成之后,再将此Bool值改回默认值,隐藏鼠标。3.2火焰效果模块 3.2.1 火焰部署 在嬉戏中,我们须要布置大量的火焰粒子,用以呈现火灾的效果,但并不只是简洁将火焰粒子拖放至嬉戏场景当中,这样子我们只能看到粒子效果而无法检测到粒子效果,因此我们须要运用一些方法使其能够被检测到。在本次课题探讨开发的嬉戏当中,我们先创建一个Cube,然后依据我们所需部署火焰的场景位置变更它的形态大小,然后将我们所须要运用的火焰粒子添加至Cube当中作为其子类,再将Cube的Layer层修改为我们相对应灭火器检测的
29、层,例如是用水灭的火焰层就选择成“WaterColl”,为下文3.3.1中灭火功能实现检测火焰作为铺垫,然后取消勾选Cube的Mesh Renderer用以实现隐藏,最终在父类上添加下文3.3.1中灭火功能用以实现“灭火”效果的代码即可。这样一来,我们能够被检测到的火焰就完成了,再拖放至场景中部署即可。部署效果如下图3-3所示: 图3-3 将Cube部署在场景中 3.2.2 灭火功能实现 在现实生活中,消防员实现熄灭火焰,无非就是运用能够灭火的物质,将其浇到火焰之上使之熄灭。同理,在嬉戏当中亦是如此,我们运用水粒子效果“浇”到火焰粒子效果上使火焰粒子效果渐渐消逝从而达到灭火效果的实现。在这里实
30、现灭火效果功能的方法有两种,第一种是粒子碰撞器,运用水粒子去触碰火粒子,再通过C#脚本编辑模块调用C#脚本去限制火焰粒子的生命周期或其他参数渐渐减小至0而实现灭火效果。其次种是通过射线碰撞检测玩家点击的物体是否为火焰粒子,假如是则通过C#脚本编辑模块调用C#脚本去限制火焰粒子的其中一个属性参数渐渐减小至0而实现灭火效果,假如玩家点击的不是火焰粒子,则不做任何操作。在第一种方法当中,运用粒子碰撞器会造成机器性能的大大损耗,而其次种方法则可以避开这种状况的发生。在本次课题探讨开发的嬉戏当中,从嬉戏项目性能优化方面考虑,我们将选择其次种方法,以此来减小嬉戏对机器性能的损耗。在嬉戏中玩家实现灭火效果,
31、须要将鼠标准心指向火焰,其次是按下鼠标左键放射灭火剂击中火焰,最终灭火剂“浇灭”火焰。因此在本次课题探讨开发的嬉戏中实现灭火的功能设计如下: (1)粒子效果的限制:在嬉戏中实现灭火,其实就相当于让这个火焰粒子效果“消逝”,而做到让这个粒子效果消逝,我们可以修改粒子效果中的一些属性参数,例如“Start Lifetime”、“Simulation Speed”以及“Max Particles”,而在本嬉戏中,我们选择修改的粒子效果属性是“Max Particles”。首先创建一个C#脚本命名为FirePoint,用以限制嬉戏中部署的火焰粒子,运用ParticleSystem方法定义一个数组Par
32、ticalArr用以管理粒子数组,其次再定义一个int值ReduceRate用以限制粒子减小的速率,最终运用结合时间差值与粒子减小速率的乘积Time.time * ReduceRate来限制粒子效果中“Max Particles”的改变。详细效果实现代码FirePoint如下: /获得粒子数组 public ParticleSystem ParticalArr; /火焰粒子减小速率 public int ReduceRate = 3; private void Start() private void Update() /当准心指向火焰时,火焰起先渐渐减小 public void Reduce
33、Scale() ParticalArr0.maxParticles -= (int)(Time.time * ReduceRate); (2)运用射线碰撞检测+LayerMask调用FirePoint脚本限制火焰粒子:我们放射一条射线,当射线碰撞到的物体的Layer层是我们设定好的目标Layer层时,调用一系列C#脚本进行操作。在本嬉戏当中,我们是这样实现的:首先我们已经对部署的火焰设定好了相对应的Layer层,我们运用Camera.main.ScreenPointToRay方法从屏幕中心往鼠标指向的方向放射一条射线,用来进行碰撞检测;再定义一个int变量layerMask,用来过滤我们不须要
34、的Layer层;当以上打算完成后,我们就可以运用Physics.Raycast方法去获得碰撞物体,返回值设定为bool类型,当射线投射与任何碰撞器交叉时为真,否则为假。详细效果实现代码如下: /过滤不必要的物体,只获得须要灭火的物体发生碰撞 int layerMask = 1<< LayerMask.NameToLayer(“WaterColl“); /从屏幕中心放射射线 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); /获得从屏幕中心射出的射线是否遇到东西 if (Physics.Raycast(ray,o
35、ut hit,30f,layerMask) /假如点中了火焰,就获得FirePoint组件 if (!hit.collider.gameObject.GetComponent<FirePoint>() /假如找不到就去他的父类找 CurFirePoint = hit.collider.transform.parent.gameObject.GetComponent<FirePoint>(); /假如有就干脆获得FirePoint else CurFirePoint = hit.collider.gameObject.GetComponent<FirePoint&g
36、t;(); /找到组件之后起先调用FirePoint的ReduceScale函数进行灭火 CurFirePoint.ReduceScale(); /查看射线方向 Debug.DrawRay(ray.origin, ray.direction); 3.3 烟雾效果模块 在本次课题探讨开发的嬉戏当中,烟雾效果主要有两种,第一种烟雾效果是着火的物体熄灭之后会冒出肯定的烟雾;其次种烟雾效果是模拟在空气流通性差的空间内充斥大量因燃烧而产生的烟雾。前者我们可以运用粒子效果实现,而后者我们则可以运用Unity3D嬉戏开发引擎中自带的FogLight来实现。第一种烟雾实现比较简洁,运用if语句推断当前火焰粒子
37、的Max Particles是否为0即可,假定检测到Max Particles值已经减小至0,那么就开启烟雾效果。当Max Particles值不为0时,则烟雾粒子效果默认关闭。实现代码如下: foreach (var item in ParticalArr) item.maxParticles -= (int)(Time.time * ReduceRate); /当maxParticles等于0的时候开启烟雾粒子 if (item.maxParticles = 0) f (Fog != null) ; Fog.SetActive(true); 其次种烟雾效果实现过程则比较繁琐,首先我们实现这
38、个效果须要一个碰撞检测,检测当玩家身处于一个特定的区域时,应当开启烟雾效果,用以降低玩家可见度,提高嬉戏的真实性。碰撞检测我们可以运用OnTriggerEnter()方法与OnTriggerExit()方法实现,实现该方法有三个前提条件,第一个条件是两个物体都必需有碰撞器Collider组件;其次个条件是其中一个物体的碰撞器Collider组件的isTrigger属性必需勾上;第三个条件也是最重要的一个条件,其中一个物体必需带有刚体Rigidbody组件,而且这个物体还是发生碰撞的主体。不满意这三个条件,就无法触发这两个方法。得出详细实现方法如下: (1)首先创建一个Cube,变更其大小使之与
39、我们要进入的建筑差不多大小,其次关闭Cube的Mesh Renderer,勾选其isTrigger属性。因为玩家身上已经拥有了刚体Rigidbody组件,且玩家是发生碰撞的主体,因此该Cube不须要添加刚体Rigidbody组件。该Cube属性如下图3-4所示: 图3-4 Cube的属性 (2)在Cube上有一个Box Collider碰撞器组件,在玩家身上有Character Controller碰撞器组件,假如检测到玩家身上的碰撞器进入了该Cube的碰撞器,则调用OnTriggerEnter()方法,假如检测到玩家身上的碰撞器停止接触该Cube的碰撞器,则调用OnTriggerExit()
40、方法。在这两个方法中运用if语句推断玩家接触的触发器是否为我们提前设定好的触发器,假如是,则开启FogLight,假如不是则不做反应。当玩家停止接触触发器,则关闭FogLight。详细实现代码如下: /玩家进入触发器 private void OnTriggerEnter(Collider hit) /碰撞的是设定好的Fog触发器 if (hit.gameObject = fog) RenderSettings.fog = true; /玩家停止接触触发器 private void OnTriggerExit(Collider hit) if (hit.gameObject = fog) Re
41、nderSettings.fog = false; FogLight效果开启后如下图3-5所示: 图3-5 开启FogLight (3)在Unity3D嬉戏开发引擎中自带的FogLight中,Fog雾有三种模式,分别是Linear线性模式、Exponential指数模式以及Exponential Squared指数平方模式。在经过三种模式比较测试之后,最终选择了运用Exponential指数模式,该模式有Density参数表示雾的浓度,数值越大表示雾越浓。经过多次测试之后,最终选定Fog的Density参数值为0.05,Fog颜色选择134/134/134/255。关于Fog的参数设置如下图3
42、-6所示: 图3-6 Fog参数设置 3.4 灭火器模块 3.4.1 灭火器模型设置 在本次课题探讨开发的嬉戏当中,玩家接触的灭火器总共有4种,分别为水基灭火器、干粉灭火器、泡沫灭火器以及二氧化碳灭火器。将运用3ds MAX软件做好的灭火器模型导入Unity中后,我们须要为其添加刚体Rigidbody组件与碰撞体Mesh Collider 组件,使其存在物理效果,其次是将4种灭火器的Tag修改为不同灭火器的专属Tag,以能够实现下文3.4.4中的功能。二氧化碳灭火器属性图如下图3-6所示: 图3-6 二氧化碳灭火器属性 3.4.2灭火器放射灭火剂功能实现 在现实生活里,灭火器在正常状况都不会自
43、己放射灭火剂,须要人为的进行一系列操作:拉掉保险丝,对准火源,按下压把,放射灭火剂。我们在嬉戏中也要实现这点,不能说拿起灭火器它就会自动放射灭火剂,那样子违反了现实,也不符合其次章嬉戏需求分析中所追求的真实感。因此,在本次课题探讨开发的嬉戏当中,我们运用鼠标来仿照人的手,点击和松开鼠标左键来仿照人按下消防器压把和松开消防器压把。首先我们创建一个用以实现开火的脚本,将其挂至我们在场景中放置的灭火剂粒子效果当中,在Start()方法中,默认关闭当前粒子效果,其次在Update()方法当中,运用if语句检测鼠标的输入,当检测到按下鼠标左键时,运用ParticleSystem中的GetComponen
44、t<ParticleSystem>()方法打开粒子效果;当检测到松开鼠标左键时,同理运用该方法关闭粒子效果。详细实现代码如下: void Start() /默认关闭 Water.gameObject.GetComponent<ParticleSystem>().Stop(); void Update() /按下鼠标左键 if (Input.GetMouseButton(0) Water.gameObject.GetComponent<ParticleSystem>().Play(); /松开鼠标左键 if (Input.GetMouseButtonUp(0)
45、 Water.gameObject.GetComponent<ParticleSystem>().Stop(); 3.4.3 多种类灭火器问题 在现实生活中我们都知道灭火器不止一种,许多时候眼前的灭火器并不肯定适用灭眼前的火情,不同种类的火源须要用到不同种类的灭火器,因此为了提高玩家对嬉戏真实性的感受,我们必需在嬉戏中体现出这一点:不一样的火情须要用相对应的灭火器才能解决。在本次课题探讨开发的嬉戏当中,灭火器的种类有4种,在进行拾取操作的时候很可能会因为灭火器参数定位错误而导致无法拾取,又或者在灭火的时候因为灭火器参数定位错误导致无法灭火。因此,我们在这里选择运用Unity3D嬉戏
46、开发引擎中自带的枚举类型enum进行操作。当一个嬉戏拥有多种可能状态的时候,枚举enum是一种对我们非常有帮助的工具,它可以增加C#脚本的精确性,以此来削减嬉戏的运算损耗。首先声明一个enum类,用来存放全部的灭火器种类,再定义一个值用以存放灭火器种类。在嬉戏起先时,玩家手中是没有灭火器的,所以灭火器的默认种类定义为None,此时是无法进行放射灭火剂操作,也无法进行灭火操作。在上文3.4.1中,已经说明每一种灭火器都有之相对应的Tag,所以当玩家进行拾取操作时,系统会识别这个灭火器的Tag,我们再依据这个Tag将存放在enum中相对应的灭火器种类给予它。当这个灭火器拥有种类识别之后,再加上上文
47、3.2.2中的灭火功能,我们就可以实现不同的火情须要运用相对应种类的灭火器才能解决,否则无法灭掉火源。在上文的灭火功能实现脚本当中,运用if语句来推断当前火源是否与灭火器种类相同即可。 图3-8 依据拾取的灭火器Tag给予灭火器相对应的种类 图3-7 推断火源种类是否与灭火器种类相同 3.4.4 灭火器拾取与放下功能实现 在上述实现的功能当中,我们在鼠标上已经定义了视角限制以及鼠标左键限制灭火器开火功能,接着在鼠标上添加拾取灭火器的功能的话可能会造胜利能混乱,因此我们运用键盘输入来实现灭火器的拾取与放下。运用F键拾取灭火器,运用G键放下灭火器。 在嬉戏中,我们拾取一件物品拿在手中,可以想象成把
48、一件物品固定在我们的视角范围内,当我们按下拾取键时,我们让要拾取的物品在我们面前隐藏起来,同时在我们的摄像机前方固定位置生成一个要拾取物品的复制体,形成拿在手中的感觉;同理反过来,当我们按下放下键的时候,我们就让在摄像机前方固定的物品复制体隐藏起来,然后在我们面前重新生成这个物体。这样一来就实现了拾取与放下的效果,详细实现方法如下。首先在摄像机前方摆放好灭火器的复制体,再关闭其Mesh Renderer,实现隐藏。然后运用射线检测鼠标所指位置是否存在物体,假如存在物体,则运用gameObject.CompareTag()方法检测物体的Tag是否为我们要拾取物品的Tag,假如是,则关闭该物体的Mesh Renderer,将其隐藏起来,同时打开之前摆放好的灭火器复制体的Mesh Renderer,让其出现,最终将灭火器的种类给予它,实现将灭火器拾取拿在手上的效果,再运用if语句通过检测灭火器