admin 管理员组

文章数量: 887021


2023年12月23日发(作者:什么是分布式架构系统)

毕业实训报告

课题名称:基于Unity3d的坦克大战游戏的设计与实现

专 业:

软件技术

班 级:

RZ软技154

学 号:

2

学生姓名: 卢杰

指导教师:

赵冬

2017年 5月 15日

同学于 年 月在实训中,该同学在

关于卢杰同学的实训鉴定

日 至 年 月 日在我公司

部门进行了毕业实训。单位签章:

指导教师签字:

年 月 日

中 原 工 学 院

毕 业 实 训 任 务 书

2017

学生姓名

专 业

课题名称

课题来源

指导教师

课题说明:

该系统利用Unity3D跨平台功能的突出、兼容性强的特点,结合C#开发一款坦克大战的游戏系统,画面好看,游戏方式简单,玩家易上手。

张鑫宇,李星辰 专业

卢杰

软件技术

学号

班级

年2月13日

2

RZ软技154

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

实训公司

Unity3D

职称 讲师

承担的任务:

寻找素材搭建场景,并编写相应功能的代码

工作进度安排: 第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并优化项目

指导教师签字:

年 月 日

实训单位意见

签章:

年 月 日

学院意见

签章:

年 月 日

中 原 工 学 院

毕 业 实 训 评 审 表

学号

题目

2 姓名 卢杰 专业 软件技术 班级 RZ软技154

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

成绩(百分制): 指导教师签名: 年 月 日

摘 要

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

课题题目为基于Unity3D的坦克大战游戏的射击与开发,旨在成功的设计出一款可以在PC端运行的坦克游戏,在毕业设计完成时,坦克模型应该能再PC端运行。游戏中,我们可以利用鼠标、键盘来对我们的坦克进行前进后退,而且可以对坦克进行旋转以及发射炮弹,通过这次设计,自己也体验了技术实现的过程。

关键词: Unity3D; 坦克大战游戏; 游戏引擎

目 录

摘 要 ............................................................................... V

第1章 项目概述 ....................................................................... 1

1.1

项目背景 ........................................................................ 1

1.2

技术路线 ........................................................................ 1

1.2.1 游戏设计与制作阶段 ........................................................... 1

1.2.2 开发环境 ..................................................................... 1

1.3

项目设计目标 .................................................................... 1

第2章 系统设计 ....................................................................... 2

2.1

系统的整体设计 .................................................................. 2

2.2

系统的界面设计 .................................................................. 2

2.2.1 游戏主菜单 ................................................................... 2

2.2.2 游戏帮助界面 ................................................................. 3

2.2.3 游戏结束界面 ................................................................. 3

2.2.4 游戏主界面 ................................................................... 4

2.2.5 主角模型 ..................................................................... 4

2.2.6 敌人模型 ..................................................................... 5

2.2.7 游戏地图模型 ................................................................. 5

第3章 游戏菜单界面实现 ............................................................... 6

3.1

按钮的实现 ...................................................................... 6

3.2

游戏主菜单界面的实现 ............................................................ 6

3.2.1 说明按钮 ..................................................................... 6

3.2.2 退出按钮 ..................................................................... 6

3.2.3 游戏开始按钮 ................................................................. 6

3.3

游戏帮助界面的实现 .............................................................. 7

3.3.1 关闭按钮 ..................................................................... 7

3.3.2 游戏帮助文字 ................................................................. 7

3.4

游戏结束界面的实现 .............................................................. 7

3.4.1 重新开始按钮 ................................................................. 7

3.4.2 退出游戏按钮 ................................................................. 7

3.4.3 分数显示 ..................................................................... 8

3.5

游戏主界面的实现 ................................................................ 8

3.5.1 重置按钮 ..................................................................... 8

3.5.2 退出按钮 ..................................................................... 8

3.5.2 游戏得分 ..................................................................... 8

第4章 游戏主界面实现 ................................................................ 10

4.1

场景的搭建 ..................................................................... 10

4.2

主角的功能实现 ................................................................. 10

4.2.1移动 ......................................................................... 10

4.2.2攻击 ......................................................................... 10

4.2.3受到伤害 ..................................................................... 11

