卢杰基于UnityD的坦克大战游戏的设计与实现_第1页
卢杰基于UnityD的坦克大战游戏的设计与实现_第2页
卢杰基于UnityD的坦克大战游戏的设计与实现_第3页
卢杰基于UnityD的坦克大战游戏的设计与实现_第4页
卢杰基于UnityD的坦克大战游戏的设计与实现_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

1、中布3年的软件学院Zhongyuan University of TechnologySC/ Cb"切 勿毕业实训报告课题名称:基于Unity3d的坦克大战游戏的设计与实现专业:软件技术班 级:RZ 软技154学号: 201560190410学生姓名:指导教师:2017年5月 15 日关于卢杰同学的实训鉴定同学于 年 月 在实训中,该同学在日至 年 月日在我公司部门进行了毕业实训。单位签章:指导教师签字:中原工学院毕业实训任务书2017年2月13日学生姓名卢杰学号201560190410专业软件技术班级RZ软技154课题名称基于Unity3D的坦克大战游戏的设计与实现课题来源实训公司

2、指导教师张鑫宇,李星辰专业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并优化项目指导教师签字:年 月 日实训单位意见签章:年 月 日学院意见签章:年 月 日中原工学院毕业实训评审表学号 20

3、1560190410 姓名 卢杰 专业软件技术班级RZ软技154题目基于Unity3D的坦克大战游戏的设计与实现指 导 教 师 评 语成绩(百分制):指导教师签名:摘要本文利用Unity3D跨平台功能的突出、兼容性强的特点,结合C机发一款坦克大战的游戏系统,该系统运行流畅,具有较好的可玩性和跨平台性。课题题目为基于 Unity3D的坦克大战游戏的射击与开发,旨在成功的设计出一款可以在PC端运行的坦克游戏,在毕业设计完成时,坦克模型应该能再PC端运行。游戏中,我们可以利用鼠标、键盘来对我们的坦克进行前进后退, 而且可以对坦克进行旋转以及发射炮弹, 通过这次设计, 自己也体验了技 术实现的过程。关

4、键词: Unity3D ; 坦克大战游戏; 游戏引擎摘 要.第1章 项目概述 11.1 项目背景 11.2 技术路线 11.2.1 游戏设计与制作阶段 11.2.2 开发环境 11.3 项目设计目标 1第 2章 系统设计 22.1 系统的整体设计22.2 系统的界面设计22.2.1 游戏主菜单 22.2.2 游戏帮助界面 32.2.3 游戏结束界面 32.2.4 游戏主界面 42.2.5 主角模型 42.2.6 敌人模型 52.2.7 游戏地图模型 5第 3章 游戏菜单界面实现 63.1 按钮的实现63.2 游戏主菜单界面的实现63.2.1 说明按钮 63.2.2 退出按钮 63.2.3 游戏

5、开始按钮 63.3 游戏帮助界面的实现73.3.1 关闭按钮 73.3.2 游戏帮助文字 73.4 游戏结束界面的实现73.4.1 重新开始按钮 73.4.2 退出游戏按钮 73.4.3 分数显示 83.5 游戏主界面的实现83.5.1 重置按钮 83.5.2 退出按钮 83.5.3 游戏得分 8第4章 游戏主界面实现 104.1 场景的搭建 104.2 主角的功能实现104.2.1 移动 104.2.2 攻击 104.2.3 受到伤害 114.3 摄像机的功能实现124.3.1 移动 124.3.2 围绕主角旋转 124.3.3 视野的拉近或拉远 134.4 敌人的功能实现134.4.1 生

6、成 134.4.2 移动 144.4.3 攻击 144.4.4 受伤 154.5 炮弹的碰撞检测 164.5.1 炮弹的身份 164.5.2 碰撞检测 16第 5章 系统测试 185.1 在UNITY3D中运行测试 185.2 在P珅运行测试185.3 测试结果 21第 6章 结束语 22第 1 章 项目概述1.1 项目背景随着社会的科技水平和经济水平的迅速发展, 游戏行业以迅雷不及掩耳之势快速的发展着。 现在的游戏行业和电影行业可以说已经站在同一高度,特别是3D 技术的进步使得游戏在人们的日常生活中占据着重要的地位。在 3D 技术如此盛行的今天,游戏引擎收到的关注也持续高涨,目前主要的引擎有

