卢杰基于UnityD的坦克大战游戏的设计和实现.docx
- 文档编号:25452463
- 上传时间:2023-06-08
- 格式:DOCX
- 页数:29
- 大小:2.58MB
卢杰基于UnityD的坦克大战游戏的设计和实现.docx
《卢杰基于UnityD的坦克大战游戏的设计和实现.docx》由会员分享,可在线阅读,更多相关《卢杰基于UnityD的坦克大战游戏的设计和实现.docx(29页珍藏版)》请在冰豆网上搜索。
卢杰基于UnityD的坦克大战游戏的设计和实现
毕业实训报告
课题名称:
基于Unity3d坦克大战游戏设计与实现
专业:
软件技术
班级:
RZ软技154
学号:
60190410
学生姓名:
卢杰
指引教师:
赵冬
5月15日
关于卢杰同窗实训鉴定
同窗于年月日至年月日在我公司部门进行了毕业实训。
在实训中,该同窗在
单位签章:
指引教师签字:
年月日
中原工学院
毕业实训任务书
年2月13日
学生姓名
卢杰
学号
专业
软件技术
班级
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并优化项目
指引教师签字:
年月日
实训单位意见
签章:
年月日
学院意见
签章:
年月日
中原工学院
毕业实训评审表
学号
姓名
卢杰
专业
软件技术
班级
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
newShell.GetComponent
newShell.GetComponent
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
newShell.GetComponent
newShell.GetComponent
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炮弹身份
给炮弹定义一种叫做身份枚举,里面有玩家和敌人,当玩家袭击实例化子弹时候就将实例化生成子弹身
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 UnityD 坦克 大战 游戏 设计 实现