基于Unity3d的模拟冲浪游戏的设计与实现.docx
本科毕业设计(论文) 基于Unity3d的模拟冲浪游戏的设计与实现Design and Implementation of Simulation Surfing Game Based on Unity3D 院 (系)计算科学院专 业软件工程班 级五班学 号16210120532学生姓名陈意统指导教师王千秋提交日期2020年4月22日内容摘要随着科技时代的飞速提升,人们的生活水平发生了重大的变革,许多人会亲自体验生活中不常去的地方如海边、沙滩、雪地,深山等,又如一些生活中少体验的钓鱼、滑雪、冲浪等,但不是每个人都能亲自去体验,然而现代发达的游戏制作水平却可以弥补人们生活中一些遗憾。如今游戏和虚拟现实事业蓬勃发展,受到越来越多人的关注和喜爱,模拟类游戏允许玩家自由控制游戏中的人或事物,通过体验生活中一些比较难去体验的娱乐或生存方法。该类游戏不仅仅能够锻炼到人的反应速度,更重要的是提高人对自己未用过或用的较少的物品的认知以及人的生存常识等等,非常适合大众的需求。Unity3D作为一款能够快速开发和上手的游戏开发引擎在市场上逐步升温。本论文探究基于Unity3D的模拟冲浪游戏的开发,这不仅仅是一款模拟冲浪类游戏,区别真实的冲浪的体验但却能给人带来自己未曾体验过的愉悦同时可以通过游戏给人们带来冲浪的知识以及冲浪需要的设备、安全注意等。游戏难度适中,游戏的海浪以及海浪的冲击波会给人带来刺激感以及被海浪冲进水里的胆怯与畏惧,同时玩家可以通过教程学习一些基础冲浪技巧,去挑战更难的冲浪地点。现在人们为了消除平时工作和生活的乏累,会选择更多这类刺激而且能带来成就感的游戏,因此,模拟类游戏拥有可观的发展前景。本文主要描述了该游戏的开发原理,游戏的设计与实现以及游戏功能测试等。为后续希望开发同类游戏的开发者提供借鉴与参考。关键词:Unity3D 3D水流 冲浪游戏AbstractWith the rapid development of science and technology, great changes have taken place in people's living standards. Many people will personally experience the places they don't often go to in life, such as the seaside, beach, snow, deep mountain, etc., as well as some fishing, skiing, surfing, etc., which are rarely experienced in life, but not everyone can experience them in person. However, the modern developed game production level can make up for people's life Some regrets. Nowadays, game and virtual reality are booming, and more and more people pay attention to and love them. Simulation games allow players to freely control people or things in the game, and experience some entertainment or survival methods that are difficult to experience in life. This kind of game can not only train people's reaction speed, but also improve people's cognition of the unused or less used items and people's survival knowledge, which is very suitable for the needs of the public.Unity3d, as a game development engine that can be developed and started quickly, is gradually warming up in the market. This paper explores the development of the simulation surfing game based on unity3d, which is not only a simulation surfing game, but also a real surfing experience that can bring people pleasure that they have never experienced. At the same time, it can bring people the knowledge of surfing, the equipment needed for surfing, safety attention, etc. through the game. The difficulty of the game is moderate. The waves of the game and the shockwaves of the waves will give people a sense of stimulation and the timidity and fear of being swept into the water by the waves. At the same time, players can learn some basic surfing skills through the course to challenge more difficult surfing places. Nowadays, in order to eliminate the tiredness of daily work and life, people will choose more games that stimulate and bring a sense of achievement. Therefore, simulation games have a considerable development prospect. This paper mainly describes the development principle of the game, the design and implementation of the game and the function test of the game. For the future developers who want to develop similar games to provide reference and reference.Keywords:Unity3D 3D water surfing game目录第一章绪论11.1选题的目的和意义11.2国内外研究现状11.3论文组织结构2第二章开发工具介绍32.1Unity3D游戏引擎32.1.1Unity3D软件介绍32.1.2API接口32.1.3物理引擎32.1.4Unity常用生命周期的函数42.1.5GUI(图形用户界面)42.23Ds Max软件42.3C#开发语言52.4系统开发运行环境5第三章游戏需求分析63.1游戏基本介绍63.1.1游戏基本功能63.2需求分析73.2.1市场需求73.2.2用户需求83.3场景模型的搭建113.4地图以及人物说明143.5游戏中的碰撞检测173.6鼠标与屏幕交互183.7添加背景音乐及游戏音效20第四章游戏设计与实现224.1游戏界面设计224.1.1菜单界面功能224.1.2菜单界面的制作234.1.3游戏结束界面功能234.1.4游戏结束界面的制作234.2游戏人物设计274.2.1导入模型74.2.2人物运动的实现84.2.3冲浪板AI94.3游戏功能设计294.3.1属性界面功能294.3.2属性界面的制作304.4游戏界面制作314.4.1小地图功能314.4.2小地图的制作324.5游戏游戏功能344.6游戏的打包和导出34第五章游戏测试36第六章总结38参考文献39致谢40广东东软学院本科毕业设计(论文)第一章 绪论1.1 选题的目的和意义如今社会的计算机科学技术的发展,电子游戏的丰富多样,大众开始对游戏的娱乐性需求逐渐增高,以及对游戏的即时娱乐需求,人们开始对2D的平面游戏感到不够真实,追求真实的感官体验成为当今游戏发展的趋势,随着科技的不断发展,计算机和手机的不断普及,各种各样的游戏应用也层出不穷。而在人们背负着众多压力的生活中,游戏应用的出世无疑是一剂调味品,让人们可以适当的释放生活压力,增加人们的生活乐趣。休闲类游戏是目前最受欢迎的游戏类型之一,它经过多年的发展,变得更加完善,不同种类的游戏使得用户得到更多的体验。选择unity是由于Unity是一个可以让玩家轻松建立如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。并且unity可以发布游戏到多个平台,Android就是其中一种。休闲类游戏可以在休息的时间内以玩的方式得到身心的放松和调节,从而达到让体能得到恢复、身心保持愉悦的目的的一种业余生活游戏。休闲类游戏上手很快,不需要长时间进行,可以随时随地停止游戏,并且有较高的娱乐性,是非常适合和满足大众的需求的。1.2 国内外研究现状冲浪最初是由波利尼亚人的一种古老运动发展而来,他们部落中的酋长是一个技术最好的冲浪选手,并且拥有用最好树木制作的最好冲浪板,最初冲浪对一般阶级的民众来说是十分向往的运动,因为统治阶层拥有最好的海滩和板子,导致一般人不敢冒险在海浪凶险的地方以及没有沙滩的地方都不适合冲浪,但随着时间的推移,人们可以通过高超的冲浪技术来获得这些特权,同时也意味着冲浪运动开始向基层民众开放,欧洲人是最早目击冲浪的,在1767年由Dolphin的一名船员在大溪地记载。之后又由Jame King中尉在1779年在库克船长的日记中发现冲浪的艺术。在科克发现这种冲浪运动的几十年后,在1912年的奥运会中,哈摩库得了游泳冠军,在他的大力提倡下冲浪运动才开始在美国流行起来并推广,如今最流行的几个冲浪地区就有美国的夏威夷,以及北美、秘鲁、澳大利亚和南非都开始流行冲浪,并且逐步发展为有世界级冲浪锦标赛的运动冲浪是以海浪为动力的极限运动,冲浪者在海边有适当海浪的地方俯卧休息或在冲浪板上等待海浪,当有适当海浪时,海浪的动力会使冲浪板运动冲浪者通过俯卧调整冲浪板方向和划水的方式获得更多的动力,当动力足够时冲浪者起身,保持站立,且双腿微屈,让其获得更多的重心在身上。冲浪可以让人们暂时忘掉自己的不愉快,体验与大自然力量的接触,与海浪搏击,体验在一下别在海上实现水上漂的快感,这也许也是许多人为了寻找一处冲浪胜地而到处奔波的理由吧。随着时代的进步人们因为工作等原因,许多人无法好好地休息放松一下自己,所以人们开始在网络中寻找放松,2000年后随着最初红白机等游戏的过时网络游戏开始盛行,如今许多网络游戏发展迅速,成为当今游戏产业中规模最大的一类,然而这些也开始随着时间的发展被人们玩腻,大多数的RPG类和刷副本类闯关游戏过于丰满人们开始研究新的游戏类型,如3D极限飞车和3D竞技类运动游戏开始盛行,开发商开始寻找新的突破口,向各类运动类游戏进行开放。随着一些设备和硬件、软件的日益增强,人们的娱乐范围也开始从PC端向移动端扩展。3D互动娱乐游戏也开始在手机领域盛行,由于移动端的操作系统较多如Android、IOS等,为了保证开放的软件有较强的移植性,许多的开放引擎都逐步拓展自己的适用范围,从最开始的PC端开始向其他平台发展,如今最为突出的开发引擎便是Unity3D,该引擎适用多个平台,移植性强。但国内的跨平台技术仍然处于较低的阶段,通过该引擎可以实现较快的跨平台实现。1.3 论文组织结构 论文从最初构思到游戏的分析实践,结合专业3D开发资料,设计一款冲浪的游戏,其中具体介绍了游戏制作的基本步骤以及游戏的系统功能设计和功能代码编写等。论文分为六章,各章节安排如下: 第一部分:绪论,主要阐述了该毕业设计制作的背景、国内外对相关课题的研究现状以及本设计的大概介绍; 第二部分:介绍了本文制作游戏使用的各类开发工具和Unity3D的大致介绍;第三部分:详细介绍游戏的各个模块的制作,清晰明确游戏内部关系,采用由下到上的顺序层层拆析步骤; 第四部分:冲浪游戏的系统功能设计和界面设计; 第五部分:运行游戏进行测试,打包封装;第六部分:结论以及游戏不足和游戏今后改进。第二章 开发工具介绍2.1 Unity3D游戏引擎2.1.1 Unity3D软件介绍游戏引擎提供了足够的功能,这些功能在许多不同的游戏中都很有用。因此,通过使用该引擎,只要添加自定义的艺术资源并添加自己的游戏代码,就可以轻松获得这些功能,从而实现一款游戏。Unity3D包括物理模拟、普通地图、屏幕空间环境光照明暗处理、动态阴影等。许多游戏引擎都为自己的许多功能感到骄傲,但Unity3D与其他尖端游戏开发工具相比有两个主要优势:提供极为高效的视觉工作流和多维跨平台支持。可视化工作流是一种非常独特的设计,它不同于其他大多数游戏开发环境。由于其他游戏开发工具通常会将不可避免会引起争议的无关部分混合在一起,或者需要建立自己的编程类库、构建链等旧的集成开发环境设计,因此Unity3D中的开发工作流是通过精心设计的可视化编辑器来定位的。这些编辑器用于布局游戏中的场景,将艺术资源绑定在一起,并对交互式对象进行编码。这些编辑器的优点在于,它们可以让您快速高效地构建专业和高质量的游戏。当你需要在视频游戏中使用大量的新技术时,它们将为你提供难以置信的高效工具。编译器对于快速迭代和在原型和测试周期中优化游戏非常有用。您可以在编译器中调整动物对象,甚至在游戏运行时移动对象。此外,Unity3D允许您通过脚本自定义编辑器,因此可以向界面添加一些新功能或菜单。除了编译器的优点外,Unity3D的工具集成还提供了高度的跨平台支持。它不仅在部署目标上是跨平台的(可以部署到PC、wed、移动设备或游戏机上),还包括跨平台开发工具(可以在windows或Mac OS上开发游戏)。API接口2.1.2 API接口Unity3D中有丰富的API接口可以帮助你完成各种需要的功能,API是预定义的函数,应用程序和开发人员都可以使用这些函数来访问基于某些软件或硬件的代码功能使用,而不需要在源代码中寻找,这样会十分耗时,或者用于了解其中的工作机制,由于Unity自己的用户量较多,许多人会提供自己优质的API函数方法,便于多数Unity初学者或找不到实现方法的人使用,这也使得Unity拥有一套完整的API函数库,开发人员可以通过函数库便捷的实现项目的一些初始化工作,而不需要自己打基础的函数代码,API函数库中有许多功能模块,如碰撞检测的基本用法,音效播放的基本实现、人物动画配置函数,触发区和非触发区等判定方法,Unity开发的各种功能的基础调用都有。2.1.3 物理引擎不管什么游戏,其设计都是需要使对象特征合理,让游戏更为真实,实现身临其境的效果,Unity中提供了各种各样的组件和插件,目的就是为了可以让游戏的对象通过渲染和色彩的变化、平行光、点光源的摆放、游戏贴图使用、文字、动画加入、声音的配置、材质更换等,这些组件都可以增加游戏的真实性,为玩家带来视觉效果的真实,为人物、地图、障碍物金币等游戏对象添加组织实现阻力,碰撞检测、碰撞阻碍及改变人物运动路线等,让玩家有更真实地体验,让你觉得这是一个真实存在的物体。其中比较常用的组件如Audio Source、collider等2.1.4 Unity常用生命周期的函数Unity3D游戏开发引擎和常规程序开发不同在Main函数的入口运行,它是在内部实现Unity的生命周期事件,通过给各个生命周期赋予方法来实现游戏的基本生命周期,在Update中可以不断地更新迭代这些生命周期函数,从而实现游戏地不断判定。下面介绍一些Unity中比较常用的事件函数。OnGUI():当游戏结束失败或胜利时通过该函数实现胜利或失败地标志显示。Start():在游戏开始时运行的事件如游戏暂停获取其他物体参数为初始参数赋值等。Update():游戏帧事件,在其中写入的方法和事件会不断进行无法被停止。OnClick ():Unity自带脚本功能,用于Button上的检测实现游戏的物体隐藏和显示,实现游戏的点击场景跳转和游戏菜单实现。OnEnable():在Start事件后调用,只有被激活的时候才会执行。OnTriggerEnter():游戏碰撞检测函数,用于检测游戏金币及人物等碰撞的检测。OnDestroy():在游戏中对游戏对象进行销毁通常可以写在物体本身身上用于自身的销毁,同时也可以对碰撞物体的销毁,这种一般写在角色身上。Unity3D中脚本多数是继承Mono行为基类,通常不需要继承该类来编写一些工具类因为大多数类都已经实现,在Unity运行的过程中都会存在,除非开发人员需要自己释放内存,否则不需要人为编写工具类。2.1.5 GUI(图形用户界面)该项目中使用Unity自带的UI开发工具即GUI。Unity的GUI系统称为Unity GUI。Unity GUI使您能够快速轻松地添加各种具有完整功能的界面元素,包括在创建GUI控件时的实例化、定位和功能定义。通过这种方式,您可以通过一次编写少量代码同时创建一个GUI接口元素实例,并在屏幕上找到实例的位置,描述激活接口元素时要执行的脚本。UGUI内置于Unity中。与NGUI相比,它是一个UI插件,Unity本身自带的UI开发功能少了一些,因此可以导入NGUI的UnityUI的拓展插件,它可以提高开发者的界面设计速度以及加快游戏开发的进程。2.2 3Ds Max软件3Ds Max全称是3D studio Max,该软件是由discreet公司开发的,主要用于电脑端的一些三维动画制作以及三维模型制作 ,通常在游戏和一些设计领域使用较多,游戏开发中许多模型的骨骼以及模型的画质等都可以通过该软件实现提升与拓展,在一些设计物体形状中有十分大的帮助,可以不断地进行修改模型的点线面等,以及对模型进行各种渲染实现物体的平滑,该软件最初的目的是实现电脑游戏动画的制作,然后再慢慢发展到如今,许多建造领域都或多或少需要了解,能为建造设计带来许多便利而在这里只做简单的介绍,由于游戏模型制作相对耗时,所以不选择用3Ds Max进行建模,项目中的模型选自一些网上素材和Unity商城中,但为了保证模型在加载过程中不出现意外情况,将游戏模型导入该软件中进行核对,保证模型不会有过大的漏洞2.3 C#开发语言C#是当今开发软件以及游戏系统等常用的开发语言,是由微软发布的高级编程语言 ,它与java语言的编写代码类似,但它有更强大的功能,因为Unity软件实现的是跨平台,而C#本身不是跨平台的开发语言,但在Unity中C#可以通过Mono的重实现,使得该语言可以在Unity中跨平台使用,而且C#有许多优点,相对其他开发语言来说,C#的语法更明了且各种类的库使用方便,在Unity开发中C#明显是一种首选的开发语言2.4 Visual Studio 2017Visual Studio 2017是现版本系统中较为常用的编程软件,由微软公司自主研发,十分适合Unity的开发只需用using加入Unity本身的一些UI和UnityEngine便可以很快速地进行代码编写,而且该软件中支持集成开发,也支持开发相应的Windows程序,Visual Studio中各种报错提示以及编写代码的辅助功能都十分适合Unity开发。第三章 游戏设计3.1 场景设计 系统包括场景1_menu和场景gameScene,场景gameScene为游戏的主场景,即玩家进行游戏的场景。场景中的对象有:地形:对象都在这上面进行活动,还包括一些水流和波浪。游戏对象:即人物、冲浪板和金币。特殊道具:有排球,人物角色拾取可以获得少许能量。其他物体:障碍物。3.1.1 场景的制作Unity商城中寻找需要的地图类型,由于考虑游戏本身在水中进行,所以在商城中找到相应的水流效果Low Poly Water GPU,并导入进项目中,通过网上教程制作游戏道路点击Edit Details就可以为这些物体选择相应的贴图。综合运用,就产生了本项目的地形,如图3-1所示。图3-1 创建好的地形在游戏地图中放置一些其他的游戏物体,用来丰富游戏场景,如金币,障碍物,还有排球等,其中为水面上的金币添加脚本使其旋转便于玩家分辨和充实游戏了,只要玩家穿过金币,就会获得然后播放音效然后销毁游戏对象,如图3-2所示。图3-2 添加了游戏物体的游戏场景3.2 人物和冲浪板创建游戏人物及物体并导入游戏项目中,实现人物的运动和人物跳跃管理3.2.1 导入模型首先将玩家控制的游戏对象设计出来,即主角,人物模型在项目前期已进行收集,U3D支持的模型类型是fbx,所以在导入人物模型前可以将人物模型的格式确认,如果不是该类型可以将其导进3DMax中再将其转换为fbx类型格式,如此便可以导入到U3D中使用直接将模型拖入Project面板即完成导入,如图3-3所示。图3-3 人物模型3.2.2 人物运动的实现Unity中导入游戏角色对象,调整角色大小,为角色添加相应的刚体Rigidbody以及碰撞体Collider保证角色有真实的物理属性以及让它能够被游戏中的其他物体检测Unity默认的脚本编辑器设置为VS2017。当人物的基本配置实现时,为它编写玩家控制角色的运动脚本moveController.cs,使玩家能够控制角色的基本移动如左右移动和加速等,由于使用的方法类型为Horizontal,因此人物的基本移动可以通过键盘的上下左右和WADS控制,空格键对应人物的跳跃人物无法进行二次跳跃。移动使用的方法是transform.Translate(),加速的方法是moveVSpeed += 0.1f。1. using UnityEngine;2. using System.Collections;3. using System.Collections.Generic;4. using System;5.6. public class moveController : MonoBehaviour 7. / 摄像机位置8. public Transform cameraTransform;9. / 摄像机距离人物的距离10. public float cameraDistance;11. / 游戏管理器12. public GameManager gameManager;13. / 前进移动速度14. float moveVSpeed;15. / 水平移动速度16. public float moveHSpeed = 5.0f;17. / 跳跃高度18. public float jumpHeight = 5.0f;19. / 动画播放器20. Animator m_animator;21. / 起跳时间22. double m_jumpBeginTime;23. / 跳跃标志24. int m_jumpState = 0;25. / 最大速度26. public float maxVSpeed = 8.0f;27. / 最小速度28. public float minVSpeed = 5.0f;29. public AudioClip impact;30. AudioSource audioSource;31.32.33. / Use this for initialization34. void Start () 35. GetComponent<Rigidbody>().freezeRotation = true;36. m_animator = GetComponent<Animator>();37. if (m_animator = null)38. print("null");39. moveVSpeed = minVSpeed;40. audioSource = GetComponent<AudioSource>();41. 42. 43. / Update is called once per frame44. void Update () 45. / 游戏结束46. if (gameManager.isEnd)47. 48. Time.timeScale = 0;49. 50. AnimatorStateInfo stateInfo = m_animator.GetCurrentAnimatorStateInfo(0);51. if (stateInfo.fullPathHash = Animator.StringToHash("Base Layer.run")52. 53. m_jumpState = 0;54. if (Input.GetButton("Jump")55. 56. / 起跳57. m_animator.SetBool("Jump", true);58. m_jumpBeginTime = m_animator.recorderStartTime;59. 60. else61. 62. / 到地面63. 64. 65. else66. 67. double nowTime = m_animator.recorderStartTime;68. double deltaTime = nowTime - m_jumpBeginTime;69.70. / 掉下71. m_jumpState = 1;72. m_animator.SetBool("Jump", false);73. 74. float h = Input.GetAxis("Horizontal");75. Vector3 vSpeed = new Vector3(this.transform.forward.x, this.transform.forward.y, this.transform.forward.z) * moveVSpeed ;76. Vector3 hSpeed = new Vector3(this.transform.right.x, this.transform.right.y, this.transform.right.z) * moveHSpeed * h;77. Vector3 jumpSpeed = new Vector3(this.transform.up.x, this.transform.up.y, this.transform.up.z) * jumpHeight * m_jumpState;78. Vector3 vCameraSpeed = new Vector3(this.transform.forward.x, this.transform.forward.y, this.transform.forward.z) * minVSpeed;79. 80. 3.2.3 人物AI人物初始化运动速度为5f,人物碰撞障碍物会导致速度减少,但相对的摄像机离人物较近且无障碍时,人物会加速行驶使其保持在屏幕中央。制作得分统计即Coins,在脚本中声明一个公有数coins将它的初始值设为0,然后在赋予金币的得分参数,编写一个得分脚本让其统计Coin的数量并使其显示在游戏界面的上方1. using UnityEngine;2. using System.Collections;3. using System.Collections.Generic;4. using System;5.6. public class moveController : MonoBehaviour 7. / 摄像机位置8. public Transform cameraTransform;9. / 摄像机距离人物的距离10. public float cameraDistance;11. / 游戏管理器12. public GameManager gameManager;13. / 前进移动速度14. float moveVSpeed;15. / 水平移动速度16. public float moveHSpeed = 5.0f;17. / 跳跃高度18. public float jumpHeight = 5.0f;19. / 动画播放器20. Animator m_animator;21. / 起跳时间22. double m_jumpBeginTime;23. / 跳跃标志24. int m_jumpState = 0;25. / 最大速度26. public float maxVSpeed = 8.0f;27. / 最小速度28. public float minVSpeed = 5.0f;29. public AudioClip impact;30. AudioSource audioSource;31.32.33. / Use this for initialization34. void Start () 35. GetComponent<Rigidbody>().freezeRotation = true;36. m_animator = GetComponent<Animator>();37. if (m_animator = null)38. print("null");39. moveVSpeed = minVSpeed;40. audioSource = GetComponent<AudioSource>();41. 42. 43. / Update is called once per frame44. void Update () 45. / 游戏结束46. if (gameManager.isEnd)47. 48. Time.timeScale = 0;49. 50. AnimatorStateInfo stateInfo = m_animator.GetCurrentAnimatorStateInfo(0);51. if (stateInfo.fullPathHash = Animator.StringToHash("Base Layer.run")52. 53. m_jumpState = 0;54. if (Input.GetButton("Jump")55. 56. / 起跳57. m_animator.SetBool("Jump", true);58. m_jumpBeginTime = m_animator.recorderStartTime;59. 60. else61. 62. / 到地面63. 64. 65. else66. 67. double nowTime = m_animator.recorderStartTime;68. double delt