7、BigWorld 引擎、 Unreal Engine3 虚幻引擎、 Gamebryo 引擎、 Unity3D 引擎。相对于前三种引擎来说,Unity3D 是最近几年才流行起来,但它由于完美的跨平台系统使他迅速的在引擎市场占据了重要的地位。本文将介绍一款以Unity3D为开发平台,结合C#勺坦克大战游戏系统,该系统在保证运行效果的同时,具有设备要求低,跨平台性能好,运行流畅稳定的特点。1.2 技术路线1.2.1 游戏设计与制作阶段在游戏设计的阶段就要想好这款游戏的大概内容, 主题鲜明, 并且具有良好的游戏乐趣, 游戏内容丰富,符合我们日常生活中的逻辑规律。1.2.2 开发环境Unity3DUni

8、ty 是一款跨平台的游戏开发工具,从一开始就被设计成易于使用的产品。作为一个完全集成的专业级应用, Unity 还是功能强大的游戏引擎。 Unity3D 是一个让你轻松创作的多平台的游戏开发工具,是一个全面整合的专业游戏引擎。C献言C#是一种安全的、稳定的、简单的、优雅的,由 C和C+行生出来的面向对象的编程语言。它在继承C和C+虽大功能的同时去掉了一些他们的复杂特性(例如没有宏以及不允许多重继承)。C嗡合了VB简单的可视化操作和C+的高运行效率,以其强大的操作能力、-优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET 开发的首选语言。1.3 项目设计目标本游戏应该具备如下界

9、面和功能:( 1 )界面设计的美观。( 2 )主角进行移动和碰撞检测。( 3 )敌人自动寻路以及自动攻击( 4 )敌人的死亡与主角的死亡。第2章系统设计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所

10、示:图2.4游戏结束界面2.2.4游戏主界面图2.5游戏主界面2.2.5 主角模型主角模型如图2.6所示:2.2.6敌人模型图2.6主角模型敌人模型如图2.7所示:图2.7敌人模型2.2.7游戏地图模型游戏地图模型如图 2.8所示:图2.8 游戏地图模型第3章游戏菜单界面实现本章包括按钮的制作和游戏介绍、帮助界面。这些事关联在一起的,通过点击对应的按钮来达到对应场景的切换。它们的制作主要利用UGUI(Unity3D的内置组件)来实现的。3.1 按钮的实现(1)按钮是由Image组件(需添加 Button脚本,该脚本为 Unity3D内置脚本)和Text组件结合 实现的。(2)按钮的点击功能,在

11、每个 Button脚本下都有一个 OnClick()(点击事件)方法可以绑定点击 后需要实现的方法。然后将每个按钮的方法绑定上去即可实现按钮功能。3.2 游戏主菜单界面的实现3.2.1 说明按钮(1)功能说明按钮的功能是将游戏说明界面显示出来,也就是切换到游戏说明界面场景。(2)代码如下public void OnIntroButtonClick()SceneManager.LoadScene( "StartUI Intro");3.2.2 退出按钮(1)功能退出按钮的功能是将游戏退出。(2)代码如下public void OnExitButtonClick() Appli

12、cation .Quit();3.2.3 游戏开始按钮(1)功能游戏开始的功能是进入游戏主场景,也就是切换到游戏主场景。(2)代码如下public void OnStartButtonClick()SceneManager.LoadScene( "Main");3.3 游戏帮助界面的实现3.3.1 关闭按钮(1)功能关闭按钮的功能是关闭游戏帮助界面,回到游戏主菜单,也就是切换到游戏主菜单。(2)代码public void OnCloseButtonClick() SceneManager.LoadScene( "StartUI");3.3.2 游戏帮助文

