《基于Unity3D的狩猎模拟器的设计与实现.doc》由会员分享,可在线阅读,更多相关《基于Unity3D的狩猎模拟器的设计与实现.doc(41页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、本科毕业设计(论文) 基于Unity3D的狩猎模拟器的设计与实现Design and development of tank combat survival game based on Unity3D 院 (系)计算机学院专 业软件工程班 级7班学 号16210120727学生姓名杨天天指导教师王千秋提交日期内容摘要因为国内能够打猎的狩猎基地大多不对外开放,再加上国家对于野生动物的保护,人们极少能够见到野生的动物,更别说与野生动物互动和打猎了。因此,为了人们能够体会到在远离人群的森林中,体验真实的狩猎快感和体会自然森林的原始韵味,特此制作了这款模拟类型的游戏狩猎模拟器。模拟类型的游戏重点在于现
2、实的还原,但是一味照搬现实是枯燥无味的,所以在玩法上应该以玩家能够更容易体验到狩猎的乐趣为主。以狩猎为核心的游戏目前出现的也不在少数,比如荒野的召唤可以说是这个类型游戏的标杆,但是即使这样的大作也不可能让所有玩家喜欢,其中更是有些许的不足之处,其中引用b站一部分玩家的评论“这个游戏过于枯燥“、”大部分时间都在走路“和”看风景模拟器“,这些是部分玩家的观点,我认为出现这种重心从狩猎偏移到看风景的情况,不是因为说这个游戏的狩猎玩法很硬核,而是这个游戏节奏太慢,不适合现在国内部分喜欢快节奏游戏人群的玩家,当我自己去体验了这个游戏之后感觉也确实如此。所以我开发的这个狩猎游戏将尝试解决这个问题:在尽量保
3、留狩猎的真实性的情况下,将一个以狩猎为核心的游戏从跑图看风景中解放出来,回归到畅快淋漓的狩猎之中。AbstractBecause most hunting bases that can be hunted in China are not open to the outside world, coupled with the countrys protection of wild animals, people rarely see wild animals, let alone interact with and hunt wild animals. Therefore, in order
4、to allow people to experience the real hunting pleasure in the forest far from the crowd and the original charm of the natural forest, this simulation-type game Hunting Simulator was produced.Simulation-type games focus on closeness and reality, but copying reality blindly is dull, so the gameplay s
5、hould be based on the players ability to experience the fun of hunting more easily. Hunting-based games are not uncommon at present, such as Call of the Wild can be said to be the benchmark for this type of game, but even such a masterpiece is not likely to be liked by all players, among which there
6、 are some shortcomings , Which quotes the comments of some players in station b, This game is too boring, I spend most of my time walking, and seeing the scenery simulator. These are some of the players views. I think this focus shifts from hunting to Looking at the scenery, it is not because the hu
7、nting gameplay of this game is very hard-core, but because the pace of the game is too slow, and it is not suitable for some domestic players who like fast-paced gamers. It feels true when I experience the game in this way. So this hunting game I developed will try to solve this problem: while retai
8、ning the authenticity of hunting as much as possible, liberate a game with hunting as the core from running pictures to see the landscape, and return to the smooth and vigorous hunting.本科毕业设计(论文)1基于Unity3D的狩猎模拟器的设计与实现1Design and development of tank combat survival game based on Unity3D1第一章绪论71.1选题的目
9、的和意义71.2模拟类游戏的诞生和发展71.3论文组织结构8第二章开发工具92.1Unity3D引擎92.1.1关于Unity3D软件功能的介绍92.1.2API接口92.1.3物理引擎92.1.4Unity3D脚本生命周期102.1.5图形用户界面102.1.6Behavior Designer102.1.7AssetStore112.2C#语言112.3Visual Studio 201711第三章游戏玩法设计123.1场景设计123.1.1场景的制作123.2Player制作143.2.1物理抖动143.2.2FPS功能153.2.3射击功能193.2.4子弹单列213.2.5人物移动2
10、33.3动物的AI253.3.1鹿的AI253.3.2动物AI方向管理32第四章UI界面设计344.1游戏主界面344.2预加载界面364.3游戏暂停界面36第五章游戏测试375.1打包并导出游戏375.2游戏运行测试38第六章总结39参考文献40致谢41第一章 绪论1.1 选题的目的和意义前几年最火的游戏类型无疑是竞技类型的游戏,比如英雄联盟和王者荣耀等,但是近两年玩家的喜好又偏向模拟真实类型的游戏,比如模拟飞行、模拟修仙等,其中有大厂也有新人的制作,未来模拟类型的游戏可能成为比较火的游戏类型。模拟类型的游戏非常注重玩家的体验,这是该类型游戏的核心,不管模拟什么,最终的目的就是要玩家感受到该
11、游戏所模拟的东西。游戏中设计模拟的东西可以是生活中十分平常的东西也可以是普通人触及不到又想体验的东西,更可以是设计者幻想架空的梦幻之物,但是最终一定要玩家体验到这个游戏所模拟的东西,并真正融入进去。狩猎模拟器这个游戏就和名字一样,这是一款模拟狩猎的游戏,狩猎这个词对于任何人都不陌生,但是狩猎在中国几乎是不可能的事情,偷猎更是会将牢低坐穿。因为狩猎这个早在几十万年前就作为我们祖先获得食物的方式,后面的封建时代更是发展为娱乐,可以说这是刻在我们骨子里的行为,所以大部分人应该对狩猎有一种热衷。为了能让这部分人可以体验到原汁原味到丛林狩猎而不会犯法,这款模拟狩猎的游戏就此诞生。1.2 模拟类游戏的诞生
12、和发展模拟器类游戏是诞生自一些军用的模拟器,例如防空3D模拟器等,也正因为这一特性,最早的模拟器类游戏就是以军事为题材的,据说第一款模拟器类游戏内容非常简单,模拟发射一枚导弹来命中目标,玩家可以通过旋钮来控制导弹的速度和弧度。大家公认的“世界上第一款电子游戏”双人网球就是世界所知的第二款模拟器类游戏,两个玩家通过游戏手柄控制游戏,这其实就是一个模拟网球游戏,但值得可喜的是示波器上能显示游戏画面了。到了1970和80年代,计算机图像技术虽然逐渐成熟,但是游戏作品少有模拟器类的拟真元素存在。到了80和90年代,随着计算机科学的不断发展,慢慢的带有模拟类的游戏就开始泛行了,其中模拟人生、模拟城市和命
13、令与征服系列,直到今天仍然受到众多玩家的喜爱。由于受到计算机的限制,那个时候的人们都是用在科研等领域,因为那时候计算机的计算能力还不足以支撑实时的模拟验算在上个世纪计算机模拟技术主要用于科学、电影特效等领域。这其中就包含了一些古老的模拟游戏,在经过一番画面升级和游戏内容丰富而焕然一新,模拟城市游戏里甚至每一个市民都变得有血有肉,而不再仅仅是游戏中的一个数字。在2012年前后全球范围内曾掀起了一阵模拟类游戏热潮,除了模拟城市、都市天际线等一系列的城建模拟游戏,还有一些模拟驾驶游戏,能让玩家体验到日常生活中很难体验到的驾驶体验。随着计算机技术的发展,模拟这一元素几乎成为了每一款游戏中不可缺少的部分
14、,模拟元素在游戏中的存在让玩家有了更好的沉浸感。有一句话就叫做学习知识最好的方法就是实践,游戏就提供了一个很好的平台,随着Unity3D、UE等游戏引擎的出现,制作游戏难度日益降低,有越来越多的人出于个人兴趣,去尝试着做一款属于独属于自己的游戏,有些玩家能在游戏中进行实践和学习;有的在各种千奇百怪的模拟器类游戏,甚至还有什么做饭模拟器等,享受更多的是一种娱乐;有的则可以在游戏中体验不一样的人生,更多是实现了在现实生活中实现不了的东西!1.3 论文组织结构游戏以学校所教的unity3d 引擎为基础,利用自己和老师教的知识进行游戏开发。论文记录游戏构思、设计和制作的过程,并且完美展示自己的所见所学
15、,证明自己的独到观点。第一部分:绪论,主要介绍设计该游戏的背景和目的,并且讨论模拟类游戏的过去,从而希望别人理解为什么会设计这款游戏第二部分:介绍开发这款游戏所做的准备、所需要的开发环境和开发工具第三部分:详细介绍游戏各个模块的设计和实现,根据设计这款游戏程序的模式,将这部分的说明分成不同小块来进行说明第四部分:游戏界面设计、声效设计第五部分:白盒测试、黑盒测试,打包后运行测试第六部分:从新论述一遍自己原先设计该游戏的目的和背景,回应开题第二章 开发工具2.1 Unity3D引擎2.1.1 关于Unity3D软件功能的介绍Unity3D是一款3D跨平台次时代游戏引擎。它提供了非常完美的跨平台系
16、统。平台之间的差别常常会影响到产品的开发速度和进度,因此大部分开发者们要在这上面花费大量的时间,而Unity3D则能够在近10种主流平台之间完美移植。同时Unity3D也提供了一个交互良好的操作界面,能够完美地在Windows和Mac OS下部署。该软件自带的五个工程视图框架能够很好地帮助设计者分类游戏中的对象及观察制作游戏的进程。其中包括project视图,该视图主要存放资源文件,hierarchy视图主要放置场景中具体的游戏对象,inspector视图主要用来描述游戏资源的信息,scene视图主要存放游戏中模型资源,game视图是用来观察已经完成的游戏的运行成果。Unity3D还为我们提供
17、了多种脚本语言编译的常用环境,用户可以根据需求将默认的编译环境做出调整。Unity3D支持C#、javascript、boo三种脚本语言。2.1.2 API接口Unity3D丰富的API能够帮你完成各种想要完成的需求。API是一些先定义好的函数,为开发人员基于某软件或硬件无需访问源码就能提供访问一组例程的能力,亦或理解内部工作机制的细节。Unity3D就有一套完整的API函数库,通过这些API函数,开发人员可以很方便地实现项目的初始化,功能模块的每帧调用,如何进行触发检测并进行触发事件的响应,如何判断是否进入触发区,是否在触发区,是否离开触发区,如何实现拖动事件的响应等。2.1.3 物理引擎任
18、何一个游戏的设计都需要其物体特性的合理性,这样才显得真实可信。U3D为开发人员提供了大量组件,可以对对象进行渲染,颜色的诱明度,平行光,点光源,法线贴图,图片,文字,动画,声音,材质等一系列组件可以带给我们很逼真的视觉效果,而在物理特性上添加的刚体,碰撞器等组件,可以实现使对象受到重力,摩擦力,空气阻力等自然物理特性的影响,而爬坡的坡度设定,碰撞后的一切物理变化,逼真的体验让你觉得这就是一个现实中的物体。2.1.4 Unity3D脚本生命周期Unity3D游戏引擎不像常规的程序直接在Main函数入口运行,而是在内部实现了自己的生命周期事件。通过对这些生命周期的事件进行写入,Unity内部就会不
19、断地迭代这些生命周期函数。下面按照脚本的执行顺序介绍游戏中比较常用的Unity事件函数。Awake():当游戏对象被初始化的时候调用,无论该对象是否已被激活。Start():在Awake事件后调用,但只有被激活的时候才能够执行。Update():游戏中的帧事件,因为游戏大部分都是按帧率来执行逻辑的。FixedUpdate():游戏的固定帧事件,基本同Update(),但该事件可由开发者去控制执行频率。LateUpdate():这个函数是在Update()函数在每帧执行结束后才会执行的函数,和Update类似,每帧都会执行一次,一般用来处理跟随逻辑,比如OnGUI():一般写UI逻辑,不过NGU
20、I出来后一般不使用,因为优化很差OnEnable():在Start事件后调用,只有被激活的时候才会执行。OnDisable():当游戏对象被禁止激活的时候会调用。OnDestroy():当游戏对象被销毁的时候执行。Unity3D的脚本基本上都会继承自于MonoBehavior基类。一般不继承于MonoBehavior的类会用来写一些工具类。通常来说,它在整个程序运行的过程中都是存在的,除非自己手动GC释放内存。2.1.5 图形用户界面本文主要使用NGUI和UGUI进行UI界面的开发,GUI是图形用户界面的英文简写。Unity的GUI系统被称作UnityGUI,UnityGUI能使你非常快捷简便
21、的添加功能齐备且种类繁多的界面元素,通过在GUI控件的创建操作中同时包括实例化,定位和功能定义。使你只需要一次性写出很少量的代码就能同时完成创建一个GUI界面元素实例,并定位实例在屏幕的位置和描述界面元素被激活时所要执行的脚本三种工作。UGUI是Unity内置的,NGUI则是一款为Unity游戏引擎开发的工具功能扩展的UI插件,它也能够为开发者提供方便快捷的UI设计方法,加快设计游戏的速度。2.1.6 Behavior DesignerBehavior Designer提供了强大的API,可以让你根据自己游戏内部的AI需求编写自己的AI脚本,而且还提供了一个直观的可视化编辑器,该可视化编辑器具
22、有广泛的第三方集成,可以创建复杂的AI,而无需编写任何代码。2.1.7 AssetStoreUnity Technologies和其他社区成员会不断地创作免费的和商用的资源,而Unity资源商店则是这些资源收录的宝库。里面有各种各样的资源可供使用,包含了从纹理,模型和动画到整个示例项目,教程和编辑器插件等内容。在Unity编辑器的内置接口中可以访问到这些资源,它们可供下载并直接导入到你的项目中去。这里我们游戏中大部分使用的模型都会从资源商店中下载,而不是使用建模软件自己动手做,那样花费大量的时间。2.2 C#语言C#是微软公司发布的一种运行于.NET Framework之上,面向对象的高级程序
23、设计语言。C#与Java类似,是一种语言,一种工具。但这里需要知道Unity是跨平台的,而C#并不是一种跨平台的语言。只是由于Mono的的重新实现,使得Unity能够使用C#来开发,因此,我们可以在Unity上写C#的代码。语法明了,类库使用方便,是C#的优点,也是我们在Unity开发中首先考虑的语言。2.3 Visual Studio 2017Visual Studio 2017是微软公司推出的开发环境。它支持最新的集成环境开发。Visual Studio也带来了NET Framework4.6、Microsoft Visual Studio 2017 CTP,同时也支持开发者开发Windo
24、ws的应用程序。并且支持SQL Sever,IBM,Oracle数据库等。第三章 游戏玩法设计3.1 场景设计主要分为场景1和场景2,场景1主要是游戏开始界面,主要是给带来玩家一个引导作用,当玩家点击开始游戏跳转进入场景2,场景2是游戏的主体玩法部分。场景1主要组成部分:开始游戏按钮、退出游戏按钮、加载界面场景2主要组成部分:平地、高山、花、草、树木、竹林、动物3.1.1 场景的制作Unity中自带地形创建工具,我们可以在Hierarchy面板中Create-3D Object-Terrain这样来创建一个平面的地形,然后在检查器界面对地形进行改造、改变地面材质和添加花草树木。图3-1 地形绘
25、制改造界面狩猎模拟器游戏地图,为了经量模拟真实世界环境,使用了9块地形来拼成一个大地图,这里只有中间的地形作为玩家可以进入的地形,而游戏也围绕这里开展,其他8块地形只作为远景地形,也就是玩家只能看到而不能走进去,中间那一块四周将会使用空气墙把玩家隔离,防止玩家走进其他只是作为景色的地形。图3-2 创建好的地形为了让玩家更加身临其境,我们可以为地形添加一些树木和花草,让森林变的更加真实,这里我们直接使用unity自带的地形编辑器,为我们的地形进行批量的添加花草树木图3-3 环境绘制3.2 Player制作3.2.1 物理抖动为了模拟现实中人物在移动和瞄准的时候明显的感觉自己在抖动,这个抖动会分别
26、使用相机和手的左右抖动来模拟,也就是当Player在游戏里进行移动的时候,我们的镜头和手也会跟着抖动,而进入瞄准状态的时候玩家会更明显的感觉到瞄准镜的抖动。上面说明了物理抖动的实现原理,接下来我们来编写脚本以实现我们镜头抖动。首先create-script创建脚本FPSController,接下来实现如下:1. localCameraRotationOffset=Vector3.Lerp(localCameraRotationOffset,Vector3.zero,Time.deltaTime*3);/相机本地旋转值还原2. floatswayY=(Mathf.Cos(Time.fixedTi
27、me*10*swaySpeed)*0.3f)*sizeY;3. floatswayX=(Mathf.Sin(Time.fixedTime*5*swaySpeed)*0.2f)*sizeX;4. FPSCamera.gameObject.transform.localPosition=Vector3.Lerp(FPSCamera.gameObject.transform.localPosition,5. localCameraPositionTemp+newVector3(swayX,swayY,0),6. Time.deltaTime*3);/瞄准镜头位置设置7. FPSCamera.game
28、Object.transform.localRotation=Quaternion.Lerp(FPSCamera.gameObject.transform.localRotation,8. Quaternion.Euler(localCameraRotationTemp.eulerAngles+localCameraRotationOffset),9. Time.deltaTime*3);/瞄准镜头旋转角度设置接下来是手的抖动,因为该游戏里面手是连着枪的,所以我们直接在枪的脚本里写手的物理抖动,同样create-script先创建脚本Gun,然后实现如下:1. floatswayY=(Math
29、f.Cos(Time.time*10*swaySpeed)*0.3f)*sizeY;2. floatswayX=(Mathf.Sin(Time.time*5*swaySpeed)*0.2f)*sizeX;3. this.transform.localPosition=Vector3.Lerp(this.transform.localPosition,4. positionTemp+newVector3(swayX,swayY,0),Time.fixedDeltaTime*4);5. this.transform.localRotation=Quaternion.Lerp(this.transf
30、orm.localRotation,6. Quaternion.Euler(rotationTemp.eulerAngles.x+(FPSmotor.rotationDif.x),7. (rotationTemp.eulerAngles.y+(FPSmotor.rotationDif.y),8. (rotationTemp.eulerAngles.z+(FPSmotor.direction.x*7),Time.fixedDeltaTime*3);3.2.2 FPS功能FPS功能就是指开镜功能,当我们使用FPS功能时,就会举起枪打开单筒望远镜,而镜头会切换到瞄准镜头,玩家也就可以看的更远。这里我
31、们创建两个相机create - camera,一个是正常的相机,深度为1,可以看到自己和枪,也就是模拟正常人观看视角的相机,另一个相机将深度设置为2,设置为只能看到枪,当我们点击鼠标右键时就会渲染第二个相机用来覆盖第一个相机,再次点击鼠标右键则可以关闭渲染,变回原来的镜头。图3-4正常相机镜头图3-5 FPS相机镜头功能我们在脚本FPSController里面实现,下面实现开镜时人物动画的播放判断处理,代码如下:1. if(HideGunWhileZooming&FPSmotor&NormalCamera.GetComponent().enabled)2. 3. FPSmotor.HideGu
32、n(!Zooming);4. 5. 6. if(!GetComponent()|!Active)7. return;8. 9. switch(gunState)10. 11. case0:12. if(AmmoIn0)16. 17. GetComponent().clip=GetComponent()BoltPose.clip;18. GetComponent().CrossFade(BoltPose,0.5f,PlayMode.StopAll);19. gunState=2;20. if(FPSmotor&Zooming)21. 22. FPSmotor.CameraForceRotatio
33、n(newVector3(0,0,20);23. FPSmotor.Stun(0.2f);24. 25. 26. 27. break;28. case1:29. if(Time.time=cooldowntime+CooldownTime)30. 31. gunState=0;32. 33. break;34. case2:35. GetComponent().Play();36. if(GetComponent()BoltPose.normalizedTimeBoltTime)37. 38. if(Shell&ShellSpawn)39. 40. if(!boltout)41. 42. if
34、(FPSmotor&Zooming)43. 44. FPSmotor.CameraForceRotation(newVector3(0,0,-5);45. FPSmotor.Stun(0.1f);46. 47. 48. 49. 50. break;51. 这里对镜头的切换进行平缓处理,开镜的时候可以明显的看到镜头向前平移,然后再覆盖掉正常镜头,代码实现如下:1. if(FPSmotor)2. 3. if(Zooming)4. 5. FPSmotor.sensitivityXMult=MouseSensitiveZoom;6. FPSmotor.sensitivityYMult=MouseSen
35、sitiveZoom;7. FPSmotor.Noise=true;8. 9. else10. 11. FPSmotor.sensitivityXMult=MouseSensitive;12. FPSmotor.sensitivityYMult=MouseSensitive;13. FPSmotor.Noise=false;14. 15. 16. 17. if(Zooming)18. 19. if(ZoomFOVLists.Length0)20. 21. MouseSensitiveZoom=(MouseSensitive*0.16f)/10)*ZoomFOVListsIndexZoom;22
36、. NormalCamera.GetComponent().fieldOfView+=(ZoomFOVListsIndexZoom-NormalCamera.GetComponent().fieldOfView)/10;23. 24. 25. else26. 27. NormalCamera.GetComponent().fieldOfView+=(fovTemp-NormalCamera.GetComponent().fieldOfView)/10;28. 开镜的UI处理,这里我们直接在OnGUI函数里面编写实现,代码如下:1. voidOnGUI()2. 3. if(!Active)4.
37、return;5. 6. if(NormalCamera.GetComponent().enabled)7. 8. if(!Zooming)9. 10. if(CrosshairImg)11. 12. GUI.color=newColor(1,1,1,0.8f);13. GUI.DrawTexture(newRect(Screen.width*0.5f)-(CrosshairImg.width*0.5f),(Screen.height*0.5f)-(CrosshairImg.height*0.5f),CrosshairImg.width,CrosshairImg.height),Crossha
38、irImg);14. GUI.color=Color.white;15. 16. 17. else18. 19. scale.x=Screen.width/originalWidth;/calculatehorscale20. scale.y=Screen.height/originalHeight;/calculatevertscale21. scale.z=1.0f;22. varsvMat=GUI.matrix;23. GUI.matrix=Matrix4x4.TRS(Vector3.zero,Quaternion.identity,scale);24. if(CrosshairZoom
39、)25. 26. floatscopeSize=(Screen.height*1.1f);27. GUI.DrawTexture(newRect(0,0,originalWidth,originalHeight),CrosshairZoom);28. 29. GUI.matrix=svMat;30. 31. 32. 33. 3.2.3 射击功能本游戏将只使用一把枪进行游戏,这把枪可以设置射出的子弹速度、发射间隔、攻击力等。图3-6 玩家使用的武器枪主要的功能就是发射子弹,接下来我们就来实现这个功能,我们直接打开Gun脚本来进行编写,因为发射子弹是单独的一个功能,我们可以写一个发射子弹的方法,命名为Shoot(),代码实现如下:1. publicvoidShoot()2. 3. if(!Active)4. return;5. 6. if(timefire+FireRate0)11. 12. if(FPSmotor)13. FPSmotor.Stun(KickPower);14. if(SoundGunFire&audiosource!=null)15. 16. if(PlayerPrefs.GetInt(FX)=1)17. audiosource.PlayOneShot(SoundGunFire);18
限制150内