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

上传人:b****5 文档编号:5685585 上传时间:2022-12-31 格式:DOCX 页数:19 大小:87.02KB
下载 相关 举报
卢杰基于UnityD的坦克大战游戏的设计与实现.docx_第1页
第1页 / 共19页
卢杰基于UnityD的坦克大战游戏的设计与实现.docx_第2页
第2页 / 共19页
卢杰基于UnityD的坦克大战游戏的设计与实现.docx_第3页
第3页 / 共19页
卢杰基于UnityD的坦克大战游戏的设计与实现.docx_第4页
第4页 / 共19页
卢杰基于UnityD的坦克大战游戏的设计与实现.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

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

《卢杰基于UnityD的坦克大战游戏的设计与实现.docx》由会员分享,可在线阅读,更多相关《卢杰基于UnityD的坦克大战游戏的设计与实现.docx(19页珍藏版)》请在冰豆网上搜索。

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

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

毕业实训报告

课题名称:

基于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并优化项目

指导教师签字:

年月日

实训单位意见

签章:

年月日

学院意见

签章:

年月日

中原工学院

毕业实训评审表

学号

201560190410

姓名

卢杰

专业

软件技术

班级

RZ软技154

题目

基于Unity3D的坦克大战游戏的设计与实现

成绩(百分制):

指导教师签名:

年月日

摘要

本文利用Unity3D跨平台功能的突出、兼容性强的特点,结合C#开发一款坦克大战的游戏系统,该系统运行流畅,具有较好的可玩性和跨平台性。

课题题目为基于Unity3D的坦克大战游戏的射击与开发,旨在成功的设计出一款可以在PC端运行的坦克游戏,在毕业设计完成时,坦克模型应该能再PC端运行。

游戏中,我们可以利用鼠标、键盘来对我们的坦克进行前进后退,而且可以对坦克进行旋转以及发射炮弹,通过这次设计,自己也体验了技术实现的过程。

关键词:

Unity3D;坦克大战游戏;游戏引擎

第1章项目概述

1.1项目背景

随着社会的科技水平和经济水平的迅速发展,游戏行业以迅雷不及掩耳之势快速的发展着。

现在的游戏行业和电影行业可以说已经站在同一高度,特别是3D技术的进步使得游戏在人们的日常生活中占据着重要的地位。

在3D技术如此盛行的今天,游戏引擎收到的关注也持续高涨,目前主要的引擎有BigWorld引擎、UnrealEngine3虚幻引擎、Gamebryo引擎、Unity3D引擎。

相对于前三种引擎来说,Unity3D是最近几年才流行起来,但它由于完美的跨平台系统使他迅速的在引擎市场占据了重要的地位。

本文将介绍一款以Unity3D为开发平台,结合C#的坦克大战游戏系统,该系统在保证运行效果的同时,具有设备要求低,跨平台性能好,运行流畅稳定的特点。

1.2技术路线

1.2.1游戏设计与制作阶段

在游戏设计的阶段就要想好这款游戏的大概内容,主题鲜明,并且具有良好的游戏乐趣,游戏内容丰富,符合我们日常生活中的逻辑规律。

1.2.2开发环境

Unity3D

Unity是一款跨平台的游戏开发工具,从一开始就被设计成易于使用的产品。

作为一个完全集成的专业级应用,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.SetActiv

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 军事

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

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