13、字即可界面上的文字描述,主要是利用UGUI中的Label来实现。在Text属性里输入需要显示的内容,显不'出来。如图 3.1所不E3 ?Te>rt (Script)啕条Text海度介诏:击奈敌人,保护嘘盘以期自己提信说明:占型制前送后退,A、D控制左右艇转,宸林主应裳射炮弹,员背右键核动猊角图3.1游戏帮助Text3.4 游戏结束界面的实现3.4.1 重新开始按钮(1)功能重新开始按钮的功能是回到游戏主界面,也就是切换到游戏主界面(2)代码public void OnResetButtonClick()SceneManager.LoadScene( "Main"

14、;);3.4.2 退出游戏按钮(1)功能退出游戏按钮的功能是将游戏退出(2)代码public void OnExitButtonClick() Application .Quit(); 3.4.3 分数显示(1)功能分数显示是在游戏结束后将数据保存下来,切换到游戏结束场景后将数据读取并显示出来,然后将分数归0。(2)代码using UnityEngine.UI;public Text score_Text;void Start()score_Text.text ="最终得分为:"+ PlayerPrefs .GetString("分数")+ "

15、分";PlayerPrefs .SetString("分数","0");3.5 游戏主界面的实现3.5.1 重置按钮(1)功能重置功能按钮是将游戏回到刚开始游戏的样子,也就是重新加载本场景(2)代码public void OnResetButtonClick()SceneManager.LoadScene( "Main");3.5.2 退出按钮(1)功能退出按钮的功能是回到游戏结束的界面,也就是将场景切换到游戏结束的场景。(2)代码public void OnQuitButtonClick()SceneManager.Loa

