基于Unity3d的模拟冲浪游戏的设计与实现_第1页
基于Unity3d的模拟冲浪游戏的设计与实现_第2页
基于Unity3d的模拟冲浪游戏的设计与实现_第3页
基于Unity3d的模拟冲浪游戏的设计与实现_第4页
基于Unity3d的模拟冲浪游戏的设计与实现_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘要随着科技时代的飞速提升,人们的生活水平发生了重大的变革,许多人会亲自体验生活中不常去的地方如海边、沙滩、雪地,深山等,又如一些生活中少体验的钓鱼、滑雪、冲浪等,但不是每个人都能亲自去体验,然而现代发达的游戏制作水平却可以弥补人们生活中一些遗憾。如今游戏和虚拟现实事业蓬勃发展,受到越来越多人的关注和喜爱,模拟类游戏允许玩家自由控制游戏中的人或事物,通过体验生活中一些比较难去体验的娱乐或生存方法。该类游戏不仅仅能够锻炼到人的反应速度,更重要的是提高人对自己未用过或用的较少的物品的认知以及人的生存常识等等,非常适合大众的需求。Unity3D作为一款能够快速开发和上手的游戏开发引擎在市场上逐步升温。本论文探究基于Unity3D的模拟冲浪游戏的开发,这不仅仅是一款模拟冲浪类游戏,区别真实的冲浪的体验但却能给人带来自己未曾体验过的愉悦同时可以通过游戏给人们带来冲浪的知识以及冲浪需要的设备、安全注意等。游戏难度适中,游戏的海浪以及海浪的冲击波会给人带来刺激感以及被海浪冲进水里的胆怯与畏惧,同时玩家可以通过教程学习一些基础冲浪技巧,去挑战更难的冲浪地点。现在人们为了消除平时工作和生活的乏累,会选择更多这类刺激而且能带来成就感的游戏,因此,模拟类游戏拥有可观的发展前景。本文主要描述了该游戏的开发原理,游戏的设计与实现以及游戏功能测试等。为后续希望开发同类游戏的开发者提供借鉴与参考。关键词:Unity3D3D水流冲浪游戏

AbstractWiththerapiddevelopmentofscienceandtechnology,greatchangeshavetakenplaceinpeople'slivingstandards.Manypeoplewillpersonallyexperiencetheplacestheydon'toftengotoinlife,suchastheseaside,beach,snow,deepmountain,etc.,aswellassomefishing,skiing,surfing,etc.,whicharerarelyexperiencedinlife,butnoteveryonecanexperiencetheminperson.However,themoderndevelopedgameproductionlevelcanmakeupforpeople'slifeSomeregrets.Nowadays,gameandvirtualrealityarebooming,andmoreandmorepeoplepayattentiontoandlovethem.Simulationgamesallowplayerstofreelycontrolpeopleorthingsinthegame,andexperiencesomeentertainmentorsurvivalmethodsthataredifficulttoexperienceinlife.Thiskindofgamecannotonlytrainpeople'sreactionspeed,butalsoimprovepeople'scognitionoftheunusedorlessuseditemsandpeople'ssurvivalknowledge,whichisverysuitablefortheneedsofthepublic.Unity3d,asagamedevelopmentenginethatcanbedevelopedandstartedquickly,isgraduallywarmingupinthemarket.Thispaperexploresthedevelopmentofthesimulationsurfinggamebasedonunity3d,whichisnotonlyasimulationsurfinggame,butalsoarealsurfingexperiencethatcanbringpeoplepleasurethattheyhaveneverexperienced.Atthesametime,itcanbringpeopletheknowledgeofsurfing,theequipmentneededforsurfing,safetyattention,etc.throughthegame.Thedifficultyofthegameismoderate.Thewavesofthegameandtheshockwavesofthewaveswillgivepeopleasenseofstimulationandthetimidityandfearofbeingsweptintothewaterbythewaves.Atthesametime,playerscanlearnsomebasicsurfingskillsthroughthecoursetochallengemoredifficultsurfingplaces.Nowadays,inordertoeliminatethetirednessofdailyworkandlife,peoplewillchoosemoregamesthatstimulateandbringasenseofachievement.Therefore,simulationgameshaveaconsiderabledevelopmentprospect.Thispapermainlydescribesthedevelopmentprincipleofthegame,thedesignandimplementationofthegameandthefunctiontestofthegame.Forthefuturedeveloperswhowanttodevelopsimilargamestoprovidereferenceandreference.Keywords:Unity3D3Dwatersurfinggame