4.3

摄像机的功能实现 ............................................................... 12

4.3.1移动 ......................................................................... 12

4.3.2围绕主角旋转 ................................................................. 12

4.3.3视野的拉近或拉远 ............................................................. 13

4.4

敌人的功能实现 ................................................................. 13

4.4.1 生成 ........................................................................ 13

4.4.2 移动 ........................................................................ 14

4.4.3 攻击 ........................................................................ 14

4.4.4 受伤 ........................................................................ 15

4.5

炮弹的碰撞检测 ................................................................. 16

4.5.1 炮弹的身份 .................................................................. 16

4.5.1 碰撞检测 .................................................................... 16

第5章 系统测试 ...................................................................... 18

5.1

在UNITY3D中运行测试 ............................................................. 18

5.2

在PC中运行测试 ................................................................. 18

5.3测试结果 ........................................................................ 21

第6章 结束语 ........................................................................ 22

第1章 项目概述

1.1 项目背景

随着社会的科技水平和经济水平的迅速发展,游戏行业以迅雷不及掩耳之势快速的发展着。现在的游戏行业和电影行业可以说已经站在同一高度,特别是3D技术的进步使得游戏在人们的日常生活中占据着重要的地位。在3D技术如此盛行的今天,游戏引擎收到的关注也持续高涨,目前主要的引擎有BigWorld引擎、Unreal Engine3虚幻引擎、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)代码如下

public void OnIntroButtonClick()

{

ene("StartUI_Intro");

}

3.2.2 退出按钮

(1)功能

退出按钮的功能是将游戏退出。

(2)代码如下

public void OnExitButtonClick()

{

();

}

3.2.3 游戏开始按钮

(1)功能

游戏开始的功能是进入游戏主场景,也就是切换到游戏主场景。

(2)代码如下

public void OnStartButtonClick()

{

ene("Main");

}

3.3 游戏帮助界面的实现

3.3.1 关闭按钮

(1)功能

关闭按钮的功能是关闭游戏帮助界面,回到游戏主菜单,也就是切换到游戏主菜单。

(2)代码

public void OnCloseButtonClick()

{

ene("StartUI");

}

3.3.2 游戏帮助文字

界面上的文字描述,主要是利用UGUI中的Label来实现。在Text属性里输入需要显示的内容,即可显示出来。如图3.1所示:

图3.1 游戏帮助Text

3.4 游戏结束界面的实现

3.4.1 重新开始按钮

(1)功能

重新开始按钮的功能是回到游戏主界面,也就是切换到游戏主界面

(2)代码

public void OnResetButtonClick()

{

ene("Main");

}

3.4.2 退出游戏按钮

(1)功能

退出游戏按钮的功能是将游戏退出

(2)代码

public void OnExitButtonClick()

{

();

}

3.4.3 分数显示

(1)功能

分数显示是在游戏结束后将数据保存下来,切换到游戏结束场景后将数据读取并显示出来,然后将分数归0。

(2)代码

using ;

public Text score_Text;

void Start()

{

score_ = "最终得分为:" + ing("分数") + "分";

ing("分数", "0");

}

3.5 游戏主界面的实现

3.5.1 重置按钮

(1)功能

重置功能按钮是将游戏回到刚开始游戏的样子,也就是重新加载本场景

(2)代码

public void OnResetButtonClick()

{

ene("Main");

}

3.5.2 退出按钮

(1)功能

退出按钮的功能是回到游戏结束的界面,也就是将场景切换到游戏结束的场景。

(2)代码

public void OnQuitButtonClick()

{

ene("GameOver");

}

3.5.2 游戏得分

(1)功能

当击杀一个敌人后变增加分数,并且保存分数,将分数显示出来

(2)代码

public void ScoreAdd()

{

= "分数:" + scoreNum + "分";

ing("分数", ng());

}

第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)代码

private void PlayerMove()

{

horizontal = s("Horizontal");

vertical = s("Vertical");

m_ty = d * vertical * moveSpeed;

m_rVelocity = * horizontal * angularSpeed;

}

4.2.2攻击

(1)实现思路

当按下鼠标左键的时候,在主角坦克的炮口这个位置,实例化一个炮弹,并且给子弹一个向前发射的速度。

