卢杰基于~Unity3D的坦克大战游戏的设计实现分析

卢杰基于~Unity3D的坦克大战游戏的设计实现分析

ID:47372074

大小:2.76 MB

页数:35页

时间:2019-07-23

上传者:U-21680
卢杰基于~Unity3D的坦克大战游戏的设计实现分析_第1页
卢杰基于~Unity3D的坦克大战游戏的设计实现分析_第2页
卢杰基于~Unity3D的坦克大战游戏的设计实现分析_第3页
卢杰基于~Unity3D的坦克大战游戏的设计实现分析_第4页
卢杰基于~Unity3D的坦克大战游戏的设计实现分析_第5页
资源描述:

《卢杰基于~Unity3D的坦克大战游戏的设计实现分析》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

毕业实训报告课题名称:基于Unity3d的坦克大战游戏的设计与实现专业:软件技术班级:RZ软技154学号:201560190410学生姓名:卢杰指导教师:赵冬2017年5月15日 关于卢杰同学的实训鉴定同学于年月日至年月日在我公司部门进行了毕业实训。在实训中,该同学在单位签章:指导教师签字:年月日 中原工学院毕业实训任务书2017年2月13日学生姓名卢杰学号201560190410专业软件技术班级RZ软技154课题名称基于Unity3D的坦克大战游戏的设计与实现课题来源实训公司指导教师张鑫宇,李星辰第二个应该写我专业Unity3D职称讲师课题说明:该系统利用Unity3D跨平台功能的突出、兼容性强的特点,结合C#开发一款坦克大战的游戏系统,画面好看,游戏方式简单,玩家易上手。承担的任务:寻找素材搭建场景,并编写相应功能的代码这个太简单了工作进度安排:第4周:(3月6号-3月10号)确定题目第5周:(3月13号-3月17号)寻找素材第6周:(3月20号-3月24号)对相应功能进行编码第7周:(3月27号-3月31号)对相应功能进行编码第8周:(4月3号-4月7号)查找BUG并优化项目任务要写到第13周指导教师签字:年月日实训单位意见签章:年月日学院意见签章:年月日 中原工学院毕业实训评审表学号201560190410姓名卢杰专业软件技术班级RZ软技154题目基于Unity3D的坦克大战游戏的设计与实现 指导教师评语 成绩(百分制):指导教师签名:年月日摘要本文利用Unity3D跨平台功能的突出、兼容性强的特点,结合C#开发一款坦克大战的游戏系统,该系统运行流畅,具有较好的可玩性和跨平台性。 课题题目为基于Unity3D的坦克大战游戏的射击与开发,旨在成功的设计出一款可以在PC端运行的坦克游戏,在毕业设计完成时,坦克模型应该能再PC端运行。游戏中,我们可以利用鼠标、键盘来对我们的坦克进行前进后退,而且可以对坦克进行旋转以及发射炮弹,通过这次设计,自己也体验了技术实现的过程。关键词:Unity3D;坦克大战游戏;游戏引擎 目录摘要V第1章项目概述11.1项目背景11.2技术路线11.2.1游戏设计与制作阶段11.2.2开发环境11.3项目设计目标2第2章系统设计32.1系统的整体设计32.2系统的界面设计32.2.1游戏主菜单32.2.2游戏帮助界面42.2.3游戏结束界面42.2.4游戏主界面52.2.5主角模型52.2.6敌人模型62.2.7游戏地图模型6第3章游戏菜单界面实现83.1按钮的实现83.2游戏主菜单界面的实现83.2.1说明按钮83.2.2退出按钮83.2.3游戏开始按钮83.3游戏帮助界面的实现93.3.1关闭按钮93.3.2游戏帮助文字93.4游戏结束界面的实现93.4.1重新开始按钮93.4.2退出游戏按钮103.4.3分数显示103.5游戏主界面的实现103.5.1重置按钮103.5.2退出按钮11 3.5.2游戏得分11第4章游戏主界面实现124.1场景的搭建124.2主角的功能实现124.2.1移动124.2.2攻击124.2.3受到伤害134.3摄像机的功能实现144.3.1移动144.3.2围绕主角旋转144.3.3视野的拉近或拉远154.4敌人的功能实现154.4.1生成154.4.2移动164.4.3攻击174.4.4受伤174.5炮弹的碰撞检测184.5.1炮弹的身份184.5.1碰撞检测18第5章系统测试205.1在Unity3D中运行测试205.2在PC中运行测试205.3测试结果23第6章结束语24 第1章项目概述1.1项目背景随着社会的科技水平和经济水平的迅速发展,游戏行业以迅雷不及掩耳之势快速的发展着。现在的游戏行业和电影行业可以说已经站在同一高度,特别是3D技术的进步使得游戏在人们的日常生活中占据着重要的地位。在3D技术如此盛行的今天,游戏引擎收到的关注也持续高涨,目前主要的引擎有BigWorld引擎、UnrealEngine3虚幻引擎、Gamebryo引擎、Unity3D引擎。相对于前三种引擎来说,Unity3D是最近几年才流行起来,但它由于完美的跨平台系统使他迅速的在引擎市场占据了重要的地位。本文将介绍一款以Unity3D为开发平台,结合C#的坦克大战游戏系统,该系统在保证运行效果的同时,具有设备要求低,跨平台性能好,运行流畅稳定的特点。1.2技术路线1.2.1游戏设计与制作阶段在游戏设计的阶段就要想好这款游戏的大概内容,主题鲜明,并且具有良好的游戏乐趣,游戏内容丰富,符合我们日常生活中的逻辑规律。1.2.2开发环境Unity3DUnity是一款跨平台的游戏开发工具,从一开始就被设计成易于使用的产品。作为一个完全集成的专业级应用,Unity还是功能强大的游戏引擎。Unity3D是一个让你轻松创作的多平台的游戏开发工具,是一个全面整合的专业游戏引擎。C#语言 C#是一种安全的、稳定的、简单的、优雅的,由C和C++衍生出来的面向对象的编程语言。它在继承C和C++强大功能的同时去掉了一些他们的复杂特性(例如没有宏以及不允许多重继承)。C#综合了VB简单的可视化操作和C++的高运行效率,以其强大的操作能力、-优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的首选语言。1.3项目设计目标本游戏应该具备如下界面和功能:(1)界面设计的美观。(2)主角进行移动和碰撞检测。(3)敌人自动寻路以及自动攻击(4)敌人的死亡与主角的死亡。 第2章系统设计2.1系统的整体设计游戏系统设计主要包含主菜单界面、主场景和游戏结束场景这三大模块组成。其中在主菜单界面和游戏结束场景界面实现了按钮的点击事件;主场景是该游戏的主体,主角和敌人的逻辑都在该场景中实现。游戏的流程图如图2.1所示:图2.1游戏流程图要去掉图的背景。2.2系统的界面设计2.2.1游戏主菜单游戏主菜单如图2.2所示界面设计思路要用文字描述出来,不能只给个图啊!: 图2.2游戏主菜单2.2.2游戏帮助界面游戏帮助界面如图2.3所示:图2.3游戏帮助界面2.2.3游戏结束界面游戏结束界面如图2.4所示: 图2.4游戏结束界面2.2.4游戏主界面图2.5游戏主界面2.2.5主角模型主角模型如图2.6所示: 图2.6主角模型2.2.6敌人模型敌人模型如图2.7所示:图2.7敌人模型2.2.7游戏地图模型游戏地图模型如图2.8所示: 图2.8游戏地图模型 第3章游戏菜单界面实现本章包括按钮的制作和游戏介绍、帮助界面。这些事关联在一起的,通过点击对应的按钮来达到对应场景的切换。它们的制作主要利用UGUI(Unity3D的内置组件)来实现的。3.1按钮的实现(1)按钮是由Image组件(需添加Button脚本,该脚本为Unity3D内置脚本)和Text组件结合实现的。(2)按钮的点击功能,在每个Button脚本下都有一个OnClick()(点击事件)方法可以绑定点击后需要实现的方法。然后将每个按钮的方法绑定上去即可实现按钮功能。3.2游戏主菜单界面的实现3.2.1说明按钮(1)功能说明按钮的功能是将游戏说明界面显示出来,也就是切换到游戏说明界面场景。(2)代码如下publicvoidOnIntroButtonClick(){SceneManager.LoadScene("StartUI_Intro");}3.2.2退出按钮(1)功能退出按钮的功能是将游戏退出。(2)代码如下publicvoidOnExitButtonClick(){Application.Quit();} 3.2.3游戏开始按钮(1)功能游戏开始的功能是进入游戏主场景,也就是切换到游戏主场景。(2)代码如下publicvoidOnStartButtonClick(){SceneManager.LoadScene("Main");}3.3游戏帮助界面的实现3.3.1关闭按钮(1)功能关闭按钮的功能是关闭游戏帮助界面,回到游戏主菜单,也就是切换到游戏主菜单。(2)代码publicvoidOnCloseButtonClick(){SceneManager.LoadScene("StartUI");}3.3.2游戏帮助文字界面上的文字描述,主要是利用UGUI中的Label来实现。在Text属性里输入需要显示的内容,即可显示出来。如图3.1所示:图3.1游戏帮助Text 3.4游戏结束界面的实现3.4.1重新开始按钮(1)功能重新开始按钮的功能是回到游戏主界面,也就是切换到游戏主界面(2)代码publicvoidOnResetButtonClick(){SceneManager.LoadScene("Main");}3.4.2退出游戏按钮(1)功能退出游戏按钮的功能是将游戏退出(2)代码publicvoidOnExitButtonClick(){Application.Quit();}3.4.3分数显示(1)功能分数显示是在游戏结束后将数据保存下来,切换到游戏结束场景后将数据读取并显示出来,然后将分数归0。(2)代码usingUnityEngine.UI;publicTextscore_Text;voidStart(){score_Text.text="最终得分为:"+PlayerPrefs.GetString("分数")+"分";PlayerPrefs.SetString("分数","0");} 3.5游戏主界面的实现3.5.1重置按钮(1)功能重置功能按钮是将游戏回到刚开始游戏的样子,也就是重新加载本场景(2)代码publicvoidOnResetButtonClick(){SceneManager.LoadScene("Main");}3.5.2退出按钮(1)功能退出按钮的功能是回到游戏结束的界面,也就是将场景切换到游戏结束的场景。(2)代码publicvoidOnQuitButtonClick(){SceneManager.LoadScene("GameOver");}3.5.2游戏得分(1)功能当击杀一个敌人后变增加分数,并且保存分数,将分数显示出来(2)代码publicvoidScoreAdd(){score.text="分数:"+scoreNum+"分";PlayerPrefs.SetString("分数",scoreNum.ToString());} 第4章游戏主界面实现4.1场景的搭建将Unity资源包(后缀名为.unitypackage)导入到项目当中,导入的方式为直接拖拽资源包至Project面板下,然后选择全部导入。导入后选择场景模型,拖拽至Hierarchy面板,将模型的Transform组件Reset,场景的搭建就完成了。4.2主角的功能实现首先在导入的资源包中找到主角模型,将其拖拽至Hierarchy面板。4.2.1移动(1)实现思路在主角身上添加Rigidbody刚体组件,使用刚体组件通过horizontal轴和vertical轴来运动,W、S控制主角的前进和后退,A、D控制主角的左右旋转。刚体组件如图4.1所示。图4.1刚体组件(2)代码privatevoidPlayerMove(){horizontal=Input.GetAxis("Horizontal");vertical=Input.GetAxis("Vertical");m_Rigidbody.velocity=transform.forward*vertical*moveSpeed;m_Rigidbody.angularVelocity=transform.up*horizontal*angularSpeed;} 4.2.2攻击(1)实现思路当按下鼠标左键的时候,在主角坦克的炮口这个位置,实例化一个炮弹,并且给子弹一个向前发射的速度。(2)代码privatevoidPlayerAttack(){if(Input.GetMouseButtonDown(0)){if(EventSystem.current.IsPointerOverGameObject()){return;}GameObjectnewShell=Instantiate(m_Shell,m_TankFire.position,m_TankFire.rotation)asGameObject;newShell.GetComponent().identity=playerIdentity;newShell.GetComponent().velocity=newShell.transform.forward*newShell.GetComponent().moveSpeed;newShell.GetComponent().shellAttack=attack;m_AudioSource.Play();}}4.2.3受到伤害(1)实现思路当敌人的炮弹碰撞到主角时,将敌人的攻击力通过炮弹的传过来,使主角减少血量,当主角血量为0时,在主角的位置实例化一个坦克爆炸的特效,并且销毁主角这个对象。碰撞检测需要给主角加碰撞体组件。碰撞体组件如图4.2所示。 图4.2刚体组件(2)代码publicvoidPlayerBruise(floatatk){if(playerHp<=0){return;}playerHp-=atk;hp_Image.fillAmount-=atk/PLAYERHP;if(playerHp<=0){Instantiate(m_TankExplosion,transform.position+transform.up,Quaternion.identity);Destroy(gameObject);isPlayerDie=true;}}4.3摄像机的功能实现摄像机是Unity3D开发中不可获取的组件,它就像人类的眼睛以及耳朵,如果没有摄像机就什么也看不见,什么也听不见。而在本项目中,摄像机的作用是,跟随主角,并可以自由旋转,亦可以通过鼠标滚轮来拉近或拉远视角,达到3D的效果。4.3.1移动(1)实现思路在主界面场景运行的时候,将摄像机看向主角,并记录下主角与摄像机的偏移量,然后将自己的位置与主角的位置永远保持在一个偏移量中。(2)代码voidStart(){transform.LookAt(PlayerController._instance.transform.position);offect=transform.position-PlayerController._instance.transform.position;}privatevoidCameraMove(){ transform.position=PlayerController._instance.transform.position+offect;}4.3.2围绕主角旋转(1)实现思路当按下鼠标右键时通过MouseX轴和MouseY轴来获取鼠标的移动量,来改变摄像机的旋转。(2)代码privatevoidCameraRotate(){if(Input.GetMouseButton(1)){transform.RotateAround(PlayerController._instance.transform.position,PlayerController._instance.transform.up,Input.GetAxis("MouseX")*rotateSpeed);Vector3newPosition=transform.position;QuaternionnewRotation=transform.rotation;transform.RotateAround(PlayerController._instance.transform.position,transform.right,-Input.GetAxis("MouseY")*rotateSpeed);if(transform.eulerAngles.x<10||transform.eulerAngles.x>80){transform.position=newPosition;transform.rotation=newRotation;}}offect=transform.position-PlayerController._instance.transform.position;}4.3.3视野的拉近或拉远(1)实现思路通过滑动鼠标滚轮来拉近或拉远视野,也就是用MouseScrollWheel轴通过改变摄像机与主角距离的大小来控制摄像机视野的拉近或者拉远。(2)代码privatevoidCameraScrollWheel(){distance=offect.magnitude; distance-=Input.GetAxis("MouseScrollWheel")*scrollWheelSpeed;distance=Mathf.Clamp(distance,2,20);offect=offect.normalized*distance;}4.4敌人的功能实现敌人的功能主要是移动,射击,受伤爆炸,生成等。4.4.1生成(1)实现思路在地图上选择3-5个出生点,然后使用随机数获取其中一个位置,然后在这个位置上实例化敌人。(2)代码IEnumeratorCreatEnemy(){while(true){yieldreturnnewWaitForSeconds(creatTime);GameObjectgo=Instantiate(enemyTank,transform.GetChild(Random.Range(0,transform.childCount)).position,Quaternion.identity)asGameObject;}}4.4.2移动(1)实现思路敌人的移动是通过Unity内置的寻路系统来控制,Unity寻路系统需要将需要寻路的地面的NavigationStatic勾选上,然后点击菜单栏的Window菜单,点击Navigation后点击Bake,即可完成寻路的设置。然后用代码来控制寻路点,使敌人移动。当敌人与主角之间的距离大于一定的距离时,敌人寻路点为主角需要保护的建筑物,当敌人与主角之间的距离小于一定距离时,敌人的寻路点为主角的位置。 (2)代码privatevoidEnemyMove(){if(Vector3.Distance(transform.position,PlayerController._instance.transform.position)>=m_NavMeshAgent.stoppingDistance){m_NavMeshAgent.SetDestination(navTargetPos.position);Quaterniontarget=Quaternion.LookRotation(navTargetPos.position-transform.position,Vector3.up);transform.rotation=Quaternion.Slerp(transform.rotation,target,Time.deltaTime/0.1f);}else{m_NavMeshAgent.SetDestination(PlayerController._instance.transform.position);Quaterniontarget=Quaternion.LookRotation(PlayerController._instance.transform.position-transform.position,Vector3.up);transform.rotation=Quaternion.Slerp(transform.rotation,target,Time.deltaTime/0.1f);}}4.4.3攻击(1)实现思路当敌人寻路停止时,即找到目标时,开始计时,每几秒在炮口实例化一颗炮弹,并给炮弹一定的速度。(2)代码privatevoidEnemyAttack(){runTime+=Time.deltaTime;if(runTime>=time){if(m_NavMeshAgent.remainingDistance!=0&&m_NavMeshAgent.remainingDistance<=m_NavMeshAgent.stoppingDistance +0.1f){runTime=0;GameObjectnewShell=Instantiate(m_Shell,m_TankFire.position,m_TankFire.rotation)asGameObject;newShell.GetComponent().identity=enemyIdentity;newShell.GetComponent().velocity=newShell.transform.forward*newShell.GetComponent().moveSpeed;newShell.GetComponent().shellAttack=attack;m_AudioSource.Play();}}}4.4.4受伤(1)实现思路当主角的炮弹碰撞到敌人时,将主角的攻击力通过炮弹的传过来,使敌人减少血量,当敌人血量为0时,在敌人的位置实例化一个坦克爆炸的特效,并且销毁敌人这个对象。碰撞检测需要给敌人加碰撞体组件。(2)代码publicvoidEnemyBruise(floatatk){if(enemyHp<=0){return;}enemyHp-=atk;hp_Image.fillAmount-=atk/ENEMYHP;if(enemyHp<=0){Instantiate(m_TankExplosion,transform.position+transform.up,Quaternion.identity);m_Canvas.SetActive(false);Destroy(gameObject);GameManager._instance.scoreNum++;GameManager._instance.ScoreAdd();} }4.5炮弹的碰撞检测4.5.1炮弹的身份给炮弹定义一个叫做身份的枚举,里面有玩家和敌人,当玩家攻击实例化子弹的时候就将实例化生成的子弹的身份设置为玩家,当敌人攻击实例化子弹的时候就将实例化生成的子弹的身份设置为敌人。枚举代码如下:publicenumShellIdentity{PLAYER,ENEMY,}4.5.1碰撞检测(1)实现思路碰撞的检测使用Unity3D内置的API方法,是OnTriggerEnter,功能是当碰撞的那一瞬间触发一次该方法,而碰撞的必要条件是,碰撞的双方都有碰撞体,双方至少一方有刚体,才会触发碰撞。当子弹碰撞到对象时,销毁自己,然后在炮弹的位置生成炮弹爆炸特效,然后会验证碰撞体身份,如果子弹的身份与碰撞体的身份不一致的话即调用碰撞体的受伤方法。(2)代码privatevoidOnTriggerEnter(Colliderother){if(other.tag==transform.tag){return;}if(other.tag=="Enemy"&&identity!=other.GetComponent().enemyIdentity){other.GetComponent().EnemyBruise(shellAttack);}elseif(other.tag=="Player"&&identity!=other.GetComponent().playerIdentity) {other.GetComponent().PlayerBruise(shellAttack);}elseif(other.tag=="Map"&&identity==ShellIdentity.ENEMY){GameManager._instance.MapBruise(shellAttack);}Instantiate(m_ShellExplosion,transform.position,Quaternion.identity);Destroy(gameObject);} 第5章系统测试5.1在Unity3D中运行测试点击软件中的运行按钮,如图5.1所示。图5.1运行按钮游戏在软件中测试运行,如图5.2所示。图5.2Unity3D中运行游戏能够正常运行,没有报错,测试成功。5.2在PC中运行测试点击File选择BuildSettings出现打包菜单,如图5.3所示。 图太大,宽度调成12就行,后面的图也一样处理图5.3打包选项结合游戏之前的几个场景,就可以打包成一个完整的游戏了,先将其打包为PC游戏进行测试。运行结果如图5.4所示。 图5.4开始场景点击开始游戏,进入游戏主场景,如图5.5所示。 图5.5游戏场景游戏完美运行,PC端测试成功。5.3测试结果在Unity3D的Mono模拟器中运行结果,游戏可以正常流畅运行,界面简洁易懂,操作简单,且画面鲜艳。在PC平台测试运行,游戏同样可以正常运行。 第6章结束语从毕业设计到报告,这好几个月,非常顺利的完成了实训,我对系统开发的整个流程有了更深刻的认识,对本专业的基本理论、专业知识和基本技术进行了梳理,并有了更深入的了解,使我在两年中所学到的知识得到了升华,达到了学以致用的效果。本报告从游戏的开始界面、游戏界面、游戏对象、结束几面等几个模块来介绍利用Unity3D引擎并结合C#来开发一款简单的坦克游戏。游戏中包含了几个常用的重点技术,如射线检测、碰撞检测、敌人的AI等。它基本实现了一般的游戏功能,同时它的可扩展性还很高,可以再此基础上另外添加一些比较有创意的设计使该游戏更加的完整。本系统主要是用Unity3D进行系统整体框架的搭建,但Unity3D对于我来说是比较陌生的,再接触前根本没有听说过,不过所幸这款软件在中国发展了几年,在网上有大量的资料可供查阅,从中提取有用信息的同时也让我对这款软件有了进一步的认识和了解。编程的过程对于我本身也是一个学习进步的过程,我自己在编程的水平十分有限,经常在一些简单的地方出错误,因为我只能去网上或者老师来指导我,给了我很大的帮助,最后我可以独立的完成功能的实现。这款游戏有非常多的不足,比如小地图功能,本来该功能是实现了的,可是后来因为此功能而发生了许多BUG,也没有改进,就取消了该功能;还有游戏过于单一只有杀敌人,而没有其他功能,例如闯关之类的,也没有胜利条件。此次毕业设计不仅提升了我的编程能力,还提升了我对于Unity3D的掌握能力,这些能力在以后都是必不可少的东西,因此我觉得这个毕业设计对我的好处是非常的多的。 参考文献[1]宣雨松.Unity3D游戏开发[M].北京:人民邮电出版社,2012.[2]李兰友杨晓光.VisualC#.NET程序设计[M].北京:清华大学出版社,2004.5.[3]韩玉民.计算机专业英语教学研究与实践[J].计算机与信息技术,2008,(6):106-107.[4]吴亚峰于复兴.Unity3D游戏开发技术详解与典型案例[M].北京:人民邮电出版社,2012.[5]亚当斯.游戏设计基础[M].北京:机械工业出版社,2009.[6]荣钦科技.游戏设计概论[M].北京:科海电子出版社,2003.您好,欢迎您阅读我的文章,本WORD文档可编辑修改,也可以直接打印。阅读过后,希望您提出保贵的意见或建议。阅读和学习是一种非常好的习惯,坚持下去,让我们共同进步。

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
大家都在看
近期热门
关闭