目录第一章 绪论 绪论选题的目的和意义如今社会的计算机科学技术的发展,电子游戏的丰富多样,大众开始对游戏的娱乐性需求逐渐增高,以及对游戏的即时娱乐需求,人们开始对2D的平面游戏感到不够真实,追求真实的感官体验成为当今游戏发展的趋势,随着科技的不断发展,计算机和手机的不断普及,各种各样的游戏应用也层出不穷。而在人们背负着众多压力的生活中,游戏应用的出世无疑是一剂调味品,让人们可以适当的释放生活压力,增加人们的生活乐趣。休闲类游戏是目前最受欢迎的游戏类型之一,它经过多年的发展,变得更加完善,不同种类的游戏使得用户得到更多的体验。选择unity是由于Unity是一个可以让玩家轻松建立如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。并且unity可以发布游戏到多个平台,Android就是其中一种。休闲类游戏可以在休息的时间内以玩的方式得到身心的放松和调节,从而达到让体能得到恢复、身心保持愉悦的目的的一种业余生活游戏。休闲类游戏上手很快,不需要长时间进行,可以随时随地停止游戏,并且有较高的娱乐性,是非常适合和满足大众的需求的。国内外研究现状冲浪最初是由波利尼亚人的一种古老运动发展而来,他们部落中的酋长是一个技术最好的冲浪选手,并且拥有用最好树木制作的最好冲浪板,最初冲浪对一般阶级的民众来说是十分向往的运动,因为统治阶层拥有最好的海滩和板子,导致一般人不敢冒险在海浪凶险的地方以及没有沙滩的地方都不适合冲浪,但随着时间的推移,人们可以通过高超的冲浪技术来获得这些特权,同时也意味着冲浪运动开始向基层民众开放,欧洲人是最早目击冲浪的,在1767年由Dolphin的一名船员在大溪地记载。之后又由JameKing中尉在1779年在库克船长的日记中发现冲浪的艺术。在科克发现这种冲浪运动的几十年后,在1912年的奥运会中,哈摩库得了游泳冠军,在他的大力提倡下冲浪运动才开始在美国流行起来并推广,如今最流行的几个冲浪地区就有美国的夏威夷,以及北美、秘鲁、澳大利亚和南非都开始流行冲浪,并且逐步发展为有世界级冲浪锦标赛的运动冲浪是以海浪为动力的极限运动,冲浪者在海边有适当海浪的地方俯卧休息或在冲浪板上等待海浪,当有适当海浪时,海浪的动力会使冲浪板运动冲浪者通过俯卧调整冲浪板方向和划水的方式获得更多的动力,当动力足够时冲浪者起身,保持站立,且双腿微屈,让其获得更多的重心在身上。冲浪可以让人们暂时忘掉自己的不愉快,体验与大自然力量的接触,与海浪搏击,体验在一下别在海上实现水上漂的快感,这也许也是许多人为了寻找一处冲浪胜地而到处奔波的理由吧。随着时代的进步人们因为工作等原因,许多人无法好好地休息放松一下自己,所以人们开始在网络中寻找放松,2000年后随着最初红白机等游戏的过时网络游戏开始盛行,如今许多网络游戏发展迅速,成为当今游戏产业中规模最大的一类,然而这些也开始随着时间的发展被人们玩腻,大多数的RPG类和刷副本类闯关游戏过于丰满人们开始研究新的游戏类型,如3D极限飞车和3D竞技类运动游戏开始盛行,开发商开始寻找新的突破口,向各类运动类游戏进行开放。随着一些设备和硬件、软件的日益增强,人们的娱乐范围也开始从PC端向移动端扩展。3D互动娱乐游戏也开始在手机领域盛行,由于移动端的操作系统较多如Android、IOS等,为了保证开放的软件有较强的移植性,许多的开放引擎都逐步拓展自己的适用范围,从最开始的PC端开始向其他平台发展,如今最为突出的开发引擎便是Unity3D,该引擎适用多个平台,移植性强。但国内的跨平台技术仍然处于较低的阶段,通过该引擎可以实现较快的跨平台实现。论文组织结构论文从最初构思到游戏的分析实践,结合专业3D开发资料,设计一款冲浪的游戏,其中具体介绍了游戏制作的基本步骤以及游戏的系统功能设计和功能代码编写等。论文分为六章,各章节安排如下: 第一部分:绪论,主要阐述了该毕业设计制作的背景、国内外对相关课题的研究现状以及本设计的大概介绍; 第二部分:介绍了本文制作游戏使用的各类开发工具和Unity3D的大致介绍;第三部分:详细介绍游戏的各个模块的制作,清晰明确游戏内部关系,采用由下到上的顺序层层拆析步骤;第四部分:冲浪游戏的系统功能设计和界面设计; 第五部分:运行游戏进行测试,打包封装;第六部分:结论以及游戏不足和游戏今后改进。

