unity3d塔防游戏的设计与实现大学论文.docx
《unity3d塔防游戏的设计与实现大学论文.docx》由会员分享,可在线阅读,更多相关《unity3d塔防游戏的设计与实现大学论文.docx(25页珍藏版)》请在冰豆网上搜索。
![unity3d塔防游戏的设计与实现大学论文.docx](https://file1.bdocx.com/fileroot1/2023-2/25/19672621-8523-4afa-bfae-d8225f10f701/19672621-8523-4afa-bfae-d8225f10f7011.gif)
unity3d塔防游戏的设计与实现大学论文
江海职业技术学院
毕业设计
毕业设计题目:
unity3D塔防游戏的设计与实现
学生学号:
*********
学生姓名:
踪训军
所在系(部):
信息工程系
专业及班级:
计算机1401
**************************************
完成日期:
2017-02-10
摘要游戏,目前已经是最大众化的娱乐之一。
Unity是这几年非常热门的一种开发引擎之一。
它具有非常强力的跨平台能力,其中还包含了图形、音频、物理系统、网络等多方面的引擎支持,是一个2D、3D游戏引擎套件和游戏开发工具,并且有一个非常强大的编辑器来整合这一切,因此被广大游戏开发者所喜爱。
本次毕业设计,围绕手机游戏开发的实现,利用Unity3D游戏开发工具,基于C#语言编写,开发制作一款手机游戏塔防游戏《突破重围》,并对项目需求及游戏的设计和具体实现进行分析。
关键词塔防,手机游戏,Unity3D,Android
第1章绪论
1.1论文结构安排1。
1节可以放在绪论的最后
本论文共有五章。
结构安排如下:
第一章:
对游戏开发架构的背景,及项目和对市场的需求分析进行了简要介绍。
第二章:
unity3D介绍
第三章:
《突破重围》游戏的概要设计和游戏主要功能设计的简介。
第四章:
《突破重围》游戏类的详细实现,对游戏架构中各个部分涉及到的相关知识进行介绍,然后给出设计的思路,最后给出具体实现。
第五章:
总结本次游戏的实现过程。
这个和你上面的目录对吗?
1.2市场需求分析与意义
90年代初国外的3D游戏开始起步,第一部3D第一人称射击游戏是美国的卡马克的《重返德军总部》,最早3D游戏引擎由其开发的Doom引擎。
国内3D游戏始于2003年,首款自主研发,目前,国内有了很多的研究在3D游戏上,但是由于国内3D技术起步较晚,技术方面想比外国还是有不小差距,从设计理念到开发制作,国内能有自主研发的3D游戏引擎的,只有屈指可数的互联网公司,大部分游戏公司和游戏开发者还在用国外大型游戏公司所开发的游戏引擎,如Unity3D,虚幻,寒霜。
虽然国内今年出现许多优秀的游戏团队和游戏公司,开发了数款质量较高的3D游戏,例如《古剑奇谭》系列,《仙剑奇侠传》系列等,但是比起《模拟人生》,《魔兽世界》,《战地》系列等国际游戏大作仍有不可逾越的差距,这也使得国内玩家的财富大量流向国外。
随着移动设备的硬件日益强大,如手机的硬件相比于10年前电脑的配置还要强大,这样使用者在使用的时候,就会有大量应用的需求,目前来说,有两种主流的手机操作系统:
Android和IOS,这两种操作系统之所以成为主流,就是因为庞大的系统应用在背后支持,所以,应用的开发在手机系统的竞争中尤为重要。
然而应用的跨平台移植会带来大量的问题,例如开发语言不同,移植代价太高等,但是,国外开发的一款游戏引擎完美地解决了跨平台开发难的问题,那就是Unity3D引擎,虚拟机技术被运用到Unity3D中,独立于平台执行的游戏编译结果。
对于3D引擎的研究,在国内还处于起步阶段,所以我们认真研究国外的优秀游戏引擎,对将来自主开发3D游戏引擎有巨大的帮助。
。
随着移动智能设备的快速普及,先后有BAT等互联网巨头的加入与PC端游厂商的转型或设立移动游戏研发部门,进军移动游戏市场,争先恐后来分这块大蛋糕,可说现阶段国内移动游戏市场竞争十分激烈,正处于一片红海,然而2017年对移动游戏市场来说也正是进入黄金时代的开始。
这块你全面复制粘贴了?
自己精简一下,突出引用Unity3D的意义与优势。
1.3项目的简介
本论文主要构思为2D类塔防游戏,传统的塔防都是电脑按照一条既定的路线进攻,玩家也只是单纯防守的模式,而本论文设计开发的这款游戏则是电脑防守、玩家进攻的模式。
同时,玩家有大量新技能可以使用,
下面的,你自己在组织下自己的语言,参照语文的语句标准。
操作方式也参照其他流行游戏,例如《天天过马路》那种简单操作的设计理念,玩家只要点击手机屏幕就可以控制。
游戏的平台为安卓。
通过Unity3D游戏开发工具以及NGUI插件工具,基本上实现了整个游戏的制作。
利用C#语言和MonoDevelopment编译工具,编写各个脚本代码,让游戏的各项操作跟游戏中的碰撞效果、NGUI界面、粒子特效都得以实现。
第2章unity3D介绍
1.2Unity3D的介绍
1.2.1Unity3D总体概述
Unity3D是由丹麦Unity公司开发的游戏设计开发工具,拥有强大的跨平台发布能力,支持多种语言编辑,可开发运行在PC、MacOS、PS3、XBox360、Wii、IOS、Android等平台,也可利用UnityWebplayer插件发布网页游戏,以及支持开发线上游戏(网络游戏),是一个全面整合的专业游戏引擎。
Unity3D提供了容易上手的操作界面,支持PhysX物理引擎、粒子系统等,降低了游戏开发的门槛,缩短了游戏开发的时间以及制作成本。
Unity简单直观的设计界面、高度的兼容性,使得游戏设计开发者能高效地完成工作。
因此,Unity成了目前国内很多游戏开发者和VR开发者的首选工具之一。
分层次写
1.2.2Unity3D软件特色
写这些特色前要先综合一小段。
你写的Unity3D的特点,不要写本游戏中用到的啥啥的,如果真要写,可以放到后面第三章等。
综合编辑:
通过Unity简单的用户界面,用户可以完成任何工作,这些为用户节省了大量的时间。
在本论文中的游戏编程过程中,可以整体对每一个界面进行编辑,节约了一个一个打开每个界面的时间,并且程序可以在界面中共享,节约了大量的相同程序重复编辑使用的时间,提高了整体的效率。
资源导入:
Unity支持所有主要文件格式,并能和大部分相关应用程序协同工作。
本游戏中使用的JPEG格式的图片可以尽数导入Unity3D中进行编辑,对于游戏的整体实现十分有利。
一键部署:
Unity可以让作品在多平台呈现。
利用File选项中的Build Setting功能,可以选择平台来发布游戏,可供选择的方案十分齐全,完成的作品可以发布到Windows、Android、IOS平台等,对于本次毕业设计的要求——发布到移动平台上,Unity3D更是可以完全满足需求。
iPhone以及Android发布:
Unity让革命性的游戏开发降临革命性的设备。
这正是我们这次毕业设计的核心,移动平台的发布可以满足更多群体的需求,这也是为什么采用Unity3D作为本次毕业设计核心软件的原因。
音频和视频:
实时三维图形混合音频流、视频流。
在本游戏中,我在主界面内添加了声音控件,以达到使本游戏更具吸引力的效果。
脚本:
Unity支持3种脚本语言:
JavaScript,C#,Boo。
本次游戏的设计,编程主要使用到了C#语言,Unity3D对于C#语言的支持使得程序的制作者可以尽可能地完成所需功能的设计以及实现。
Unity资源服务器:
Unity资源服务器是一个附加的包括版本控制的产品。
文档:
Unity可以提供逐步的指导、文档和实例方案。
在编辑过程中遇到问题时,可以对所需知识寻求帮助,这一点对本次毕业设计帮助很大。
因为本身对于Unity3D这款软件的认识有限,所以当有指导、文档和实例方案作为参考后,编程的过程更轻松了,通过借鉴Unity3D自带的实例能找到可以触类旁通的编程设计方法。
拖动操作:
Unity3D软件中大部分的操作都可用拖动操作来实现,使Unity3D包、模型、字体、图片等资源的导入步骤变得非常简单,只需要将资源拖入到相应的位置便可以实现导入,简化了操作,节约了时间,提高了开发的效率。
第3章游戏概要设计
3.1整体游戏设计
先要描写你游戏的情节,让不懂的人看了就明白。
《突破重围》游戏是基于安卓平台的一款手机游戏,主要完成游戏功能如下:
这句话别扭吗?
1、敌人的AI
敌人一共有4个状态:
观望状态、巡逻状态、攻击状态、死亡状态,每个状态间的转化都是用UNITY里的Animation系统的状态机去改变。
2、玩家的技能
玩家一个有8个技能:
疾跑、坚韧、隐身、命运、治疗、伪装、先发制人、赌博,每个技能在每个关卡只能使用一次。
3、玩家的移动
为了简化玩家的操作,所以只要触摸屏幕就可以实现移动。
4、各个UI界面的实现
游戏的UI界面有:
开场插画界面、主界面、设置界面、选关界面、加载界面、失败界面。
3.2游戏截图
下面这些图片务必要跟在你的某一个段下面,你自己可以看看别人的论文样式
图2-1游戏开场动画界面
图2-2游戏主界面画面
图2-3游戏选关画面
图2-4loading界面
图2-5游戏画面
3.3设计概要就是故事描述吗?
如果是,请按我的要求和上面合并
在主场景(主画面)中,有4个按钮,分别是开始游戏、继续游戏、游戏说明、退出游戏,通过“开始游戏”按钮进入选关界面,按下按钮选择关卡后进入相应的场景中,通过“继续游戏”可以进入之前的关卡,“游戏说明”界面是介绍游戏的操作方法,在场景中按下“返回键”返回主菜单。
在各个难度场景中,进入场景前,会让玩家先选这一关的技能,每个技能在每个关卡中只能使用一次;技能的使用要花费水晶,玩家的水晶来自于场景收集或者通过关卡后的水晶奖励(过关得到的水晶量跟游戏时间成反比、跟玩家过关血量成正比)。
玩家作为一名逃亡者,有着自己本身的血量,各种敌人有着自己的AI,当他们没有发现目标的时候,他们会在各自的领域巡逻。
每个敌人都有一个巡逻盲区,玩家可以利用这些盲区来躲避敌人。
当玩家进入敌人视野内,敌人会开火攻击玩家,当玩家血量减少到小于或者等于零的时候,玩家死亡,游戏结束;场景中会有一个发光点,只要玩家安全到达这个发光点,即算胜利,游戏过关,解锁下一个关卡。
3.4游戏类图游戏类图是什么东西?
图3-1游戏类图
mainmenu类是游戏的界面管理类,实现游戏中界面的功能。
而Loading类是游戏的加载类,使游戏能在玩家进入关卡前先加载。
游戏中除了mainmenu类跟loading类2个类是单体类之外,其他类都有依赖关系。
其中,Skilldate类和Emnimy类、Player类都依赖于SkillManger类,因为在SkillManger类中,要实现各种技能的作用,而技能涉及到的不仅是玩家,还有敌人,所以这2个类都跟SkillManger有依赖关系。
至于Skilldate类,是用于表示每个技能的数据,所以也是依赖于SkillManger类。
而SkillManger类与MoneyData类则依赖于GameControl类,游戏管理类是管理游戏的一个类,敌人的所有行为都在敌人类中完成,而玩家的大部分行为也在玩家类中完成,所以游戏管理类要做的就是及时存储游戏中产生的数据,以便以后需要的时候可以使用;还有就是管理玩家技能,在游戏开始时候,记录玩家选择的技能还有初始化玩家选择的技能。
3.5游戏流程图你这个流程图不应该是在你设计的最前面吗?
而且莫名其妙一张图,什么承上启下的东西也没有?
这是论文,不是数学
图3-2游戏流程图
3.5游戏主要功能设计?
3.6.1开场插画
现在很多游戏,特别是手机游戏都喜欢用插画来代替游戏一开始的开场动画,所以《突破重围》游戏中也是用插画作为游戏的开场动画。
先导进一个一个UNITY的资源包叫做LeanTween,这个可以更好地实现简单动画的效果,例如平移、缩放。
接着把准备做插画的若干张资源图放进同一个物体进行管理,然后给这个物体加碰撞盒,每次点击这个碰撞盒,都会移动一定的距离。
具体的操作如下:
定义一个存放管理所有图片的空物体Item;
然后给这个Item通过UIEventListener挂钩上点击函数
在点击函数里面实现的就是用LeanTween.moveLocalX移动这个物体
3.6.2选关界面的效果
界面主要是用NGUI里面的UIToggle组件以及DragScolleview,当关卡选中的情况下,通过OnTriggerEnter改变原图的大小来实现。
3.6.3模型动画的切换
模型动画根据自己的需要先切割成自己想要的动画,然后逐段给动画起个名字,代码控制部分如下:
定义一个共有变量Emnimy_Animation类型是Animation;
因为需要多次用到动画的切换,所以在这里把动画的切换写成一个方法,以便使用。
publicvoidSetEmnimyAnimation(动画的名字,类型是string)
{
Emnimy_Animation.CrossFade(动画的名字);
}
调用这个方法的时候只要你传进一个string类型的参数,这个参数必须是某段动画的名字,模型就会自动播放相对应的动画。
3.6.4敌人的AI实现
敌人的AI是该游戏的重点之一,AI的实现是用协程去完成的,具体的伪代码如下:
定义一个结构体emnimy里面包含敌人的所有状态有Think,run,Attack,Die4种。
定义4种状态的协程函数IEnumeratorAttack(),IEnumeratorSeeAround(),IEnumeratorMove(),IEnumeratorDie();
publicIEnumeratorAttack()
{
改变敌人状态为Attack
while(true)
{
if(如果玩家不在攻击范围内)
{
yieldreturn0;
}
If(如果玩家没有在敌人视野内)
{
改变敌人状态为思考
yieldreturnStartCoroutine(GameStart());
}
播放攻击动画
设置敌人的朝向朝着玩家
玩家扣血
yieldreturn0;
}
}
publicIEnumeratorSeeAround()
{
播放站立动画
随机一个数用来当做敌人的朝向
Quaternion.Slerp让敌人平缓从当前朝向转到随机方向;
yieldreturnnewWaitForSeconds
(2);
}
publicIEnumeratorMove()
{
播放奔跑动画
设置奔跑的方向
调用Quaternion.LookRotation(下一个节点的位置–当前位置)得到下个位置的朝向;
Quaternion.Slerp让敌人平缓从当前朝向转到下个朝向;
敌人移动调用transform.Translate给敌人一个速度;
状态改变为Run
yieldreturn0;
}
publicIEnumeratorDie()
{
播放死亡动画
调用Destroy销毁敌人
状态改变为Die;
yieldreturn0;
}
这4个协程的开关,都是在GameStart函数实现,具体如下:
publicIEnumeratorGameStart()
{
while(true)
{
if(达到攻击条件)
{
关闭其他所有协程StopAllCoroutines();
yieldreturnStartCoroutine(Attack());
}
if(敌人状态为Think)
{
yieldreturnStartCoroutine(SeeAround());
}
if(敌人状态为Die)
{
yieldreturnStartCoroutine(Die());
yieldreturnnewWaitForSeconds(2.0f);
}
yieldreturnStartCoroutine(Move());
}
}
3.6.5释放技能特效的实现
技能的特效本身是用UNITY的粒子系统完成的,把特效做成一个预设体,以便多次使用。
特效要在主角的身上释放,所以当需要特效的话,先Instantiate出特效,然后获取主角的位置,给特效的位置赋值,最后因为特效只是一瞬间出现,所以在产生特效的同时,就要给他加一个定时的destroy,让他产生后会自动destroy吊,节省内存。
3.6.6主角的行走路线
主角是按一定的路线行走,首先要把所有的拐弯点都先放置一个带有碰撞盒的空物体,把这些空物体放在一个链表管理,然后给玩家一个速度,每次当玩家需要改变朝向的时候,都先去路点链表里面找下个路点,改变朝向后,下个路点在链表的位置要加一。
3.6.7游戏中的碰撞检测
在unity3d中,能检测碰撞发生的方式有两种,一种是利用碰撞器,另一种则是利用触发器,这两种方式的应用非常广泛。
为了完整地了解这两种方式,我们必须理解以下概念:
碰撞器是一群组件,它包含了很多种类,比如:
BoxCollider、CapsuleCollider等,这些碰撞器应用的场合不同,但都必须加到GameObjecet身上。
所谓触发器,只需要在检视面板中的碰撞器组件中勾选IsTrigger属性选择框。
在Unity3d中,主要有以下接口函数来处理这两种碰撞检测:
触发信息检测:
1.MonoBehaviour.OnTriggerEnter(Colliderother)当进入触发器
2.MonoBehaviour.OnTriggerExit(Colliderother)当退出触发器
3.MonoBehaviour.OnTriggerStay(Colliderother)当逗留触发器
碰撞信息检测:
1.MonoBehaviour.OnCollisionEnter(CollisioncollisionInfo)当进入碰撞器
2.MonoBehaviour.OnCollisionExit(CollisioncollisionInfo)当退出碰撞器
3.MonoBehaviour.OnCollisionStay(CollisioncollisionInfo) 当逗留碰撞器
第4章游戏具体实现
你第三章里面不就是程序的设计吗?
你游戏具体实现,最后不就是通过代码完成吗?
我不明白你的逻辑,请你整理好了,让我能看懂再说。
4.1程序实现程序实现,按我理解应该是具体的程序代码吧。
你下面的是不是Unity中的C#中函数的功能?
如果不清楚,你真的可以参考下其他人的论文格式
4.1.1Emnimy
描述:
这个是一个敌人的类,该类里面包含着敌人的所有行为,通关有限状态机去控制敌人的行为变化。
类的设计
图4-1Emnimy类的实现
类的解析:
该类主要通过有限状态机,定义敌人的所有行为,通过开协程的方式去控制敌人的状态转化,实现敌人的AI。
publicenumemnimy
{
Think,
run,
Attack,
Die
}
敌人的移动是先定义好位置,把定义好的位置存在一个链表里面,通过读取链表里面的下一个节点进行移动。
敌人的攻击状态是先判断玩家是否进入攻击范围内,UNITY自带一个函数Physics.OverlapSphere可以检测一定范围内是否有碰撞体玩家进入一定距离的攻击范围内,视野的判断是用矩阵的点乘来计算,如果玩家位置与敌人位置的点乘是正数,则说明玩家是在敌人的面前,即玩家已经进入了视野范围;如果是负数,则不在视野范围内。
通过以上2个办法,敌人可以自动判断出是否进行攻击。
敌人的死亡则是直接调用UNITY的destroy函数。
敌人的动画设置是通过UNITY自带的Animator动画系统。
4.1.2Player
描述:
玩家类,相对于敌人类,玩家类的设计比较简单,没有复杂的AI,也不用攻击,玩家类主要就是实现玩家的行走、人物的属性设置、包裹血量、护甲和移动速度。
类的设计
图4-2Player类的实现
类的解析:
该类主要设计了多个接口,包括有人物血量的接口、护甲的接口、速度的接口,方便调用。
玩家受伤的伤害是通过SetDamage去实现,因为游戏中有很多关卡,所以为了设计为每个关卡敌人的攻击力不同,所以在玩家类里面,设计了一个方法叫GetHurt,这个方法是用来获取玩家受伤的类型,一共有3种,MG伤害是1,Rocket伤害是2,Tower伤害是4。
4.1.3GameControl
描述:
游戏控制类,主要是负责进入游戏界面后的一切操作。
类的设计
图4-3GameControl类的实现
类的解析:
这个类主要是用于进入游戏后的操作,例如游戏开始时的选择技能,如果水晶不足购买技能的话,就会弹出对话框提示玩家,游戏中有游戏界面的按钮事件,可以通过委托,把按钮的处理事件挂在按钮上面。
其中技能图标的产生可以用Instantiate的方法。
选择技能的时候,首先定义一个链表,把全部技能都放进这个链表里面,判断是否选择这个技能,则是在链表里面判断所有元素,通过判断元素本身的checkmark的透明度是不是为1来确定到底有没有选择该技能,然后再定义一个链表,用于存储选择的技能。
上面说到委托,因为委托在游戏中被大量运用,并且在C#里也非常重要,所以在这里简单介绍一下委托。
委托是一个可以引用方法的对象,当创建一个委托,也就创建一个引用方法的对象,进而就可以调用那个方法,即委托可以调用它所指的方法。
委托的好处是拓展性强。
4.1.4Level
描述:
主要是负责判断游戏是否通关。
如果确定游戏通关,就进行游戏的结算。
类的设计
图4-4Level类的实现
类的解析:
在游戏中,每一关都有一个目的地,如何找到玩家是否来到目的地,就要通关UNITY里面的触发器,给目的地添加触发器。
该类实现的是当玩家触发触发器的时候,游戏应该处理的事件,例如出现结算界面、系统自动结算、数据的保存,OnTriggerEnter函数就是UNITY的系统触发函数。
上面提到了触发器,与之对应的还有UNITY的碰撞器,二者非常相似,但还是有所不同。
碰撞器碰撞的条件必须是碰撞物体有一方必须有刚体,而触发器则只需勾选碰撞盒上的IsTrigger属性就可以,而且二者调用的函数也不同。
4.1.5MainMenu
描述:
界面类,主要负责游戏界面的管理
类的设计
图4-5MainMenu类的实现
类的解析:
游戏中所有UI都是用UNITY插件NGUI实现的,所以该类需要实现的有游戏的音乐控制、按钮的挂钩事件,然后通过委托,让游戏中的界面的按钮实现功能。
UNITY中界面一般都是用NGUI去实现,因为自带的GUI系统,效率太低,它是类似于Update函数,每一帧都要去执行的。
4.1.6Moneydate
描述:
数据的保存类,游戏中一般有3种数据保存方式,保存为XML文件、保存为TXT文件以及保存为永久化数据,该类中主要就是保存为永久化数据。
类的设计
图4-6MoneyData类的实现
类的解析
这是一个单独的类,主要是保存游戏中产生的数据。
在《突破重围》这个游戏中,主要需要保存的数据有2个:
一个是当前关卡的保存,方便继续游戏的进度;另外一个是游戏中钱的保存。
游戏中用到的保存利用是PlayerPrefs类,把需要保存的数据保存为永久化数据。
当下次进入游戏的时候,判断数据是否有保存,有就读取数据。
4.1.7SkillData
描述:
技能的数据类,用来辨别不同的技能,不同的技能对应的数据都是不一样的。
类的设计
图4-7SkillData类的实现
类的解析
该类中,为了辨别不同的技能,定义了不同的ID、