(2)代码

private void PlayerAttack()

{

if (seButtonDown(0))

{

if(terOverGameObject())

{

return;

}

GameObject newShell = Instantiate(m_Shell, m_on,

m_on) as GameObject;

ponent().identity = playerIdentity;

ponent().velocity = d *

ponent().moveSpeed;

ponent().shellAttack = attack;

m_();

}

}

4.2.3受到伤害

(1)实现思路

当敌人的炮弹碰撞到主角时,将敌人的攻击力通过炮弹的传过来,使主角减少血量,当主角血量为0时,在主角的位置实例化一个坦克爆炸的特效,并且销毁主角这个对象。碰撞检测需要给主角加碰撞体组件。碰撞体组件如图4.2所示。

图4.2 刚体组件

(2)代码

public void PlayerBruise(float atk)

{

if (playerHp <= 0)

{

return;

}

playerHp -= atk;

hp_ount -= atk / PLAYERHP;

if (playerHp <= 0)

{

Instantiate(m_TankExplosion, on + ,

ty);

Destroy(gameObject);

isPlayerDie = true;

}

}

4.3 摄像机的功能实现

摄像机是Unity3D开发中不可获取的组件,它就像人类的眼睛以及耳朵,如果没有摄像机就什么也看不见,什么也听不见。而在本项目中,摄像机的作用是,跟随主角,并可以自由旋转,亦可以通过鼠标滚轮来拉近或拉远视角,达到3D的效果。

4.3.1移动

(1)实现思路

在主界面场景运行的时候,将摄像机看向主角,并记录下主角与摄像机的偏移量,然后将自己的位置与主角的位置永远保持在一个偏移量中。

(2)代码

void Start()

{

(PlayerController._on);

offect = on - PlayerController._on;

}

private void CameraMove()

{

on = PlayerController._on + offect;

}

4.3.2围绕主角旋转

(1)实现思路

当按下鼠标右键时通过Mouse X轴和Mouse Y轴来获取鼠标的移动量,来改变摄像机的旋转。

(2)代码

private void CameraRotate()

{

if (seButton(1))

{

Around(PlayerController._on,

PlayerController._, s("Mouse X") *

rotateSpeed);

Vector3 newPosition = on;

Quaternion newRotation = on;

Around(PlayerController._on,

, -s("Mouse Y") * rotateSpeed);

if (ngles.x < 10 || ngles.x > 80)

{

on = newPosition;

on = newRotation;

}

}

offect = on - PlayerController._on;

}

4.3.3视野的拉近或拉远

(1)实现思路

通过滑动鼠标滚轮来拉近或拉远视野,也就是用Mouse ScrollWheel轴通过改变摄像机与主角距离的大小来控制摄像机视野的拉近或者拉远。

(2)代码

private void CameraScrollWheel()

{

distance = ude;

distance -= s("Mouse ScrollWheel") * scrollWheelSpeed;

distance = (distance, 2, 20);

offect = ized * distance;

}

4.4 敌人的功能实现

敌人的功能主要是移动,射击,受伤爆炸,生成等。

4.4.1 生成

(1)实现思路

在地图上选择3-5个出生点,然后使用随机数获取其中一个位置,然后在这个位置上实例化敌人。

(2)代码

IEnumerator CreatEnemy()

{

while (true)

{

yield return new WaitForSeconds(creatTime);

GameObject go = Instantiate(enemyTank, ld((0,

ount)).position, ty) as

GameObject;

}

}

4.4.2 移动

(1)实现思路

敌人的移动是通过Unity内置的寻路系统来控制,Unity寻路系统需要将需要寻路的地面的Navigation Static勾选上,然后点击菜单栏的Window菜单,点击Navigation后点击Bake,即可完成寻路的设置。

然后用代码来控制寻路点,使敌人移动。当敌人与主角之间的距离大于一定的距离时,敌人寻路点为主角需要保护的建筑物,当敌人与主角之间的距离小于一定距离时,敌人的寻路点为主角的位置。

(2)代码

private void EnemyMove()