开发工具介绍Unity3D游戏引擎Unity3D软件介绍游戏引擎提供了足够的功能,这些功能在许多不同的游戏中都很有用。因此,通过使用该引擎,只要添加自定义的艺术资源并添加自己的游戏代码,就可以轻松获得这些功能,从而实现一款游戏。Unity3D包括物理模拟、普通地图、屏幕空间环境光照明暗处理、动态阴影等。许多游戏引擎都为自己的许多功能感到骄傲,但Unity3D与其他尖端游戏开发工具相比有两个主要优势:提供极为高效的视觉工作流和多维跨平台支持。可视化工作流是一种非常独特的设计,它不同于其他大多数游戏开发环境。由于其他游戏开发工具通常会将不可避免会引起争议的无关部分混合在一起,或者需要建立自己的编程类库、构建链等旧的集成开发环境设计,因此Unity3D中的开发工作流是通过精心设计的可视化编辑器来定位的。这些编辑器用于布局游戏中的场景,将艺术资源绑定在一起,并对交互式对象进行编码。这些编辑器的优点在于,它们可以让您快速高效地构建专业和高质量的游戏。当你需要在视频游戏中使用大量的新技术时,它们将为你提供难以置信的高效工具。编译器对于快速迭代和在原型和测试周期中优化游戏非常有用。您可以在编译器中调整动物对象,甚至在游戏运行时移动对象。此外,Unity3D允许您通过脚本自定义编辑器,因此可以向界面添加一些新功能或菜单。除了编译器的优点外,Unity3D的工具集成还提供了高度的跨平台支持。它不仅在部署目标上是跨平台的(可以部署到PC、wed、移动设备或游戏机上),还包括跨平台开发工具(可以在windows或MacOS上开发游戏)。API接口API接口Unity3D中有丰富的API接口可以帮助你完成各种需要的功能,API是预定义的函数,应用程序和开发人员都可以使用这些函数来访问基于某些软件或硬件的代码功能使用,而不需要在源代码中寻找,这样会十分耗时,或者用于了解其中的工作机制,由于Unity自己的用户量较多,许多人会提供自己优质的API函数方法,便于多数Unity初学者或找不到实现方法的人使用,这也使得Unity拥有一套完整的API函数库,开发人员可以通过函数库便捷的实现项目的一些初始化工作,而不需要自己打基础的函数代码,API函数库中有许多功能模块,如碰撞检测的基本用法,音效播放的基本实现、人物动画配置函数,触发区和非触发区等判定方法,Unity开发的各种功能的基础调用都有。物理引擎不管什么游戏,其设计都是需要使对象特征合理,让游戏更为真实,实现身临其境的效果,Unity中提供了各种各样的组件和插件,目的就是为了可以让游戏的对象通过渲染和色彩的变化、平行光、、点光源的摆放、游戏贴图使用、文字、动画加入、声音的配置、材质更换等,这些组件都可以增加游戏的真实性,为玩家带来视觉效果的真实,为人物、地图、障碍物金币等游戏对象添加组织实现阻力,碰撞检测、碰撞阻碍及改变人物运动路线等,让玩家有更真实地体验,让你觉得这是一个真实存在的物体。其中比较常用的组件如AudioSource、collider等Unity常用生命周期的函数Unity3D游戏开发引擎和常规程序开发不同在Main函数的入口运行,它是在内部实现Unity的生命周期事件,通过给各个生命周期赋予方法来实现游戏的基本生命周期,在Update中可以不断地更新迭代这些生命周期函数,从而实现游戏地不断判定。下面介绍一些Unity中比较常用的事件函数。OnGUI():当游戏结束失败或胜利时通过该函数实现胜利或失败地标志显示。Start():在游戏开始时运行的事件如游戏暂停获取其他物体参数为初始参数赋值等。Update():游戏帧事件,在其中写入的方法和事件会不断进行无法被停止。OnClick():Unity自带脚本功能,用于Button上的检测实现游戏的物体隐藏和显示,实现游戏的点击场景跳转和游戏菜单实现。OnEnable():在Start事件后调用,只有被激活的时候才会执行。OnTriggerEnter():游戏碰撞检测函数,用于检测游戏金币及人物等碰撞的检测。OnDestroy():在游戏中对游戏对象进行销毁通常可以写在物体本身身上用于自身的销毁,同时也可以对碰撞物体的销毁,这种一般写在角色身上。Unity3D中脚本多数是继承Mono行为基类,通常不需要继承该类来编写一些工具类因为大多数类都已经实现,在Unity运行的过程中都会存在,除非开发人员需要自己释放内存,否则不需要人为编写工具类。GUI(图形用户界面)该项目中使用Unity自带的UI开发工具即GUI。Unity的GUI系统称为UnityGUI。UnityGUI使您能够快速轻松地添加各种具有完整功能的界面元素,包括在创建GUI控件时的实例化、定位和功能定义。通过这种方式,您可以通过一次编写少量代码同时创建一个GUI接口元素实例,并在屏幕上找到实例的位置,描述激活接口元素时要执行的脚本。UGUI内置于Unity中。与NGUI相比,它是一个UI插件,Unity本身自带的UI开发功能少了一些,因此可以导入NGUI的UnityUI的拓展插件,它可以提高开发者的界面设计速度以及加快游戏开发的进程。3DsMax软件3DsMax全称是3DstudioMax,该软件是由discreet公司开发的,主要用于电脑端的一些三维动画制作以及三维模型制作,通常在游戏和一些设计领域使用较多,游戏开发中许多模型的骨骼以及模型的画质等都可以通过该软件实现提升与拓展,在一些设计物体形状中有十分大的帮助,可以不断地进行修改模型的点线面等,以及对模型进行各种渲染实现物体的平滑,该软件最初的目的是实现电脑游戏动画的制作,然后再慢慢发展到如今,许多建造领域都或多或少需要了解,能为建造设计带来许多便利而在这里只做简单的介绍,由于游戏模型制作相对耗时,所以不选择用3DsMax进行建模,项目中的模型选自一些网上素材和Unity商城中,但为了保证模型在加载过程中不出现意外情况,将游戏模型导入该软件中进行核对,保证模型不会有过大的漏洞C#开发语言C#是当今开发软件以及游戏系统等常用的开发语言,是由微软发布的高级编程语言,它与java语言的编写代码类似,但它有更强大的功能,因为Unity软件实现的是跨平台,而C#本身不是跨平台的开发语言,但在Unity中C#可以通过Mono的重实现,使得该语言可以在Unity中跨平台使用,而且C#有许多优点,相对其他开发语言来说,C#的语法更明了且各种类的库使用方便,在Unity开发中C#明显是一种首选的开发语言VisualStudio2017VisualStudio2017是现版本系统中较为常用的编程软件,由微软公司自主研发,十分适合Unity的开发只需用using加入Unity本身的一些UI和UnityEngine便可以很快速地进行代码编写,而且该软件中支持集成开发,也支持开发相应的Windows程序,,VisualStudio中各种报错提示以及编写代码的辅助功能都十分适合Unity开发。

