unity3d小游戏开发星空大战毕业实训报告大学论文.docx
《unity3d小游戏开发星空大战毕业实训报告大学论文.docx》由会员分享,可在线阅读,更多相关《unity3d小游戏开发星空大战毕业实训报告大学论文.docx(25页珍藏版)》请在冰豆网上搜索。
unity3d小游戏开发星空大战毕业实训报告大学论文
毕业实训报告
课题名称:
Unity游戏开发
专业:
移动开发
班级:
学号:
学生姓名:
指导教师:
年月日
中原工学院
毕业实训任务书
年月9日
学生姓名
学号
专业
软件开发
班级
课题名称
Unity3D小游戏开发(星空大战)
课题来源
指导教师
专业
软件工程
职称
讲师
课题说明:
开发路线:
1,游戏背景(连续播放)
2,添加主角
3,设置游戏主角的动画
4,添加两种子弹并设置子弹的运动
5,添加三种子弹
设置子弹的自动生成和运动
6,添加两种奖励物品
设置奖励物品的自动生成和运动
7,设置主角的控制
7.1检测手指触摸
7.2问题:
防止主角飞出屏幕
8,设置Tag
添加子弹和敌人的碰撞
9,设计敌人012震动动画和爆炸效果
10,添加脚本GameManager做游戏的控制
11,统计分数
摘要
摘要游戏,目前已经是最大众化的娱乐之一,而其中的3D游戏也是技术含量较高的项目之一。
Unity3D是一个3D/2D游戏开发工具和游戏引擎套件,其中包括了图形、音频、物理、网络等多方面的引擎支持,并且有一个非常强大的编辑器来整合这一切,非常适合于游戏开发。
本文主要是以Unity5.3.8为开发环境,设计并开发一款单机版的三维游戏——直升机大战,旨在介绍直升机战斗游戏的实现方法,并逐步介绍使用Unity3D开发3D游戏的方法和技巧。
通过这次游戏制作,使我体会到了,制作一个游戏所需要做的工作,包括前期的游戏策划,素材的制作,到后期的游戏的设计,代码实现等,最终形成一个完整的3D游戏,并通过Unity3D选择平台生成可执行文件。
但本次设计的直升机战斗游戏所做工作还不够完善,开始场景中菜单比较简单,游戏中武器只有一种,关卡也只有一个,这些都需要以后进一步设计.
第1章项目分析
1.1Unity及其组成的介绍
本书主要讲解的是,如何使用Unity开发2D游戏。
但在开始讲解之前,最好先熟悉一下Unity这个工具。
本章会首先介绍Unity的下载和安装,然后会介绍Unity界面的各组成部分,这些知识会在本书后面的章节频繁使用,所以不要掉以轻心。
1.2Unity概述
Unity现如今已是非常的流行,因此在开始学习2D游戏开发之前,本节就来简要说明下Unity,及其下载和安装方法。
1.Unity简介Unity是一款跨平台的专业游戏引擎,可以使用它轻松的开发各种2D和3D游戏,然后部署到各种游戏平台上。
当然也包括这些主流游戏平台:
Windows、iOS、Android、Xbox360、PS3。
第2章
2.1需求分析
玩家:
控制游戏中的战机,向敌机发出攻击;
敌机:
敌机不会发射子弹攻击玩家,boss敌机由程序控制自动向玩家飞机发出攻击
子弹:
玩家和boss敌机都拥有自己的子弹,玩家的子弹可以用来攻击所有的敌机
子弹礼包:
玩家飞机得到子弹礼包后,玩家的飞机会在一段时间内有发射双排子弹功能
炸弹礼包:
玩家飞机得到子弹礼包后,玩家飞机如果使用炸弹可以清除屏幕上除boss外的所有敌机。
2.2功能需求:
1》用户进入游戏开始菜单可以选择开始游戏,退出游戏,游戏帮助;
2》进入游戏后可暂停游戏
3》玩家飞机以一定速度自下而上飞行,用户可以控制飞机前后左右移动
4》玩家飞机一直发子弹,用户通过控制飞机位置来扫描敌机;
5》不同种类的敌机以一定速度随机出现;
6》玩家飞机的发射子弹击中敌机后消失。
7》玩家飞机达到一定分数后,程序会随机提供子弹包和炸弹包;》
8》玩家与礼包碰撞后即可得到礼包;
9》弹礼包后,玩家的飞机会在一段时间内有发射双排子弹功能
10》进行游戏时,屏幕左上角会显示用户达到的分数;
2.3用户功能需求
由于本游戏交互性好,简单易操作,对用户并没有特殊的要求。
一般用户经过几分钟后就可以掌握游戏规则。
2.4游戏性能需求
1)实时性:
本应用为手机游戏对于用户操作必须做出立即响应,否则本游戏失败
2)单机手机游戏最大的特点纪委已操作行,用户在不看说明的情况下也能够玩,并且
在玩过几遍之后即熟悉本游戏规则。
这是本应用对于操作性的要求。
2.5游戏流程:
如图2.5-1
第3章场景设计
3.1.创建游戏场景
1.由于创建的是2d项目,则将图片拖入Scene中,该图片自动成为一个精灵,所以将图片信息拖入摆放即可。
如图3-1-1所示
2.下面创建一个GameManager文件,其绑定在摄像机中,主要负责飞机生命,玩家得分,背景播放等的显示功能。
而生命,得分的显示需要我们创建GUIText来摆放。
publicenumGameState{
Runing,
Pause
}
publicclassGameManager:
MonoBehaviour{
publicstaticGameManager_instance;
publicintscore=0;
privateGUITextguiText;
publicGameStategameState=GameState.Runing;
voidAwake(){
_instance=this;
guiText=GameObject.FindGameObjectWithTag("ScoreGUI").GetComponent();
}
//Updateiscalledonceperframe
voidUpdate(){
guiText.text="Score:
"+score;
}
publicvoidtransfromGameState(){
if(gameState==GameState.Runing){
pauseGame();
}elseif(gameState==GameState.Pause){
continueGame();
}
}
3.然后我们来实现背景的滚动。
首先创建两个一样的背景图片上下摆放,如下图所示,这里切换到3d模式,更加形象
如图3-1-3
4.下面创建用于绑定在背景上的脚本BackgroundTransform,代码如下
publicclassBackgroundTransform:
MonoBehaviour{
publicstaticfloatmoveSpeed=2f;
//Updateiscalledonceperframe
voidUpdate(){
this.transform.Translate(Vector3.down*moveSpeed*Time.deltaTime);
Vector3postion=this.transform.position;
if(postion.y<=-8.52f){
this.transform.position=newVector3(postion.x,postion.y+8.52f*2,postion.z);
}
}
}
然后将脚本绑定在两张背景图上即可。
5.主角创建与背景创建基本一样,也是可以用一张2d贴图,就不多说了。
主角脚本主要处理移动,发射子弹,处理碰撞等,代码如下:
publicclassBullet:
MonoBehaviour{
publicfloatspeed=2;
//Updateiscalledonceperframe
voidUpdate(){
transform.Translate(Vector3.up*speed*Time.deltaTime);
if(transform.position.y>4.3f){
Destroy(this.gameObject);
}
}
voidOnTriggerEnter2D(Collider2Dother){
if(other.tag=="Enemy"){
if(!
other.GetComponent().isDeath){
other.gameObject.SendMessage("BeHit");
GameObject.Destroy(this.gameObject);
}
}
6.上面代码中我用了bulletTop,bulletLeft,bullfight,这是我为主机添加的两个子对象,主要是用于发射子弹,相当于炮筒吧,而bullet则是定义的预设,其中绑定的脚本后面会说明。
3-1-6
代码实现如下:
publicclassGun:
MonoBehaviour{
publicfloatrate=0.2f;
publicGameObjectbullet;
publicvoidfire(){
GameObject.Instantiate(bullet,transform.position,Quaternion.identity);
}
publicvoidopenFire(){
InvokeRepeating("fire",1,rate);
}
publicvoidstopFire(){
CancelInvoke("fire");
}
好了,通过以上的代码我们就可以按键盘的方向键移动飞机,按空格键发射子弹了,我已经等不及要打敌人了。
3.2创建敌机
1.敌机也是先拖入敌机图片,然后绑定脚本,添加组件,然后保存为预设,我们以后还有个敌机生产器要生产敌机呢。
我创建了三种敌机预设
3-2-1敌机预制
2.敌机主要是移动,碰撞。
下面来看看敌机脚本:
publicenumEnemyType{
smallEnemy,
middleEnemy,
bigEnemy
}
publicclassEnemy:
MonoBehaviour{
publicinthp=1;
publicfloatspeed=2;
publicintscore=100;
publicEnemyTypetype=EnemyType.smallEnemy;
publicboolisDeath=false;
publicSprite[]explosionSprites;
privatefloattimer=0;
publicintexplosionAnimationFrame=10;
privateSpriteRendererrender;
publicfloathitTimer=0.2f;
privatefloatresetHitTime;
publicSprite[]hitSprites;
//Usethisforinitialization
voidStart(){
render=this.GetComponent();
resetHitTime=hitTimer;
hitTimer=0;
}
//Updateiscalledonceperframe
voidUpdate(){
this.transform.Translate(Vector3.down*speed*Time.deltaTime);
if(this.transform.position.y<=-5.6f){
Destroy(this.gameObject);
}
if(isDeath){
timer+=Time.deltaTime;//0
intframeIndex=(int)(timer/(1f/explosionAnimationFrame));
if(frameIndex>=explosionSprites.Length){
//destroy
Destroy(this.gameObject);
}else{
render.sprite=explosionSprites[frameIndex];
}
}else{
if(type==EnemyType.middleEnemy||type==EnemyType.bigEnemy){
if(hitTimer>=0){
hitTimer-=Time.deltaTime;
intframeIndex=(int)((resetHitTime-hitTimer)/(1f/explosionAnimationFrame));
frameIndex%=2;
render.sprite=hitSprites[frameIndex];
}
}
}
if(Input.GetKeyDown(KeyCode.Space)&&BombManager._instance.count>0){
toDie();
}
}
publicvoidBeHit(){
hp-=1;
//explosion
if(hp<=0){
toDie();
}else{
hitTimer=resetHitTime;
}
}
privatevoidtoDie(){
if(!
isDeath){
isDeath=true;
GameManager._instance.score+=score;
}
}
}
3-2-2
3.上面使用到了一个动画,就是敌机爆炸时的动画。
那么如何创建动画呢?
首先资源中可以拖动一组连续的爆炸图片到场景中,系统会自动提醒创建动画,命名为explosion即可。
然后Project视图中就出现了一个animation和一个animator。
在菜单栏找到Windows->Animation和Winodws->Animator可以打开如下窗口。
如图3-1-3
如图3-1-3-1
4.下面是敌机生产器,在主界面的左右两边的顶部分别放上两个空物体用来创建敌机。
敌机创建时间为1~3秒不等,然后绑定创建脚本即可。
publicclassSpawn:
MonoBehaviour{
publicGameObjectenemy0Prefab;
publicGameObjectenemy1Prefab;
publicGameObjectenemy2Prefab;
publicGameObjectawardType0Prefab;
publicGameObjectawardType1Prefab;
publicfloatenemy0Rate=0.5f;
publicfloatenemy1Rate=5f;
publicfloatenemy2Rate=8f;
publicfloatawardType0Rate=7;
publicfloatawardType1Rate=10;
//Usethisforinitialization
voidStart(){
InvokeRepeating("createEnemy0",1,enemy0Rate);
InvokeRepeating("createEnemy1",3,enemy1Rate);
InvokeRepeating("createEnemy2",6,enemy2Rate);
InvokeRepeating("createAwardType0",10,awardType0Rate);
InvokeRepeating("createAwardType1",10,awardType1Rate);
}
//Updateiscalledonceperframe
voidUpdate(){
}
publicvoidcreateEnemy0(){
floatx=Random.Range(-2.15f,2.15f);
GameObject.Instantiate(enemy0Prefab,newVector3(x,transform.position.y,0),Quaternion.identity);
}
publicvoidcreateEnemy1(){
floatx=Random.Range(-2.04f,2.04f);
GameObject.Instantiate(enemy1Prefab,newVector3(x,transform.position.y,0),Quaternion.identity);
}
publicvoidcreateEnemy2(){
floatx=Random.Range(-2.04f,2.04f);
GameObject.Instantiate(enemy2Prefab,newVector3(x,transform.position.y,0),Quaternion.identity);
}
publicvoidcreateAwardType0(){
GetComponent().Play();
floatx=Random.Range(-2.1f,2.1f);
GameObject.Instantiate(awardType0Prefab,newVector3(x,transform.position.y,0),Quaternion.identity);
}
publicvoidcreateAwardType1(){
GetComponent().Play();
floatx=Random.Range(-2.1f,2.1f);
GameObject.Instantiate(awardType1Prefab,newVector3(x,transform.position.y,0),Quaternion.identity);
}
}
5.关于碰撞检测
敌机碰撞,如果碰到了敌机死亡:
3-1-5.1
敌机碰撞,由于只要碰撞就死亡,所以动画帧执行时间快,死亡很快。
运行界面:
3-1-5.2
3.2UI设计:
每次打死敌机加分,三种不同的加分分数,分别5,10,15分。
在游戏界面编辑创建游戏Text,记录分数,以及退出时记录最高成绩。
重新开始按钮,和退出成绩按钮Button组件。
如图视窗所示:
3-2-1
Ok!
下面开始通过代码来控制程序的显示和执行:
3-2-2
运行程序效果:
死亡时保存记录最高分
3-2-3
可以看出图中我设计了奖励,保存为预制体
如果吃到奖励增加左右子弹的发射攻击敌机
3-2-4
控制奖励的移动逻辑:
3-2-5
运行如下:
3-2-6
游戏结束时点击退出和重新开始执行不同的事件。
退出:
3-2-7退出代码图
重新开始就再次开始重玩即可。
第4章
第五章结束语
本章是对整个实训过程的总结,首先总结实训完成情况(很好完成、较好完成、还是未完成等),要具体说明开发效果,有哪些不足,有哪些待改进;然后总结自己的心得体会,有哪些收获,有哪些经验,遇到了什么问题,是如何解决的,对整个行业的认识有什么提高,对自己的优势劣势有什么认识等等,内容不限。
参考文献
[1]童爱红.VisualC#.NET应用教程[M].北京:
人民邮电出版社,2004.3
[2]李兰友杨晓光.VisualC#.NET程序设计[M]北京:
清华大学出版社,2004.5
[3]韩玉民.计算机专业英语教学研究与实践[J].计算机与信息技术,2008,(6):
106-107.
[4]Whenmouseusecomputer.[EB/OL].2008-12-26.
附录A:
附加图、表
附录B:
主要源程序