ImageVerifierCode 换一换
格式:DOCX , 页数:29 ,大小:2.58MB ,
资源ID:28873843      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/28873843.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(卢杰基于UnityD的坦克大战游戏的设计与实现.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

卢杰基于UnityD的坦克大战游戏的设计与实现.docx

1、卢杰基于UnityD的坦克大战游戏的设计与实现 毕业实训报告课题名称:基于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并优化项目指导教师签字: 年 月 日实训单位意见签章: 年 月 日学院意见签章: 年 月 日中 原

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

4、设计,自己也体验了技术实现的过程。关键词: Unity3D; 坦克大战游戏; 游戏引擎 第1章 项目概述1.1 项目背景随着社会的科技水平和经济水平的迅速发展,游戏行业以迅雷不及掩耳之势快速的发展着。现在的游戏行业和电影行业可以说已经站在同一高度,特别是3D技术的进步使得游戏在人们的日常生活中占据着重要的地位。在3D技术如此盛行的今天,游戏引擎收到的关注也持续高涨,目前主要的引擎有BigWorld引擎、Unreal Engine3虚幻引擎、Gamebryo引擎、Unity3D引擎。相对于前三种引擎来说,Unity3D是最近几年才流行起来,但它由于完美的跨平台系统使他迅速的在引擎市场占据了重要的

5、地位。本文将介绍一款以Unity3D为开发平台,结合C#的坦克大战游戏系统,该系统在保证运行效果的同时,具有设备要求低,跨平台性能好,运行流畅稳定的特点。1.2 技术路线1.2.1 游戏设计与制作阶段在游戏设计的阶段就要想好这款游戏的大概内容,主题鲜明,并且具有良好的游戏乐趣,游戏内容丰富,符合我们日常生活中的逻辑规律。1.2.2 开发环境Unity3DUnity是一款跨平台的游戏开发工具,从一开始就被设计成易于使用的产品。作为一个完全集成的专业级应用,Unity还是功能强大的游戏引擎。Unity3D是一个让你轻松创作的多平台的游戏开发工具,是一个全面整合的专业游戏引擎。C#语言C#是一种安全

6、的、稳定的、简单的、优雅的,由C和C+衍生出来的面向对象的编程语言。它在继承C和C+强大功能的同时去掉了一些他们的复杂特性(例如没有宏以及不允许多重继承)。C#综合了VB简单的可视化操作和C+的高运行效率,以其强大的操作能力、-优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的首选语言。1.3 项目设计目标 本游戏应该具备如下界面和功能:(1) 界面设计的美观。(2) 主角进行移动和碰撞检测。(3) 敌人自动寻路以及自动攻击(4) 敌人的死亡与主角的死亡。第2章 系统设计2.1 系统的整体设计游戏系统设计主要包含主菜单界面、主场景和游戏结束场景这三大模块组成。其中在主菜

7、单界面和游戏结束场景界面实现了按钮的点击事件;主场景是该游戏的主体,主角和敌人的逻辑都在该场景中实现。游戏的流程图如图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

8、所示:图2.8 游戏地图模型第3章 游戏菜单界面实现本章包括按钮的制作和游戏介绍、帮助界面。这些事关联在一起的,通过点击对应的按钮来达到对应场景的切换。它们的制作主要利用UGUI(Unity3D的内置组件)来实现的。3.1 按钮的实现(1)按钮是由Image组件(需添加Button脚本,该脚本为Unity3D内置脚本)和Text组件结合实现的。(2)按钮的点击功能,在每个Button脚本下都有一个OnClick()(点击事件)方法可以绑定点击后需要实现的方法。然后将每个按钮的方法绑定上去即可实现按钮功能。3.2 游戏主菜单界面的实现3.2.1 说明按钮(1)功能说明按钮的功能是将游戏说明界面显

9、示出来,也就是切换到游戏说明界面场景。(2)代码如下 public void OnIntroButtonClick() SceneManager.LoadScene(StartUI_Intro);3.2.2 退出按钮(1)功能退出按钮的功能是将游戏退出。(2)代码如下 public void OnExitButtonClick() Application.Quit(); 3.2.3 游戏开始按钮(1)功能游戏开始的功能是进入游戏主场景,也就是切换到游戏主场景。(2)代码如下 public void OnStartButtonClick() SceneManager.LoadScene(Main

10、);3.3 游戏帮助界面的实现3.3.1 关闭按钮(1)功能关闭按钮的功能是关闭游戏帮助界面,回到游戏主菜单,也就是切换到游戏主菜单。(2)代码 public void OnCloseButtonClick() SceneManager.LoadScene(StartUI);3.3.2 游戏帮助文字界面上的文字描述,主要是利用UGUI中的Label来实现。在Text属性里输入需要显示的内容,即可显示出来。如图3.1所示:图3.1 游戏帮助Text3.4 游戏结束界面的实现3.4.1 重新开始按钮(1)功能重新开始按钮的功能是回到游戏主界面,也就是切换到游戏主界面(2)代码public void

11、 OnResetButtonClick() SceneManager.LoadScene(Main); 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 = 最终得分为: + Player

12、Prefs.GetString(分数) + 分; 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.LoadScene(GameOver

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

14、.2 主角的功能实现首先在导入的资源包中找到主角模型,将其拖拽至Hierarchy面板。4.2.1移动(1) 实现思路在主角身上添加Rigidbody刚体组件,使用刚体组件通过horizontal轴和vertical轴来运动,W、S控制主角的前进和后退,A、D控制主角的左右旋转。刚体组件如图4.1所示。图4.1 刚体组件(2)代码 private void PlayerMove() horizontal = Input.GetAxis(Horizontal); vertical = Input.GetAxis(Vertical); m_Rigidbody.velocity = transfor

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

16、 newShell = Instantiate(m_Shell, m_TankFire.position, m_TankFire.rotation) as GameObject; newShell.GetComponent().identity = playerIdentity; newShell.GetComponent().velocity = newShell.transform.forward * newShell.GetComponent().moveSpeed; newShell.GetComponent().shellAttack = attack; m_AudioSource.

17、Play(); 4.2.3受到伤害(1)实现思路当敌人的炮弹碰撞到主角时,将敌人的攻击力通过炮弹的传过来,使主角减少血量,当主角血量为0时,在主角的位置实例化一个坦克爆炸的特效,并且销毁主角这个对象。碰撞检测需要给主角加碰撞体组件。碰撞体组件如图4.2所示。图4.2 刚体组件(2)代码 public void PlayerBruise(float atk) if (playerHp = 0) return; playerHp -= atk; hp_Image.fillAmount -= atk / PLAYERHP; if (playerHp = 0) Instantiate(m_TankEx

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

19、个偏移量中。(2)代码 void Start() transform.LookAt(PlayerController._instance.transform.position); offect = transform.position - PlayerController._instance.transform.position; private void CameraMove() transform.position = PlayerController._instance.transform.position + offect;4.3.2围绕主角旋转(1)实现思路当按下鼠标右键时通过Mou

20、se X轴和Mouse Y轴来获取鼠标的移动量,来改变摄像机的旋转。(2)代码 private void CameraRotate() if (Input.GetMouseButton(1) transform.RotateAround(PlayerController._instance.transform.position, PlayerController._instance.transform.up, Input.GetAxis(Mouse X) * rotateSpeed); Vector3 newPosition = transform.position; Quaternion n

21、ewRotation = transform.rotation; transform.RotateAround(PlayerController._instance.transform.position, transform.right, -Input.GetAxis(Mouse Y) * rotateSpeed); if (transform.eulerAngles.x 80) transform.position = newPosition; transform.rotation = newRotation; offect = transform.position - PlayerCont

22、roller._instance.transform.position;4.3.3视野的拉近或拉远(1)实现思路通过滑动鼠标滚轮来拉近或拉远视野,也就是用Mouse ScrollWheel轴通过改变摄像机与主角距离的大小来控制摄像机视野的拉近或者拉远。(2)代码 private void CameraScrollWheel() distance = offect.magnitude; distance -= Input.GetAxis(Mouse ScrollWheel) * scrollWheelSpeed; distance = Mathf.Clamp(distance, 2, 20);

23、offect = offect.normalized * distance; 4.4 敌人的功能实现敌人的功能主要是移动,射击,受伤爆炸,生成等。4.4.1 生成(1)实现思路在地图上选择3-5个出生点,然后使用随机数获取其中一个位置,然后在这个位置上实例化敌人。(2)代码 IEnumerator CreatEnemy() while (true) yield return new WaitForSeconds(creatTime); GameObject go = Instantiate(enemyTank, transform.GetChild(Random.Range(0, transf

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

25、Move() if (Vector3.Distance(transform.position, PlayerController._instance.transform.position) = m_NavMeshAgent.stoppingDistance) m_NavMeshAgent.SetDestination(navTargetPos.position); Quaternion target = Quaternion.LookRotation(navTargetPos.position - transform.position, Vector3.up); transform.rotat

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

27、n = Quaternion.Slerp(transform.rotation, target, Time.deltaTime / 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_NavMes

28、hAgent.stoppingDistance + 0.1f) runTime = 0; GameObject newShell = Instantiate(m_Shell, m_TankFire.position, m_TankFire.rotation) as GameObject; newShell.GetComponent().identity = enemyIdentity; newShell.GetComponent().velocity = newShell.transform.forward * newShell.GetComponent().moveSpeed; newShe

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

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1