游戏设计场景设计系统包括场景1_menu和场景gameScene,场景gameScene为游戏的主场景,即玩家进行游戏的场景。场景中的对象有:地形:对象都在这上面进行活动,还包括一些水流和波浪。游戏对象:即人物、冲浪板和金币。特殊道具:有排球,人物角色拾取可以获得少许能量。其他物体:障碍物。场景的制作Unity商城中寻找需要的地图类型,由于考虑游戏本身在水中进行,所以在商城中找到相应的水流效果LowPolyWaterGPU,并导入进项目中,通过网上教程制作游戏道路点击EditDetails就可以为这些物体选择相应的贴图。综合运用,就产生了本项目的地形,如图3-1所示。图3-1创建好的地形在游戏地图中放置一些其他的游戏物体,用来丰富游戏场景,如金币,障碍物,还有排球等,其中为水面上的金币添加脚本使其旋转便于玩家分辨和充实游戏了,只要玩家穿过金币,就会获得然后播放音效然后销毁游戏对象,如图3-2所示。图3-2添加了游戏物体的游戏场景人物和冲浪板创建游戏人物及物体并导入游戏项目中,实现人物的运动和人物跳跃管理导入模型首先将玩家控制的游戏对象设计出来,即主角,人物模型在项目前期已进行收集,U3D支持的模型类型是fbx,所以在导入人物模型前可以将人物模型的格式确认,如果不是该类型可以将其导进3DMax中再将其转换为fbx类型格式,如此便可以导入到U3D中使用直接将模型拖入Project面板即完成导入,如图3-3所示。图3-3人物模型人物运动的实现Unity中导入游戏角色对象,调整角色大小,为角色添加相应的刚体Rigidbody以及碰撞体Collider保证角色有真实的物理属性以及让它能够被游戏中的其他物体检测Unity默认的脚本编辑器设置为VS2017。当人物的基本配置实现时,为它编写玩家控制角色的运动脚本moveController.cs,使玩家能够控制角色的基本移动如左右移动和加速等,由于使用的方法类型为Horizontal,因此人物的基本移动可以通过键盘的上下左右和WADS控制,空格键对应人物的跳跃人物无法进行二次跳跃。移动使用的方法是transform.Translate(),加速的方法是moveVSpeed+=0.1f。usingUnityEngine;usingSystem.Collections;usingSystem.Collections.Generic;usingSystem;publicclassmoveController:MonoBehaviour{//摄像机位置publicTransformcameraTransform;//摄像机距离人物的距离publicfloatcameraDistance;//游戏管理器publicGameManagergameManager;//前进移动速度floatmoveVSpeed;//水平移动速度publicfloatmoveHSpeed=5.0f;//跳跃高度publicfloatjumpHeight=5.0f;//动画播放器Animatorm_animator;//起跳时间doublem_jumpBeginTime;//跳跃标志intm_jumpState=0;//最大速度publicfloatmaxVSpeed=8.0f;//最小速度publicfloatminVSpeed=5.0f;publicAudioClipimpact;AudioSourceaudioSource;//UsethisforinitializationvoidStart(){GetComponent<Rigidbody>().freezeRotation=true;m_animator=GetComponent<Animator>();if(m_animator==null)print("null");moveVSpeed=minVSpeed;audioSource=GetComponent<AudioSource>();} //Updateiscalledonceperframe voidUpdate(){//游戏结束if(gameManager.isEnd){Time.timeScale=0;}AnimatorStateInfostateInfo=m_animator.GetCurrentAnimatorStateInfo(0);if(stateInfo.fullPathHash==Animator.StringToHash("BaseLayer.run")){m_jumpState=0;if(Input.GetButton("Jump")){//起跳m_animator.SetBool("Jump",true);m_jumpBeginTime=m_animator.recorderStartTime;}else{//到地面}}else{doublenowTime=m_animator.recorderStartTime;doubledeltaTime=nowTime-m_jumpBeginTime;//掉下m_jumpState=1;m_animator.SetBool("Jump",false);}floath=Input.GetAxis("Horizontal");Vector3vSpeed=newVector3(this.transform.forward.x,this.transform.forward.y,this.transform.forward.z)*moveVSpeed;Vector3hSpeed=newVector3(this.transform.right.x,this.transform.right.y,this.transform.right.z)*moveHSpeed*h;Vector3jumpSpeed=newVector3(this.transform.up.x,this.transform.up.y,this.transform.up.z)*jumpHeight*m_jumpState;Vector3vCameraSpeed=newVector3(this.transform.forward.x,this.transform.forward.y,this.transform.forward.z)*minVSpeed;}}人物AI人物初始化运动速度为5f,人物碰撞障碍物会导致速度减少,但相对的摄像机离人物较近且无障碍时,人物会加速行驶使其保持在屏幕中央。制作得分统计即Coins,在脚本中声明一个公有数coins将它的初始值设为0,然后在赋予金币的得分参数,编写一个得分脚本让其统计Coin的数量并使其显示在游戏界面的上方usingUnityEngine;usingSystem.Collections;usingSystem.Collections.Generic;usingSystem;publicclassmoveController:MonoBehaviour{//摄像机位置publicTransformcameraTransform;//摄像机距离人物的距离publicfloatcameraDistance;//游戏管理器publicGameManagergameManager;//前进移动速度floatmoveVSpeed;//水平移动速度publicfloatmoveHSpeed=5.0f;//跳跃高度publicfloatjumpHeight=5.0f;//动画播放器Animatorm_animator;//起跳时间doublem_jumpBeginTime;//跳跃标志intm_jumpState=0;//最大速度publicfloatmaxVSpeed=8.0f;//最小速度publicfloatminVSpeed=5.0f;publicAudioClipimpact;AudioSourceaudioSource;//UsethisforinitializationvoidStart(){GetComponent<Rigidbody>().freezeRotation=true;m_animator=GetComponent<Animator>();if(m_animator==null)print("null");moveVSpeed=minVSpeed;audioSource=GetComponent<AudioSource>();} //Updateiscalledonceperframe voidUpdate(){//游戏结束if(gameManager.isEnd){Time.timeScale=0;}AnimatorStateInfostateInfo=m_animator.GetCurrentAnimatorStateInfo(0);if(stateInfo.fullPathHash==Animator.StringToHash("BaseLayer.run")){m_jumpState=0;if(Input.GetButton("Jump")){//起跳m_animator.SetBool("Jump",true);m_jumpBeginTime=m_animator.recorderStartTime;}else{//到地面}}else{doublenowTime=m_animator.recorderStartTime;doubledeltaTime=nowTime-m_jumpBeginTime;//掉下m_jumpState=1;m_animator.SetBool("Jump",false);}floath=Input.GetAxis("Horizontal");Vector3vSpeed=newVector3(this.transform.forward.x,this.transform.forward.y,this.transform.forward.z)*moveVSpeed;Vector3hSpeed=newVector3(this.transform.right.x,this.transform.right.y,this.transform.right.z)*moveHSpeed*h;Vector3jumpSpeed=newVector3(this.transform.up.x,this.transform.up.y,this.transform.up.z)*jumpHeight*m_jumpState;Vector3vCameraSpeed=newVector3(this.transform.forward.x,this.transform.forward.y,this.transform.forward.z)*minVSpeed;this.transform.position+=(vSpeed+hSpeed+jumpSpeed)*Time.deltaTime;cameraTransform.position+=(vCameraSpeed)*Time.deltaTime;if(this.transform.position.x-cameraTransform.position.x<cameraDistance){moveVSpeed+=0.1f;if(moveVSpeed>maxVSpeed){moveVSpeed=maxVSpeed;}}//超过时让摄像机赶上elseif(this.transform.position.x-cameraTransform.position.x>cameraDistance){moveVSpeed=minVSpeed;cameraTransform.position=newVector3(this.transform.position.x-cameraDistance,cameraTransform.position.y,cameraTransform.position.z);}//摄像机超过人物if(cameraTransform.position.x-this.transform.position.x>0.0001f){Debug.Log("你输啦!!!!!!!!!!");gameManager.isEnd=true;}//cameraTransform.position=newVector3(this.transform.position.x-cameraDistance,cameraTransform.position.y,cameraTransform.position.z);}voidOnGUI(){if(gameManager.isEnd){GUIStylestyle=newGUIStyle();style.alignment=TextAnchor.MiddleCenter;style.fontSize=40;style.normal.textColor=Color.red;GUI.Label(newRect(Screen.width/2-100,Screen.height/2-50,200,100),"你输了~",style);}}voidOnTriggerEnter(Colliderother){//如果是抵达点if(.Equals("ArrivePos")){gameManager.changeRoad(other.transform);}//如果是透明墙elseif(other.tag.Equals("AlphaWall")){//没啥事情}//如果是障碍物elseif(other.tag.Equals("Obstacle")){}}}冲浪板的设计与特效实现在Unity中创建长方形cube在3DMax中进行修饰将其修整成前方为尖嘴形状,为其寻找相应的游戏贴入在3DMax中导入贴图,在Project面板中新建一个Prefabs的文件夹将预制体命名为Surfboard3。同时,使用粒子系统,制作出冲浪板的冲浪特效。在Hierarchy面板Create->CreateEmpty->ParticleSystem新建一个空对象命名为surfpoint,将该空对象放置在冲浪板尾部附近,调整好方向,如图3-4所示。这里就是后面浪花产生的地方,将其位置稍微调高让特效不至于被其他物体挡住而无法显示。图3-4设置浪花孵化点给冲浪的浪花添加音效,添加AudioSource组件,并使用AudioSource.Play()方法播放。usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclasssurfAudio:MonoBehaviour{AudioSourceaudioData;voidStart(){audioData=GetComponent<AudioSource>();audioData.Play(0);Debug.Log("started");}voidOnGUI(){if(GUI.Button(newRect(10,70,150,30),"Pause")){audioData.Pause();Debug.Log("Pause:"+audioData.time);}if(GUI.Button(newRect(10,170,150,30),"Continue")){audioData.UnPause();}}}障碍物与角色对象不一样的是障碍物,将障碍物的模型导入,并其调整大小,并给它添加Ridgybody和BoxCollider。然后编写脚本实现障碍物的阻碍功能。这里使用publicList<GameObject>objPrefabList=newList<GameObject>()列表来随机初始化障碍物生成的位置,里面的参数表示在添加障碍物对象。publicList<Transform>arrivePosList=newList<Transform>();//障碍物列表publicList<GameObject>objPrefabList=newList<GameObject>();//目前的障碍物Dictionary<string,List<GameObject>>objDict=newDictionary<string,List<GameObject>>();

游戏中,当摄像机距离小于人物离屏幕距离时,即游戏失败之时,用Deastroy()方法控制地图中越过的障碍物,同时障碍物数量进行同步保证游戏的性能稳定。voidinitRoad(intindex){stringroadName=roadList[index].name;//清空已有障碍物foreach(GameObjectobjinobjDict[roadName]){Destroy(obj);}objDict[roadName].Clear();//添加障碍物foreach(TransformposinbornPosList[index]){GameObjectprefab=objPrefabList[Random.Range(0,objPrefabList.Count)];Vector3eulerAngle=newVector3(0,Random.Range(0,360),0);GameObjectobj=Instantiate(prefab,pos.position,Quaternion.EulerAngles(eulerAngle))asGameObject;obj.tag="Obstacle";objDict[roadName].Add(obj);}使用Distance()方法判断人物与屏幕之间的距离,当距离大于0米且速度低于5时,人物速度逐渐增加,并使人物运动到离摄像机距离为10时保持稳定;当人物运动速度稳定为5时人物不做加速运动;当摄像机超过人物时即人物距离摄像机小于0时游戏判断失败,游戏暂停人物无法运动。if(this.transform.position.x-cameraTransform.position.x<cameraDistance){moveVSpeed+=0.1f;if(moveVSpeed>maxVSpeed){moveVSpeed=maxVSpeed;}}//超过时让摄像机赶上elseif(this.transform.position.x-cameraTransform.position.x>cameraDistance){moveVSpeed=minVSpeed;cameraTransform.position=newVector3(this.transform.position.x-cameraDistance,cameraTransform.position.y,cameraTransform.position.z);}//摄像机超过人物if(cameraTransform.position.x-this.transform.position.x>0.0001f){Debug.Log("你输啦!!!!!!!!!!");gameManager.isEnd=true;}游戏中的碰撞检测用OnTriggerEnter(Colliderother)方法检测角色拾取金币以及触发金币音效的互动,金币同时也要检测是否为人物拾取,增加角色的得分privatevoidOnTriggerEnter(Colliderother){if(other.tag=="Player"){moveControllercharacter=other.GetComponent<moveController>();source.PlayOneShot(OpenDoorSound,1F);//播放声音if(character!=null){character.coins+=gems;Destroy(coin1);Destroy(c);Destroy(gameObject,1F);}}}游戏中当人物拾取到金币时通过OnTriggerEnter(Colliderother)方法做出相应的得分变化,如果人物拾取到金币则增加游戏得分,如果角色未拾取到金币则不增加得分usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;usingUnityEngine.UI;publicclassScore:MonoBehaviour{TextscoreText;publicTextCoinNum;publicmoveControllermc;voidStart(){scoreText=this.GetComponent<Text>();Time.timeScale=0;}//UpdateiscalledonceperframevoidUpdate(){CoinNum.text=mc.coins+"coin";//scoreText.text="coins:"+moveController.coins.ToString();}publicvoidStartPlus(){Time.timeScale=1;}publicvoidWin(){if(mc.coins>=1000){GUIStylestyle=newGUIStyle();style.alignment=TextAnchor.MiddleCenter;style.fontSize=40;style.normal.textColor=Color.red;GUI.Label(newRect(Screen.width/2-100,Screen.height/2-50,200,100),"你赢了!",style);}Time.timeScale=0;}}地图和地图随机生成通过GameManager将游戏中的地图导入进Unity中然后保存其prefab,编写地图生成列表以及地图prefab生成列表,除此还需要对走完的地图进行销毁,因此需要道路的销毁列表。

usingUnityEngine;usingSystem.Collections;usingSystem.Collections.Generic;publicclassGameManager:MonoBehaviour{//道路列表publicList<Transform>roadList=newList<Transform>();//抵达点列表publicList<Transform>arrivePosList=newList<Transform>();//目前的障碍物Dictionary<string,List<GameObject>>objDict=newDictionary<string,List<GameObject>>();publicintroadDistance;publicboolisEnd=false; //Usethisforinitialization voidStart(){foreach(TransformroadinroadList){List<GameObject>objList=newList<GameObject>();objDict.Add(,objList);}initRoad(0);initRoad(1);} //Updateiscalledonceperframe voidUpdate(){ }//切出新的道路publicvoidchangeRoad(TransformarrivePos){intindex=arrivePosList.IndexOf(arrivePos);if(index>=0){intlastIndex=index-1;if(lastIndex<0)lastIndex=roadList.Count-1;//移动道路roadList[index].position=roadList[lastIndex].position+newVector3(roadDistance,0,0);initRoad(index);}else{Debug.LogError("arrivePosindexiserror");return;}}voidinitRoad(intindex){stringroadName=roadList[index].name;//清空已有障碍物foreach(GameObjectobjinobjDict[roadName]){Destroy(obj);}objDict[roadName].Clear();}}

添加背景音乐及游戏音效通过publicAudioSourceasource、publicSlidersd、Con_sound()方法给游戏添加背景音乐和游戏音效。金币的音效通过source.PlayOneShot(OpenDoorSound,1F);表示该音效只播放一次usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;usingUnityEngine.UI;publicclassControl_sound:MonoBehaviour{publicAudioSourceasource;publicSlidersd;voidStart(){}//UpdateiscalledonceperframevoidUpdate(){}publicvoidCon_sound(){asource.volume=sd.value;}}

游戏界面设计菜单界面场景1为菜单界面,菜单界面包括开始游戏界面和设置界面,均使用NGUI插件制作。菜单界面功能PLAY按钮:点击该按钮可以进入游戏难度选择,其中有三个难度分别为EASY、Normal、Hard三种游戏难度点击EASY进入游戏场景1、Normal、Hard分别对应游戏场景2和3.在游戏菜单界面,当鼠标经过按钮时会有相应的互动效果表示给玩家,且鼠标点击时也会有颜色的透明度互动表示玩家点击了该按钮Option按钮:点击该按钮进入游戏的配置界面,玩家可以调整游戏本身的音效以保证适合自己,其中BACk按钮即设置完成后回到主菜单。BACk按钮:当玩家设置完成时可以点击Back按钮返回主菜单设置的音效会同步玩家设置QUIT按钮:点击该按钮退出游戏。图4-1游戏开始界面图4-2游戏设置界面菜单界面的制作制作菜单界面时,需要创建一个新的场景再Assets的Sence中创建新场景并命名为1_menu,再Unity的buildandsetting中可以将该场景设为场景0,导入菜单制作所需的素材和脚本,再点击Create->UI->image,创建一张图片作为界面的背景,如图4-3所示。然后通过资源将背景图片导入Unity中并Inspector面板设置其属性将它设置为sprite(2DandUI),如图4-4所示。然后在Inspector面板上将导入的素材背景图片拖入image中并调整图片大小使其适合摄像机的范围。图4-3用UGUI创建的背景图4-4背景设置然后点击Create->UI->Button创建游戏按钮由于游戏本身按钮颜色为白色,通过调整颜色使其颜色相对较为适合游戏主题,添加按钮文字在Button->Test中,修改文本信息,并调整文本大小进行适当的加粗以及文本大小调整,然后安装文本插件TextMeshPro调整文本颜色使其更为鲜艳,其它的按钮创建一样。所有按钮创建完后,把他们放进一个新建的空对象中并命名为MainMenu。将其余按钮通过按ALT键且点击RectTransform面别中的AnchorPresets,使其居中再对三个按钮位置进行上下调整,使当前三个按钮都置于屏幕中央位置。图4-5按钮的创建创建一个新的空对象将其命名为Option,如上边创建其他的一样,然后再Create->UI中找到Slider创建,该UI自带Slider滑动条用于调节游戏音量。图4-6设置面板然后创建脚本Control_sound.cs来处理玩家与游戏界面的交互。这里实现游戏音效有效变化。usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;usingUnityEngine.UI;publicclassControl_sound:MonoBehaviour{publicAudioSourceasource;publicSlidersd;publicvoidCon_sound(){asource.volume=sd.value;}}这里使用Button自带的脚本来实现菜单界面、难度选择界面和游戏设置界面的切换,其中包括游戏进行中的游戏暂停以及游戏设置和返回游戏等功能,使用OnButtonClick方法处理按钮的点击。usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;usingUnityEngine.SceneManagement;publicclassMainmenu:MonoBehaviour{publicvoidPlayGame(){SceneManager.LoadScene(1);}publicvoidPlayGame1(){SceneManager.LoadScene(2);}publicvoidPlayGame2(){SceneManager.LoadScene(3);}publicvoidresume(){Time.timeScale=1;}publicvoidBackMenu(){SceneManager.LoadScene(0);}publicvoidQuitGame(){Debug.Log("QUIT!");Application.Quit();}游戏结束界面游戏结束界面使用UnityUI制作。游戏结束界面功能玩家拾取目标数金币时,判断游戏胜利,UI上方的文本Text显示为:你赢了。玩家被卡在屏幕外时,判断游戏失败,UI上方的文本Text显示为:你输了~。重玩按钮:点击AGAIN按钮,重新加载游戏。设置按钮:点击Option按钮,进入设置菜单。设置菜单用来调节游戏音效。菜单按钮:点击Quit按钮,回到场景0,即菜单界面。图4-7游戏结束界面游戏失败界面制作通过Unity自带的UI制作GUI界面在Create界面中创建UI->button,创建三个游戏按钮分别用来实现游戏的再次进行和游戏设置以及游戏返回主菜单,将三个Button的锚点居中然后再进行上下调整,然后将创建好的按钮以及文本等UI放置在新创建的空对象DeadMenu中方便管理创建publicGameObjectDead、Dead.SetActive(true)、publicGameObjectWin、Win.SetActive(true)方法通过添加相应的DeadMenu、WinMeun来显示游戏结束菜单,同样的游戏胜利时分别调用。voidOnGUI(){if(gameManager.isEnd){GUIStylestyle=newGUIStyle();style.alignment=TextAnchor.MiddleCenter;style.fontSize=40;style.normal.textColor=Color.red;GUI.Label(newRect(Screen.width/2-100,Screen.height/2-50,200,100),"你输了~",style);}}publicvoidWin(){if(mc.coins>=1000){GUIStylestyle=newGUIStyle();style.alignment=TextAnchor.MiddleCenter;style.fontSize=40;style.normal.textColor=Color.red;GUI.Label(newRect(Screen.width/2-100,Screen.height/2-50,200,100),"你赢了!",style);}Time.timeScale=0;}接下来给游戏结束界面添加相应的效果以及音效使其有相对的气氛。图4-8游戏音效添加给重玩按钮和菜单按钮添加点击事件。publicvoidPlayGame(){SceneManager.LoadScene(1);}publicvoidBackMenu(){SceneManager.LoadScene(0);}暂停界面游戏主界面均使用UGUI制作,左上方显示游戏按钮功能,中上方显示获得金币数量中间部分显示相应的游戏继续进行以及游戏设置和游戏返回主菜单按钮界面功能按P键游戏暂停当玩家需要休息时以及要退出游戏时可以使用,暂停游戏图4-9暂停界面暂停界面的制作首先如菜单一样创建相应的游戏按钮Create->UI->Button创建三个按钮修改按钮文本以及调整按钮的图片样式颜色选择相对适合暂停界面的颜色,然后如图4-10所示在按钮中添加相应的OnClick方法,实现有效的菜单跳转以及场景跳转。图4-10暂停菜单按钮配置usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;usingUnityEngine.SceneManagement;publicclassPausemenu:MonoBehaviour{publicvoidPlayGame(){SceneManager.LoadScene(1);}publicvoidPlayGame1(){SceneManager.LoadScene(2);}publicvoidPlayGame2(){SceneManager.LoadScene(3);}publicvoidresume(){Time.timeScale=1;}publicvoidBackMenu(){SceneManager.LoadScene(0);}if(Input.GetKeyDown(KeyCode.P)){Time.timeScale=0;Menu.SetActive(true);}金币金币功能通过拾取地图中的金币获得更多的得分和游戏的胜利金币的制作在Unity商城中获得所需要的Coins,游戏中Coins分为三种金币、银币、铜币对应相应的得分5、3、1。在GameManger中添加相应的游戏金币生成列表即bornCoinList,和对应金币类型列表CoinPrefabList并且为金币生成的点进行排列使其生成在适合位置,然后在Inspector面板中加入三种金币类型具体如下图:图4-10添加金币类型//生成金币列表publicList<Transform>bornCoinList=newList<Transform>();//金币列表publicList<GameObject>CoinPrefabList=newList<GameObject>();//添加金币foreach(TransformposinbornCoinList[index]){GameObjectprefab=CoinPrefabList[Random.Range(0,CoinPrefabList.Count)];Vector3eulerAngle=newVector3(0,Random.Range(0,360),0);GameObjectobj=Instantiate(prefab,pos.position,Quaternion.EulerAngles(eulerAngle))asGameObject;obj.tag="Obstacle";objDict[roadName].Add(obj);}在工程项目中创建一个空对象并且命名为GoldCoin,另外两种金币类型分别命名为SilverCoin、CopperCoin,然后将游戏prefab的金币进行调试将其rotation的Z轴旋转90度使其立起来,同理另外两中也是如此,然后将其保存在原来的prefab上调整金币大小为100,然后添加金币音效使角色拾取到金币使触发,使人物

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论