{

if (ce(on,

PlayerController._on) >=

m_ngDistance)

{

m_tination(on);

Quaternion target = tation(on -

on, );

on = (on, target,

ime / 0.1f);

}

else

{

m_tination(PlayerController._on);

Quaternion target =

tation(PlayerController._on - on, );

on = (on, target,

ime / 0.1f);

}

}

4.4.3 攻击

(1)实现思路

当敌人寻路停止时,即找到目标时,开始计时,每几秒在炮口实例化一颗炮弹,并给炮弹一定的速

度。

(2)代码

private void EnemyAttack()

{

runTime += ime;

if (runTime >= time)

{

if (m_ingDistance != 0 && m_ingDistance <=

m_ngDistance + 0.1f)

{

runTime = 0;

GameObject newShell = Instantiate(m_Shell, m_on,

m_on) as GameObject;

ponent().identity = enemyIdentity;

ponent().velocity = d *

ponent().moveSpeed;

ponent().shellAttack = attack;

m_();

}

}

}

4.4.4 受伤

(1)实现思路

当主角的炮弹碰撞到敌人时,将主角的攻击力通过炮弹的传过来,使敌人减少血量,当敌人血量为0时,在敌人的位置实例化一个坦克爆炸的特效,并且销毁敌人这个对象。碰撞检测需要给敌人加碰撞体组件。

(2)代码

public void EnemyBruise(float atk)

{

if (enemyHp <= 0)

{

return;

}

enemyHp -= atk;

hp_ount -= atk / ENEMYHP;

if (enemyHp <= 0)

{

Instantiate(m_TankExplosion, on + ,

ty);

m_ive(false);

Destroy(gameObject);

GameManager._um++;

GameManager._dd();

}

}

4.5 炮弹的碰撞检测

4.5.1 炮弹的身份

给炮弹定义一个叫做身份的枚举,里面有玩家和敌人,当玩家攻击实例化子弹的时候就将实例化生成的子弹的身份设置为玩家,当敌人攻击实例化子弹的时候就将实例化生成的子弹的身份设置为敌人。枚举代码如下:

public enum ShellIdentity

{

PLAYER,

ENEMY,

}

4.5.1 碰撞检测

(1)实现思路

碰撞的检测使用Unity3D内置的API方法,是OnTriggerEnter,功能是当碰撞的那一瞬间触发一次该方法,而碰撞的必要条件是,碰撞的双方都有碰撞体,双方至少一方有刚体,才会触发碰撞。当子弹碰撞到对象时,销毁自己,然后在炮弹的位置生成炮弹爆炸特效,然后会验证碰撞体身份,如果子弹的身份与碰撞体的身份不一致的话即调用碰撞体的受伤方法。

(2)代码

private void OnTriggerEnter(Collider other)

{

if ( == )

{

return;

}

if ( == "Enemy" && identity !=

ponent().enemyIdentity)

{

ponent().EnemyBruise(shellAttack);

}

else if ( == "Player" && identity !=

ponent().playerIdentity)

{

ponent().PlayerBruise(shellAttack);

}

else if ( == "Map" && identity == )

{

GameManager._ise(shellAttack);

}

Instantiate(m_ShellExplosion, on, ty);

Destroy(gameObject);

}

第5章 系统测试

5.1 在Unity3D中运行测试

点击软件中的运行按钮,如图5.1所示。

图5.1 运行按钮

游戏在软件中测试运行,如图5.2所示。

图5.2 Unity3D中运行

游戏能够正常运行,没有报错,测试成功。

5.2 在PC中运行测试

点击File选择Build Settings出现打包菜单,如图5.3所示。

图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] 李兰友 杨晓光. Visual C#.NET程序设计[M]. 北京:清华大学出版社,2004.5.

[3] 韩玉民. 计算机专业英语教学研究与实践 [J].计算机与信息技术,2008,(6):106-107.

[4] 吴亚峰 于复兴. Unity3D游戏开发技术详解与典型案例[M].北京:人民邮电出版社,2012.

[5] 亚当斯.游戏设计基础[M].北京:机械工业出版社,2009.

[6] 荣钦科技.游戏设计概论[M].北京:科海电子出版社,2003.


本文标签: 游戏 界面 功能 主角 实现