版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于Unity3d的驾驶模拟器的设计与实现ResearchandimplementationofdrivingsimulatorbasedonUnity3d内容摘要□□随着近年来电竞业与游戏业的逐渐成熟以及规范化,游戏的受欢迎程度也是越来越高。游戏已经成为了相当一部分人在繁忙的工作学习中获得放松的最主要的途径。从2D到3D游戏,游戏画面变得越来越真实,使玩家能够在玩游戏时做到身临其境,不仅从游戏中获得快乐,甚至能得到对生活有用的知识。Unity3d是一款十分成熟的游戏开发软件。经过多年的改进与发展,Unity3d一直占据着游戏开发的市场中占有一席之地。本次课题以Unity3d为游戏开发引擎编写3D模拟驾驶类游戏,借助了NWHVehiclePhysics插件进行汽车物理系统的开发,玩家将会的到较为真实的驾驶手感体验。本课题旨在实践中学习游戏制作的基本方法,探索设计游戏的基本思路。玩家需要通过键盘控制汽车,在模拟的城市场景中遵守系统设置好的交通规则,避免发生碰撞,在整个游戏过程中,玩家会在路上遇到堵车甚至撞车等路况,可以从中体验到真实的驾驶体验。该驾驶模拟器有着较高的自由度,玩家可以通过探索来发现更多的乐趣。□关键词:Unity3d驾驶模拟交通规则Abstract□Withthegradualmaturityandstandardizationofcallcompetitionandgameindustryinrecentyears,thepopularityofgamesisalsoincreasing.Gameshavebecomethemostimportantwayforaconsiderablenumberofpeopletorelaxintheirbusyworkandstudy.From2Dto3Dgames,thegamepicturebecomesmoreandmorereal,sothatplayerscanplaythegameinrealtime,notonlygetpleasurefromthegame,butalsogetusefulknowledgeforlife.Unity3disaverymaturegamedevelopmentsoftware.Afteryearsofimprovementanddevelopment,unity3dhasbeenoccupyingaplaceinthegamedevelopmentmarket.Inthisproject,unity3disusedasthegamedevelopmentenginetowrite3Dsimulationdrivinggames,andNWHvehiclephysicsplug-inisusedtodevelopthevehiclephysicalsystem,sothattheplayerswillhaveamorerealdrivingexperience.Thistopicaimstolearnthebasicmethodsofgamemakinginpracticeandexplorethebasicideasofgamedesign.Theplayerneedstocontrolthecarthroughthekeyboard,abidebythetrafficrulessetbythesysteminthesimulatedurbanscene,andavoidcollision.Inthewholeprocessofthegame,theplayerwillencountertrafficjamsorevencrashesontheroad,fromwhichhecanexperiencetherealdrivingexperience.Thedrivingsimulatorhasahighdegreeoffreedom,playerscanfindmorefunthroughexploration.□□Keywords:Unity3dDrivingsimulatorTrafficrule目录第一章绪论………………11.1选题的目的及意义……………………11.2研究现状………………11.2.1市场状况………11.2.2研究内容…………21.3章节安排……………2第二章Unity引擎与插件使用说明…………32.1游戏引擎介绍………32.2Unity3d常用组件……………………32.3物理引擎……………32.4Unity引擎的常用函数……………42.5UI组件……………52.6插件…………………5第三章游戏设计介绍………63.1场景设计…………63.1.1地形的绘制……………………63.1.2场景的绘制……………………73.2建筑物设计………73.3游戏UI设计………73.3.1图形用户界面……………………83.3.2仪表盘设计……………………93.3.3后视镜UI设计……………………93.3.4小地图设计……………………103.4灯光的设计………103.5游戏按键设置………11第四章汽车参数的设置与说明……………134.1汽车的设计………134.1.1设置WC3D………144.1.2声音……………154.1.3滑痕……………164.1.4灯………………164.1.5损害……………184.1.6翻转…………194.1.7地面类型探测……………………194.2具体功能实现………194.2.1汽车移动脚本……………………194.2.2质心………………204.2.3下压力……………224.3UTSPRO……………224.4碰撞检测……………244.5镜头切换……………254.6角色管理器……………274.7档位…………………284.8Vehiclechanger脚本……………29第五章.游戏测试……………315.1设备环境……………315.2游戏运行结果………315.3测试结果分析………32第六章.展望与总结………33参考文献………………………34致谢…………35广东东软学院本科毕业设计(论文)绪论1.1选题的目的及意义随着计算机科学技术突飞猛进的发展,游戏行业也被带动得风生水起。从最早的红白机系列再到稍早的主机时代,之后更是在PC端大放异彩,现在甚至我们可以在移动端玩上一些跨平台移植过来的3A大作。在这种的大环境下,游戏业也是来到了一个良性循环,越来越多的公司会将资金投入到游戏的创作与研发当中,这也使游戏市场的竞争越发激烈。随着VR和5G的到来,为了抢占市场份额,游戏公司也加大力度开发各种新颖的游戏,而Unity3D这款灵活多变可供多平台的游戏开发引擎,受众非常广泛。Unity3D是由UnityTechnologies开发的一款游戏引擎,【1】它也是3D游戏开发中的佼佼者。3D游戏作为目前主流的游戏类型,游戏的空间感和立体感会比2D游戏更强,而游戏的适应性以及娱乐性则会比尚未成熟的VR游戏更加强。简单来说,3D游戏就是三维游戏,它的实质是利用光线和阴影的变化通过平面来体现纵深感,使玩家能对物体产生长宽高的感觉,从而达到具有立体感的3D游戏的效果[2]。在众多的游戏种类中,模拟游戏是一个比较广泛的、接近生活的类型。玩家可以通过模拟类游戏去体验游戏设计者所设计出的世界,一个与现实世界相似却不相同的游戏世界。仿真程度越高,意味着游戏更贴近现实,一些生活中无法遇到的状况就可以通过游戏(也可以说是模拟器)进行模拟,目前在研究方面,许多的物理现象都需要通过模拟器的帮助进行研究。退一步来说,对于平民百姓,模拟类游戏也可以对生活中无法遇到的事情进行模拟,使玩家能够从中获取到生活中没有的经验与知识。模拟类游戏正是一种可以为社会带来贡献的交互式游戏体验。本次课题也是从模拟类游戏出发,通过Unity3D这个功能强大、具有高度的跨平台适应性的游戏引擎,来制作一款模拟类的驾驶游戏[3]。1.2研究现状1.2.1市场状况电脑游戏作为电脑的软件,在技术方面的发展与革新都需要电脑硬件的支持。其中最重要的硬件就是显卡。从九十年代末的VOODOO显卡发展到如今的RTX2080,游戏也从马赛克画质的发展到当今以假乱真的游戏画面。从《DOOM》到《CS》到《使命召唤》、从《魔兽争霸》到《英雄联盟》,各种类型的游戏在业界人士的努力下逐渐丰富。早年间中国由于缺乏核心技术,并没有过多自主开发的游戏,而是通过代理引进为主。虽然很多媒体吹嘘中国是在80年代接触各类游戏,但其实那都是港澳地区的盗版游戏,而中国大陆则是在90年代开始引进各类游戏。因为当时几乎没有关于游戏行业的政策,宽松的政策促使游戏市场快速增长。到了1996年,远在大洋彼岸的欧美游戏公司也参与到了这种新兴行业当中,其中就有EA与育碧两间著名的游戏公司,这第一批入驻的欧美游戏公司也对中国的游戏行业带来深远的影响。到了20世纪出,正版光盘游戏由于高昂的价格以及当时国内将游戏称之为“电子海洛因”而并没有取得很好的成绩。到了2003年,我国首款自主研发的3D游戏出现,然而起步较晚的国产3D游戏从设计理念到研发制造,都与国外先进的游戏有着明显的差距。不过近年来,得益于国家政策的扶持以及技术的发展,3D游戏在我国得以迅速发展。在如今的游戏市场中,FPS与MOBA类一直占据了主要地位,模拟类游戏则作为比较小众的类型存在。相比这两种类型的游戏,模拟现实的游戏会有真实世界的物理系统,会有更加贴近现实的场景。不过近年来,这类游戏由于仿真度越来越高,并且在具有一定趣味性的情况下也收获了不少忠实的玩家,其中比较有名的就有《欧洲卡车》系列游戏[4]。1.2.2研究内容这些年来,随着群众生活水平的提高a驾驶作为一项社会基本技能,目前在中国有接近4亿人拥有驾照,然而现在的驾校为了应付考试,并不会对学员进行过多实际路况的教学,因此,有一部分新学员拿到驾照后其实还不是真正意义的学会了驾驶。模拟驾驶游戏能引领用户体验驾驶操作技能并熟悉一些在路上基本的交通规则,力求还原真实场景,并对玩家体验驾驶起到帮助。尤其是青少年用户,通过简单的操作、以游戏的模式进行模拟驾驶能够使驾驶的知识更加深入人心。根据这个要求,游戏主要通过碰撞检测来实现交通规则的检测,第一人称视角的驾驶也会让玩家更加融入游戏当中。1.3章节安排本文主要围绕一款以Unity3d为开发引擎所开发的驾驶模拟类游戏,从理论到实践,共分为六章。第一章为绪论,主要介绍了选题的目的及意义、研究背景与游戏市场现状以及游戏所涉及的内容。第二章将会简要的介绍选题的研发当中所需要使用到的平台、软件、插件。第三章将会对游戏设计内容的具体事项进行分析,明确游戏各个部分。第四章将会对游戏功能的具体实现过程进行分析,主要为脚本内容的分析。第五章将对游戏进行测试,打包封装。第六章为结论与展望。Unity引擎与插件的使用说明2.1游戏引擎介绍游戏引擎即游戏的软件框架,是为了设计游戏而专门开发出的软件框架,用户从中得到了开发游戏所需的基本功能。它的作用就等于基础设施,使用者则需要利用基础的框架实现更为复杂的产品。在这种模式下制造游戏的效率会大大地提高,但是这种便利也会带来相应的缺陷,但是对于开发者来说自由度也会相应减弱,不利于做出具有突破性的作品。Unity3d引擎由UnityTechnologies于2005年推出,[8]是一款在当下炙手可热的游戏开发工具,为使用者提供了非常完美的跨平台系统以及交互良好的操作界面。它的编程语言主要是C#(少部分使用Javascript),它的功能十分完善,从小型独立游戏,到千万级的3A大作,Unity都能支持制作,并有很好的效果。2.2Unity3d常用组件·GameObject:场景中所有的实体都为GameObject类。·Transform:用于控制和储存对象的位置,旋转,缩放,及控制游戏对象的父子关系。·Rigidbody:用于物理引擎控制,刚体组件会对作用力作出符合物理规律的反应。·Collider:定义了物体的物理性状,可在一个对象中挂载多个碰撞体达到更真实的效果。·Meshrenderer:网格渲染器可以使个体在场景变得可见、呈现渲染后的效果,也可以为其添加材质。·NavMeshAgent:用于AI的移动,避开障碍物。2.3物理引擎早期游戏并没有过多注意物理引擎的作用,当时几乎所有游戏,都通过极简的计算方式得出对应的结果从而体现出物理效果,比较有名的游戏为马里奥和索尼克等。当时的物理效果也仅仅是与墙壁相关的碰撞。
当2D游戏逐渐演变成3D时代后,物理效果的表现方式也发展迅速,三维的表现力大大地增加了游戏发展的可能性,使游戏种类向多方向发展[11]。Unity采用了英伟达的Physx物理引擎,这是一款目前广泛应用在各大游戏当中的热门物理引擎。如今的开发者只需要将参数设置好就可以通过物理引擎高效、拟真地模拟各种各样的物理效果,得到真实生动的游戏画面。在Unity3D驾驶游戏当中,物理引擎是整个游戏的核心,它主要包括了刚体、碰撞、物理材质等。游戏中物理引擎的作用是模拟场景中的物体相互碰撞作用。对于成熟的物理引擎,实现物体之间相互影响的效果是相当简单的。2.4Unity引擎的常用函数Unity3d作为一个高度集成的引擎,在实现很多功能之时,Unity所提供的函数就可以很好地完成。在本次的游戏开发中将会使用当不限于以下常用函数。[3]Awake:初始化函数,在脚本实例化的时候自动进行调用,只会在脚本的生命周期中调用一次。一般用于各个组件之间添加引用关系。Start:初始化函数,在对象被第一次enable之后,在Update之前,Awake之后被调用。在生命周期中也只会调用一次。一般用于富裕变量值。Update:每运行完一次会再一次调用,跟游戏帧率相关。一般用于普通的数值监测亦或是按键输入后执行动作的触发点。FixedUpdate:每隔一定的时间调用(取决于游戏设置的每秒刷新次数),不会受到游戏帧率影响。常用于物理引擎的调用,以及需要固定时间更新的函数。当碰撞发生时,挂载在物体上的脚本中被定义到的函数,都会通过物理引擎进行调用。OnTriggerEnter:函数会在第一次碰撞检测后调用,执行一次函数内的内容,用于判定物体触碰到角色。OnTriggerStay:函数会在持续碰撞的过程中多次被调用,一直函数内的内容。OnTriggerExit:表示碰撞事件结束了,用于物体离开碰撞体。2.5UI组件事件触发器组件:事件触发器是一个将Unity所有UI交互需要用到的触发功能都集合在了一起的组件。它包含了所有UI交互的相关功能,用户可以通过编辑界面,将交互功能进行定义。通过回调内容驱动,在无需操作的时候就可以不占用计算机的资源。并且可以分配多个函数到单一事件[8]。IEventSystemHandler(事件处理程序)事件触发器的作用是识别用户的输入,是Unity的事件处理程序的功能。在代码中添加动态的按钮的事件需要通过代码上的接口。它具有以下特性:1、通过Interface接口添加事件功能。2、需要得到挂载了IEventSystemHandler类型的脚本的显示组件的支持。3、支持自定义事件监听器[8]。2.6插件NWHVehiclePhysics是一款包含多种车辆的预制件的Unity物理插件,包括:跑车、轿车、公交车等。每部车都具有真实且不一样的操作手感以及模型细节和空气动力套件。车辆部件包括了驾驶辅助系统、发动机、传动装置、油箱等。发动机的参数与现实是一样的,具有动力、扭矩及功率,这些都可以在脚本中进行调节,而变速箱则有自动挡和手动挡两种类型,也可以在脚本中选择是否勾选手动挡的选项。NWHVehiclePhysics插件还包含了全车照明系统,近光灯、远光灯、停车灯、刹车灯和转向灯,这些在现实当中出现的汽车灯光都会在游戏中得到还原。驾驶辅助装置则包括了巡航控制系统、TCS牵引力控制系统、ABS防抱死装置和漂移辅助系统。车内还具有仪表盘与指示灯等仪器,能够模拟仪表盘的真实效果。在音效方面,这款插件提供了多种汽车运行过程中所需要的音效,方便用户的使用。最重要的一点是车辆在碰撞后收到损害并根据受损程度作出物理效果的变化,并且自带了刹车印、尾气、灰尘等粒子效果。NWHVehiclePhysics插件定义了车轮碰撞器WheelController3D,它可以检测3D地面,这个功能会将地形的纹理材质检测出来,因此通过不同的材质会得到不同的摩擦阻力曲线。Urbantrafficsystem,简称(UTSPRO)是一款模拟真实交通系统的软件,为用户提供了多种交通工具以及人物的巡航。第三章游戏设计介绍3.1场景设计游戏主体总共包含了3个场景,一个是UI界面的场景,一个是选择界面的场景,另一个则是游戏的主体城市场景。3.1.1地形的绘制主体场景包括作为gameobject的场景内物体与地形,首先制作的则是游戏的地形:,在Hierarchy面板中Create->3DObject->Terrain便可以创建一个平面。创建后可以在右侧Inspector面板中调整Terrain平面的各种参数,首先点击paintterrain,点击setheight,在Height里输入一个数值,然后点击flatten,这样平面抬高,否则将无法绘制凹陷地形。做好了这一步就可以正式开始地形的绘制,通过下拉菜单,可以轻松地对地形分别进行抬高降低、绘制贴图、添加树木和植被等操作。从而得到想要的地形。图3-1地形下拉菜单图3-2地形图3-3游戏场景图3.1.2场景的绘制地形建好后,即可在地形上添加各种游戏物体,完成游戏场景的建立。3.2建筑物设计主场景作为一个城市场景,建筑物的引入是必不可少的,当我们引入了一定数量的建筑物后,将会对性能的要求,为了尽可能地节省电脑资源,在制作过程中将会使用到AutoLOD组件。通过设置摄像机的远裁剪面减少游戏场景内物体的渲染程度,LOD算法将很好地解决上述问题,在虚拟场景当中,出于显示效果的需要,有时候不一定可以将每个建筑物简化进行减面处理,这时候AutoLOD就能很好地应对这个问题。LOD全称LevelOfDetails,中文为多细节层次。在游戏场景中,模型被渲染的顺序取决于摄像机到物体对象的远近。距离较近时,高精度模型将会被显示,距离较远的时候则会显示低精度的模型。Unity会根据需要自动调整显示的模型种类。3-4LODGroup组件3.3游戏UI设计游戏的主界面设计:当一进入游戏,就将会跳转到开始界面,在该界面中你可以看到上面写有游戏名称,在右上方有一个游戏的标志,依次往下的是声音选项按钮,点击后会进入声音面板。最下面的是退出游戏按钮。3-5游戏主界面游戏界面主要采用了Unity自带的UI插件UGUI,在整个开发过程中会用到一些组件:·button组件:按钮组件,通过添加点击事件进行交互·panel组件:作为存放其他组件的容器,添加image后可用于背景显示·image组件:用来存放图片,一般用于logo或者按钮的背景·text组件:用来显示文本信息·slider组件:滑动条组件,滑动条有一个数值,通过滑动事件同步数值可调节音量大小等属性。3.3.1图形用户界面Dash图形用户界面控制器DashGUI控制器脚本用于控制车辆的仪表板和仪表板灯-无论是在车内还是在HUD上。可设置模拟和数字速度和转速计,以及转向灯、指示灯、驾驶辅助和检查发动机指示灯。可根据需要进行调整。模拟量表控制模拟仪表。下列字段可用:•MaxValue–指针结束时的值。•StartAngle–指针在最低值时的角度。在播放模式下调整此值的选项。•EndAngle–指针在最高值时的角度。在播放模式下调整此值的选项。•Needlesmoothing-平滑指针的行程,使其在有质量和阻力的情况下变为无行动力的,•LockatStart/End–在播放模式下将指针锁定在开始或结束角度。要调整打捆针行程,您可以进入播放模式并勾选其中一个锁选项。当指针在开始或结束时锁定时,调整开始或结束角度,直到针头应该在起始位置。确保指针正确地围绕中心旋转。3-6仪表盘与指针3.3.2仪表盘仪表盘指针转动脚本:通过起始角与结束角计算偏移位置,使用Mathf.Lerp线性插值函数在仪表盘的最大值与最小值两个向量中进行Vector3.Lerp的插值。指针将随着汽车速度的变化而转动。3-7仪表盘指针偏转代码3.3.3后视镜UI设计由于在第一人称视角当中转移镜头观看两侧后视镜不便于操作,显示效果也不理想。所以这次将倒后镜转化成贴图UI放在屏幕的两侧。制作方法如下:首先在项目中新建一个“RenderTexture”与”rawimage”并命名为”leftmirror”,然后将“leftmirror”,赋予本身设置好的后视镜的“TargetTexture”当中,同样操作到“rawimage”当中,渲染后将会在rawimage当中里出现camera所呈现的对象。重复一次操作,即可得到另一侧的后视镜。3-8投影到rawimage的后视镜3.3.4小地图的设计小地图的设计与后视镜的设计同理,只需将镜头拉得足够远并在其中添加一个立方体,立方作为汽车的子物体,通过reset位置让自身位于汽车的正上方,汽车移动的同时,也会随之移动,使视觉效果看起来更好[15]。3-9小地图3.4灯光的设计游戏的灯光主要包括自然场景中的太阳光(使用directionallight),以及建筑物的灯光。既然作为自然场景,那么当然会有昼夜更替。进入游戏后,将会定义到一个随机时间也就是太阳会在随机的高度,然后加入旋转脚本让太阳以一定速度旋转,从而模仿太阳的自转。最后还给太阳加上的光晕,达到更加真实的效果。实现逻辑如下:publicclasssunMove:MonoBehaviour{
publicfloatspeed=0.1f;
privateintdegree;
voidStart()
{
degree=Random.Range(0,360);
gameObject.transform.Rotate(degree,0,0);*//把方向光(太阳)这个物体的初始角度(X轴)设置成刚才随机生成的degree//*
}
voidUpdate()
{
gameObject.transform.Rotate(-speed*Time.deltaTime,0,0);
}}变量speed是太阳的旋转速度,变量degree是太阳初始的角度。speed与degree两个变量分别为太阳绕地图旋转的速度及太阳起始的角度。在start函数中,初始角度将被设置为0~360度的一个随机数,update方法里,每一帧按speed的速度改变太阳的角度,实现太阳旋转的效果。通过上述代码即可达到太阳围绕场景进行自转的效果,为了使效果更加真实,我们可以将flare光晕效果添加到光线(directionlight)当中。当到达某个角度后,可以定义一个bool值,用于场景的灯光开关。3-10太阳光3.5游戏操作设计前进W/方向键上后退S/方向键下左转A/方向键左右转D/方向键右手刹space点火/熄火E升档(需设置手动挡)R降档(需设置手动挡)F近光灯L远光灯K左转向灯Z右转向灯X镜头切换C上车/下车V升档R降档F一些按键的实现如下列代码所示:4-11按键实现代码第四章游戏功能的实现4.1汽车的设计作为一款能够模拟汽车物理效果的插件,NWHVehiclePhysics提供了一些参数,这些参数可以更好地模拟出物理效果。以下将会讲解这些参数以及如何设置。VehicleController脚本的结构通常为:4-1VehicleController脚本结构先导入汽车模型:将刚体添加到父对象,然后将质量设置为小型车的质量,大概为1500~1800。为子物体添加碰撞器。至少需要一个任意类型的碰撞体使刚体正常工作。设置好刚体后,需要创建车轮碰撞器。不要添加车轮碰撞器脚本到需要旋转的车轮对象中,创建车轮控制器对象的最简单方法是复制,然后删除来自副本的网格过滤器和网格渲染器对象。然后,将复制的对象移动到您想要的弹簧动程的顶部。最后,将控制盘控制器组件添加到所有重复的对象。结果应如下图所示,其中绿线表示弹簧动程。4-2弹簧动程检查是否已正确检测到车轮所在的一侧。中心轮不会自动检测。空字段将出现在车轮控制器检查器的底部,。将相应的控制盘可视化拖动到此字段。如果你的车轮目视检查车轮由多个零件(轮胎、轮辋、轮盘等)组成单个对象,确保轴保持在应有的位置。结果如下图:4-3WC3D碰撞体通过WC3D检查器调整车轮控制器半径和宽度,直到绿线适合轮子。之后设置忽略层。这是最重要的步骤之一,如果跳过这一步,车轮将会误检测到车辆本身为地面。创建一个新层,并对它进行命名,之后分配到整车的碰撞器。这样Body对象将会拥有碰撞体,并且它的层被设置为新的已创建层。你可以改变车轮操纵仪。运行游戏,完成上述操作,汽车悬架就会开始工作了4.1.1设置WC3D移除所有车轮碰撞器对象中的车轮碰撞器组件,并使用按钮添加WC3D控制器脚本。添加ParentObject以及WheelVisual对象。4-4WC3D设置在ScanIgnoreLayers中选择不与之碰撞的层,防止与车辆其他碰撞体发生碰撞,使汽车发生不规律的弹跳或震动。WC3D字段说明:Wheel(车轮)Sidethewheelison确定偏制方向TireRadius车轮总半径WheelWidth车轮宽度WheelMass车轮的质量RimOffset从中心到车轮的偏移量UseRimCollider选择使用模拟轮子上半部分的对撞机,以防止物体从侧面通过轮子Geometry(几何结构)CamberCurve动画曲线,x轴表示车轮经过范围,0表示车轮向上,弹簧压缩,1表示弹簧完全松开。Spring(弹簧)MaxSpringForce弹簧被完全压缩时所施加的力Spring弹力,弹簧从完全伸展到完全压缩所需的力SpringForceCurve弹簧力曲线,显示弹簧力沿曲线的分布Damper(阻尼器)BumpN/m/s表示弹簧压缩时每秒1米的弹簧速度所受的力,单位为牛顿Rebound表示弹簧伸展时每秒1米的弹簧速度所受的力,单位为牛顿DampingCurve阻尼曲线4.1.2声音声音部分包含了车辆声音效果相关的所有字段。每个区域仅影响脚本附加到的车辆。当场景开始时,音频源是由脚本生成的而非手动添加,每个声音组件都继承了SoundComponent的类,因此它们会有公共的字段:音量,音高和剪辑。一些声音组件还拥有附加字段,如音量或音高范围。它们的一般解释是:•Volume–音量。改变这个运行时通过车辆控制器检查器的值不一定更改音频源的音量,因为大多数声音组件都设置了音量和音高仅在创建音频源时(在开始时)。你仍然可以在运行时通过脚本或通过调整直接音频源,退出播放模式时不会保留该值。•Pitch–与音量相同,仅用于音高。•VolumeRange–可根据车辆声音部分的状态表示。•PitchRange–与音量范围相同,仅用于音高。•Clips–音频剪辑列表。取决于声音成分将使用剪辑(例如发动机怠速部件)或随机选择其中一个剪辑(如换档或碰撞部件)。如果可以使用多个剪辑。如果在组件上使用多个剪辑但仅支持一个,那么只有第一个会被使用。如果不指定剪辑(列表大小为0)声音组件将被关闭。4.1.3滑痕当车轮在坚硬表面上打滑时会产生打滑痕迹。当车轮打滑时,可以在车辆底部的“VehicleController”中的“General”下拉菜单中定义。其中最重要的是“持续性滑痕”选项。滑动标记的默认行为是删除最旧的skidmark。这是一种类似于贪吃蛇游戏的效果,在总长度上实现滑痕的长度是一样的。这个“轨迹”的长度可以通过更改每个部分的最大标记字段调整,如果永久选项被禁用,将保留标记最大数量的滑痕。如果每次滑痕数量达到每个部分的最大标记将生成一个新的skidmark对象,并生成旧的skidmark部分留下完整的痕迹。这样就不会删除旧的滑痕。随着时间的推移,视口中的三角形数将会增加,所以还有一个持续滑痕距离选项可以解决这个问题。当滑痕与车辆的距离创建它的值超出了这个值,skidmark将删除它自身。4.1.4灯所有灯光都继承自同一类,因此具有相同的字段。需要解释的选项有:•光源-可以是任何Unity灯光资源。主要用途是为近光灯和远光灯创建聚光灯。即使模型是没有单独灯光网格的低多边形也可以用于创建模型点光源做到例如对刹车灯的模仿。在下图中,点光源用于单网格交通工具,可模拟闪光灯:4-5车前灯如果需要使近光或远光聚光灯增加一些真实感,可以将附带的“前照灯Cookie”添加到它们中。•灯光网格渲染器–接受任何使用标准着色器的网格渲染器。当灯光打开时,材质球的发射属性将会启用。若要设置具有发射的网格,则需要勾选阴影选项中的发射选项,并对发射的颜色和强度进行调整。完成后,禁用发射属性。轻型网格渲染器可用于具有单独网格的车辆灯。它还可以用作基本形状灯光上的覆盖层。驾驶辅助装置提供以下驾驶辅助:•ABS–如果设置为1,则制动时车轮不会打滑。•TCS–如果设置为1,则加速时车轮不会打滑。•稳定性-通过增大当前摩擦力降低车辆的失控选择的倾向由起始于[0,0]并结束于[1,强度]的线性曲线形成的摩擦曲线,这意味着摩擦力会随着滑动而增大,也可以认为将其作为车轮控制器设置中的动态横向系数。可以用来获得更多的街机感觉的车辆。不会在低速时将网格计算在内。•漂移辅助–计算车辆前进方向和矢量之间的角度,根据角度值施加校正力,有效地限制漂移的角度,使其失控自转。较高的值将允许较少的漂移,而较低的值将会有更多的偏转。4-6驾驶辅助4.1.5损害勾选Damage选项后,车辆上的网格将变形。在车辆停止工作之前,可以调整的允许损坏数实际上是由碰撞引起的所有减速的总和。碰撞损伤取决于碰撞瞬间的减速,当车辆行驶得越快,碰撞之后停止得就越快,车辆得到的损伤数值就越大。1000损伤在此等于峰值减速度为1000m/s2的碰撞。发动机的能量会随着车辆收到越来越多的损害而减少,如果撞击发生在靠近车轮的位置,发动机会发出随机的声音,前提是车轮网格被标记。之后车轮会发生随机的偏移,使车辆变得不易操控。网格变形是撞击后的产物,是基于队列的。这意味着每帧只能变形有限数量的网格。可以通过更改“每帧变形顶点数”字段来调整此值。较高的值意味着在较少的帧中完成变形,而较低的值将在较高的帧数上完成变形,并且还会导致掉帧。将此值调的尽可能高将可以避免掉帧。变形半径、强度和随机性都会影响网格变形的方式——顶点可以从原始位置移动多少,在给定减速下移动多少,最终结果的随机性如何。将“随机性”(randomness)设定为0将导致最终网格平滑,将“随机性”(randomness)设定为高值将导致网格看起来有噪点。它只是一个减速阈值,超过此阈值,撞击将被视为实际撞击。减速阈值floatNWH.VehiclePhysics.DamageHandler.decelerationThreshold=30f触发伤害所需的减速幅度。变形半径floatNWH.VehiclePhysics.DamageHandler.deformationRadius=0.6英尺半径是将变形的顶点。变形随机性floatNWH.VehiclePhysics.DamageHandler.deformationRandomness=0.1f为网格变形添加噪波。0将生成平滑网格。变形强度floatNWH.VehiclePhysics.DamageHandler.deformationStrength=1.6英尺确定在给定碰撞强度下将变形多少顶点。变形垂直框架intNWH.VehiclePhysics.DamageHandler.deformationVerticesPerFrame=8000每帧将检查并最终变形的顶点数。启用boolNWH.VehiclePhysics.DamageHandler.enabled=错误确定是否使用损坏、网格变形和性能降级。性能分级boolNWH.VehiclePhysics.DamageHandler.PerformanceDegrading=错误损坏是否会影响车辆性能(转向、动力等)?先前碰撞散列intNWH.VehiclePhysics.DamageHandler.previousCollisionHash上次排队冲突的哈希值。防止对同一碰撞作出两次反应,因为在OnCollisionStay()以便收集更多数据。损坏浮动NWH.VehiclePhysics.DamageHandler.Damage[get],[set]当前车辆损坏。floatNWH.VehiclePhysics.DamageHandler.DamagePercent[获取]当前车辆损坏。允许损坏的百分比。主要代码如下:if(damage.previousCollisionHash!=collisionHash&&accelerationMagnitude>damage.decelerationThreshold){sound.crashComponent.Play(this);if(damage.enabled){damage.Damage+=accelerationMagnitude;damage.Enqueue(collision,accelerationMagnitude);}}4.1.6翻转勾选翻转后,当车辆在其侧面或车顶上超过时间时翻转车辆。不止可以设置时间,还能通过旋转的角度检测到车辆遭到翻转,即曲面法向和车辆变换的上方向之间的最小角度,到达角度后将激活翻转。最大检测速度用于确定翻车激活的最大速度,旋转速度是以度/秒为单位的速度,车辆将旋转回原本定义的方向。4.1.7地面类型探测地面检测是一个处理表面特定效果和声音以及表面特定摩擦设置的组件。地面检测是车辆的可选部分,在车辆控制器的检查器中不可见。与其他车辆设置不同,地面检测组件调整场景中所有车辆的设置,并且只存在一个地面检测组件(如果不想使用地面检测,则为0)。可以使用已经连接了地面组件的“车辆管理器”预制件以及其他有用组件,或者可以将地面检测组件添加到场景中的任何对象。如果场景中没有地面检测,表面效果和声音将不起作用,车辆将自动找到地面检测,无需指定。地面检测组件由灰尘和烟雾预制件两个字段组成。这些字段可以在预制件文件夹中找到,只是带有粒子发射器的游戏对象,启动时会添加到车轮对象中。通过使用地形splat地图数据或使用对象标记来检测曲面。每个曲面(沥青、砾石、沙子、草地等)都可以使用任意数量的splat贴图纹理索引和/或对象标记,其中splat贴图索引是“地形检查器”中的多个地形纹理。4.2具体功能实现4.2.1汽车移动脚本通过获取水平与垂直2个轴对汽车进行基本的移动将搜索WheelController组件的所有子对象并返回轴,每个轴都有2个车轮控制器,通过相对于父轴的Z位置配对。车轴将按顺序返回。这是键盘类的参数,返回值为一个数,符号代表方向。if(inputType==InputType.Standard){horizontal=Input.GetAxis("Horizontal");}else{horizontal=Mathf.Clamp(VehicleController.GetMouseHorizontal(),-1f,1f);}vehicleController.input.Horizontal=horizontal;if(inputType==InputType.Standard){if(verticalInputType==VerticalInputType.Standard){vertical=Input.GetAxisRaw("Vertical");}elseif(verticalInputType==VerticalInputType.ZeroToOne){vertical=(Mathf.Clamp01(Input.GetAxisRaw("Vertical"))-0.5f)*2f;}elseif(verticalInputType==VerticalInputType.Composite){floataccelerator=Mathf.Clamp01(Input.GetAxisRaw("Accelerator"));floatbrake=Mathf.Clamp01(Input.GetAxisRaw("Brake"));vertical=accelerator-brake;}}Vertical键盘按上或下键时触发
,Horizontal键盘按左或右键时触发
。也可以将2个轴绑定到其他需要的按键。4.2.2质心质心,顾名思义为质量的中心,作为wheelcollider的必须组件。如果勾选“ShowCOM”,并设置好刚体与碰撞器之后,我们将会看到一个绿色球体,由于汽车的大部分重量都在发动机、变速器和其他相当低的安装部件上,所以这个重心是不够的,需要调整。由于游戏中的载具为跑车,它的值需要变得更低,而对于其他车辆,则可以保持原样,也可以提高它。以下是脚本当中的主要代码:voidStart(){rb=GetComponent<Rigidbody>();centerOfMass=rb.centerOfMass;}voidUpdate(){if(centerOfMassOffset!=prevOffset){rb.centerOfMass=centerOfMass+centerOfMassOffset;}prevOffset=centerOfMassOffset;}privatevoidOnDrawGizmosSelected(){if(showCOM&&rb!=null){floatradius=0.1f;try{radius=GetComponent<MeshFilter>().sharedMesh.bounds.size.z/30f;}catch{}Gizmos.color=Color.green;Gizmos.DrawSphere(rb.transform.TransformPoint(rb.centerOfMass),radius);}}4.2.3下压力Downforce是一个相当简单的脚本。任何数量的下压力点都可以定义为以最大下压力速度施加的最大力。最大下压力速度应设置得比车辆能够行驶的速度高一点-注意速度为m/s-将该值乘以3.6得到km/h,或乘以2.5得到m/h。施加的力将以指数形式增加。如果设置的下压力值太高(单位为牛顿),车辆的表面可能会被撞击。。publicfloatmaxDownforceSpeed=50f;施加最大下压力时的速度(m/s)。下压力的数量将以指数形式增长到这个值privateVehicleControllervc;privatevoidStart(){vc=GetComponent<VehicleController>();获取车辆控制器组件}voidUpdate(){floatspeedPercent=vc.Speed/maxDownforceSpeed;floatforceCoeff=1f-(1f-Mathf.Pow(speedPercent,2f));foreach(DownforcePointdpindownforcePoints){vc.vehicleRigidbody.AddForceAtPosition(forceCoeff*dp.maxForce*-transform.up,transform.TransformPoint(dp.position));}4.3UTSRRO4-7汽车寻路逻辑创建SemaphoreSystem交通系统,点击4-8创建交通系统将创建好的红绿灯系统移动到合适的地方,调整大小。4-9红绿灯系统创建交通工具,点击UTSPRO->Vehicles,输入Pathname的名称,之后点击地图确定寻路的起点,完成后点击Finsh,此时我们将得到一条汽车寻路的路线4-10汽车寻路路线将汽车模型拖入右侧WalkingPrefabs当中4-11添加交通工具这样汽车将会沿着路线行驶4-12汽车寻路汽车寻路主要通过数组存放每一个移动点,再通过Transform进行位置变换:for(inti=0;i<points.GetLength(0);i++){varstartPoint=_forward[i]?points[i,0]:points[i,points.GetLength(1)-1];varnextPoint=_forward[i]?points[i,2]:points[i,points.GetLength(1)-3];SpawnPoints[i]=SpawnPoint.CarCreate(string.Format("SpawnPoint(Path{0})",i+1),startPoint,nextPoint,lineSpacing,i,_forward[i],this,3f,10f);4.4碰撞检测游戏的基本交通规则,主要通过玩家驾驶汽车在特定位置触发,主要用到的是ontrigger的方法,为玩家车辆添加一个新的标签,再在场景需要的位置设置Cube对象,为Cube添加boxcollider,勾选istrigger,然后将其网格渲染meshrenderer去掉。即可做到碰撞触发的空气墙4-13碰撞触发4.5镜头切换为了用户能够有更好的驾驶观察体验,驾驶模拟器将设置了多于一个的游戏镜头,用户可以在其中随时切换,目前共设置有第一人称镜头、第三人称镜头、第三人称可移动镜头、车前盖镜头。进入汽车后点击C键即可随意切换。在Update函数当中判断是否进入了汽车,进入后即可使用切换镜头按钮。4-14判断是否能进行镜头切换为了能达到更真实的效果,这里还定义了一个在车外的变量,用于判断镜头是在车内还是在车外。4-15调用音效当变量CheckIfInside判断为真时,则调用sound.insideVehicle的车内音效,如果不为真则会调用车外的音效,所以当切到车前盖的镜头时,我们将会听到不一样的声效。4-16第一人称视角4-17车前盖视角4-18第三人称视角4-19第三人称可移动视角4.6角色管理器在游戏当中,玩家可以通过V键进行上下车的操作,游戏开始的时候,以及玩家下车之后,我们的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年民事答辩状答辩状提交与送达规范
- 用户研究方法解析
- 2026届宁德高三下学期五月质检物理试题+答案
- 2026 学龄前自闭症情绪引导课件
- 2026 学龄前自闭症家长资源利用课件
- 2025年严肃游戏在职业教育课程中的研发
- 2025年三维基因组学解析染色质结构与基因表达调控
- 土地承包合同书14篇
- 家长会家长精彩发言稿(15篇)
- 总账会计工作总结2篇
- 新能源汽车商业计划书范本
- 浙江国企招聘2025杭州萧山水务有限公司招聘40人笔试历年常考点试题专练附带答案详解试卷2套
- 农村民法典宣传课件
- 粮库有限空间安全培训课件
- 氯碱电解工艺事故案例分析
- 《C++程序设计及项目实践》 课件 第16章 标准模板库
- 2025版《煤矿安全规程》解读
- 精神科护理安全与风险防范
- 下列属于监理员岗位职责的是
- 武威事业单位笔试真题2025
- GB/T 10454-2025包装非危险货物用柔性中型散装容器
评论
0/150
提交评论