16、dScene( "GameOver");3.5.3 游戏得分(1)功能当击杀一个敌人后变增加分数,并且保存分数,将分数显示出来(2)代码public void ScoreAdd()score.text ="分数:"+ scoreNum + "分";PlayerPrefs .SetString("分数",scoreNum.ToString(); 第4章游戏主界面实现4.1 场景的搭建将Unity 资源包(后缀名为.unitypackage )导入到项目当中,导入的方式为直接拖拽资源包至 Project面板下,然后选择

17、全部导入。导入后选择场景模型,拖拽至 Hierarchy面板,将模型的Transform组件Reset,场景的搭建就完 成了。4.2 主角的功能实现首先在导入的资源包中找到主角模型,将其拖拽至Hierarchy面板。4.2.1 移动(1)实现思路在主角身上添加 Rigidbody刚体组件,使用刚体组件通过 horizontal 轴和vertical 轴来运动,W S控制主角的前进和后退,A、D控制主角的左右旋转。刚体组件如图 4.1所示。( Rigid body*司3利日器1Draq0Argular Drag0,05Use Gravity17Is KinematicI nte rpolate1

18、 Nones-,Collision Detection rDiscreteConstrairtsFreeze Position X 7r 1 ZFreese flotation "乂 一 】甲 VZ图4.1刚体组件(2)代码private void PlayerMove()horizontal =Input .GetAxis( "Horizontal" );vertical =Input .GetAxis( "Vertical");m_Rigidbody.velocity = transform.forward * vertical * mov

19、eSpeed;m_Rigidbody.angularVelocity = transform.up * horizontal * angularSpeed;4.2.2 攻击(1)实现思路当按下鼠标左键的时候,在主角坦克的炮口这个位置,实例化一个炮弹,并且给子弹一个向前发射 的速度。(2)代码private void PlayerAttack()if ( Input .GetMouseButtonDown(O)if ( EventSystem .current.IsPointerOverGameObject() return ;GameObject newShell = Instantiate(

20、m_Shell, m_TankFire.position, m_TankFire.rotation) as GameObject;newShell.GetComponent<ShellController >().identity = playerIdentity;newShell.GetComponent<Rigidbody >().velocity = newShell.transform.forward *newShell.GetComponent< ShellController >().moveSp eed;newShell.GetComponen

21、t< ShellController >().shellAttack = attack;m_AudioSource.Play();4.2.3 受到伤害(1)实现思路当敌人的炮弹碰撞到主角时,将敌人的攻击力通过炮弹的传过来,使主角减少血量,当主角血量为。时,在主角的位置实例化一个坦克爆炸的特效,并且销毁主角这个对象。碰撞检测需要给主角加碰撞体组件。碰撞体组件如图 4.2所示。T Bom Collider,玷A Edit ColliderIs Trigger MaterialNone Phy sic Mat' oCenterX 0Y D.97. 0SizeX 1,7 YZ M图

22、4.2刚体组件(2)代码public void PlayerBruise( float atk) 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 摄像机的功能实现摄像机是Unity3

23、D开发中不可获取的组件,它就像人类的眼睛以及耳朵,如果没有摄像机就什么也看不见,什么也听不见。而在本项目中,摄像机的作用是,跟随主角,并可以自由旋转,亦可以通过鼠 标滚轮来拉近或拉远视角,达到3D的效果。4.3.1 移动(1)实现思路在主界面场景运行的时候,将摄像机看向主角,并记录下主角与摄像机的偏移量,然后将自己的位置与主角的位置永远保持在一个偏移量中。(2)代码void Start()transform.LookAt( PlayerController ._instance.transform.position);offect = transform.position -PlayerCon

24、troller ._instance.transform.position;private void CameraMove()transform.position =PlayerController .instance.transform.position + offect;4.3.2 围绕主角旋转(1)实现思路当按下鼠标右键时通过Mouse X轴和Mouse Y轴来获取鼠标的移动量,来改变摄像机的旋转。(2)代码private void CameraRotate() if ( Input .GetMouseButton)transform.RotateAround(PlayerControl

25、ler ._instance.transform.position,PlayerController ._instance.transform.up, Input .GetAxis( "Mouse X" ) *rotateSpeed);Vector3 newPosition = transform.position;Quaternion newRotation = transform.rotation;transform.RotateAround(PlayerController ._instance.transform.position,transform.right,

26、- Input .GetAxis( "Mouse Y") * 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)实现思路通过滑动鼠标滚轮来拉近或

27、拉远视野,也就是用MouseScrollWheel轴通过改变摄像机与主角距离的大小来控制摄像机视野的拉近或者拉远。(2)代码private void CameraScrollWheel()distance = offect.magnitude;distance -=Input .GetAxis( "Mouse ScrollWheel" ) * scrollWheelSpeed;distance =Mathf .Clamp(distance, 2, 20);offect = offect.normalized * distance;4.4 敌人的功能实现敌人的功能主要是移动,

28、射击,受伤爆炸,生成等。4.4.1 生成(1)实现思路在地图上选择3-5个出生点,然后使用随机数获取其中一个位置,然后在这个位置上实例化敌人。(2)代码lEnumerator CreatEnemwhile ( true ) yield return new WaitForSeconds (creatTime);RandomRange(0,GameObject go = Instantiate(enemyTank, transform.GetChild(transform.childCount).position, GameObject;Quaternion .identity) as4.4.2

29、 移动(1)实现思路敌人的移动是通过Unity内置的寻路系统来控制,Unity寻路系统需要将需要寻路的地面的Navigation Static 勾选上,然后点击菜单栏的Window菜单,点击 Navigation 后点击Bake,即可完成寻路的设置。然后用代码来控制寻路点,使敌人移动。当敌人与主角之间的距离大于一定的距离时,敌人寻路点为主角需要保护的建筑物,当敌人与主角之间的距离小于一定距离时,敌人的寻路点为主角的位置。(2)代码private void EnemyMove() if ( Vector3 .Distance(transform.position,PlayerController

30、 ._instance.transform.po sition) >=m NavMeshAgent.stoppingDistance)m_NavMeshAgent.SetDestination(navTargetPos.position);Quaternion target =transform.rotation =Quaternion .LookRotation(navTargetPos.position - transform.position, Vector3 .up); Quaternion .Slerp(transform.rotation, target,Time .delt

31、aTime / 0.1f); m_NavMeshAgent.SetDestination(Quaternion target =PlayerController ._instance.transform.position);Quaternion .LookRotation( PlayerController ._instance.transform.position - transform.position,Vector3 .up);transform.rotation =Quaternion .Slerp(transform.rotation, target,Time .deltaTime

32、/ 0.1f);4.4.3 攻击(1)实现思路当敌人寻路停止时, 即找到目标时,开始计时,每几秒在炮口实例化一颗炮弹,并给炮弹一定的速度。(2)代码private void EnemyAttack()runTime += Time.deltaTime; if (runTime >= time) if (m_NavMeshAgent.remainingDistance != 0 && m_NavMeshAgent.remainingDistance <= m_NavMeshAgent.stoppingDistance + 0.1f)runTime = 0;GameOb

33、ject newShell = Instantiate(m_Shell, m_TankFire.position, m_TankFire.rotation) as GameObject; newShell.GetComponent<ShellController >().identity = enemyIdentity;newShell.GetComponent<Rigidbody >().velocity = newShell.transform.forward *newShell.GetComponent< ShellController >().mov

34、eSp eed;newShell.GetComponent<ShellController >().shellAttack = attack;m_AudioSource.Play();4.4.4 受伤(1)实现思路当主角的炮弹碰撞到敌人时,将主角的攻击力通过炮弹的传过来,使敌人减少血量,当敌人血量为0时,在敌人的位置实例化一个坦克爆炸的特效,并且销毁敌人这个对象。碰撞检测需要给敌人加碰撞体组件。(2)代码public void EnemyBruise( float atk) hp_Image.fillAmount -= atk / ENEMYHP;if (enemyHp <=

35、 0)Instantiate(m_TankExplosion, transform.position + transform.up, Quaternion .identity);m_Canvas.SetActive(false );Destroy(gameObject);GameManage_instance.scoreNum+;GameManage instance.ScoreAdd(); 4.5 炮弹的碰撞检测4.5.1 炮弹的身份给炮弹定义一个叫做身份的枚举,里面有玩家和敌人,当玩家攻击实例化子弹的时候就将实例化生成的子弹的身份设置为玩家,当敌人攻击实例化子弹的时候就将实例化生成的子弹的

36、身份设置为敌人。枚举代码如下:public enum Shellldentity PLAYER, ENEMY, | 4.5.1 碰撞检测(1)实现思路碰撞的检测使用Unity3D内置的API方法,是OnTriggerEnter ,功能是当碰撞的那一瞬间触发一次该方法,而碰撞的必要条件是,碰撞的双方都有碰撞体,双方至少一方有刚体,才会触发碰撞。当子弹碰撞到对象时,销毁自己,然后在炮弹的位置生成炮弹爆炸特效,然后会验证碰撞体身份,如果子弹的身份与碰撞体的身份不一致的话即调用碰撞体的受伤方法。(2)代码private void OnTriggerEnter( Collider other) if (

37、other.tag = transform.tag) return ;if (other.tag = "Enemy" && identity != other.GetComponent< EnemyController >().enemyIdentity) other.GetComponent<EnemyController >().EnemyBruise(shellAttack); else if (other.tag = "Player" && identity != other.GetComp

38、onent< PlayerController >().playerIdentity)other.GetComponent<PlayerController >().PlayerBruise(shellAttack);else if (other.tag = "Map" && identity = Shellldentity .ENEMY)GameManage_instance.MapBruise(shellAttack);Instantiate(m_ShellExplosion, transform.position,Quaternion .identity);Destroy(gameObject);第5章系统测试5.1 在Unity3D中运行测试点击软件中的运行按钮,如图5.1所示。HierarchyO Mdin图5.1 运行按钮

温馨提示

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

评论

0/150

提交评论