当前位置:文档之家› unity3d小游戏开发(星空大战)毕业实训报告大学论文

unity3d小游戏开发(星空大战)毕业实训报告大学论文

毕业实训报告课题名称: Unity 游戏开发专业:移动开发班级:学号:学生姓名:指导教师:年月日中原工学院毕业实训任务书摘要摘要游戏,目前已经是最大众化的娱乐之一,而其中的3D游戏也是技术含量较高的项目之一。

Unity3D是一个3D/2D游戏开发工具和游戏引擎套件,其中包括了图形、音频、物理、网络等多方面的引擎支持,并且有一个非常强大的编辑器来整合这一切,非常适合于游戏开发。

本文主要是以Unity5.3.8为开发环境,设计并开发一款单机版的三维游戏——直升机大战,旨在介绍直升机战斗游戏的实现方法,并逐步介绍使用Unity3D开发3D游戏的方法和技巧。

通过这次游戏制作,使我体会到了,制作一个游戏所需要做的工作,包括前期的游戏策划,素材的制作,到后期的游戏的设计,代码实现等,最终形成一个完整的3D游戏,并通过Unity3D选择平台生成可执行文件。

但本次设计的直升机战斗游戏所做工作还不够完善,开始场景中菜单比较简单,游戏中武器只有一种,关卡也只有一个,这些都需要以后进一步设计.第1章项目分析1.1 Unity 及其组成的介绍本书主要讲解的是,如何使用 Unity 开发 2D 游戏。

但在开始讲解之前,最好先熟悉一下Unity 这个工具。

本章会首先介绍 Unity 的下载和安装,然后会介绍 Unity 界面的各组成部分,这些知识会在本书后面的章节频繁使用,所以不要掉以轻心。

1.2 Unity 概述Unity 现如今已是非常的流行,因此在开始学习 2D 游戏开发之前,本节就来简要说明下Unity,及其下载和安装方法。

1.Unity 简介 Unity 是一款跨平台的专业游戏引擎,可以使用它轻松的开发各种 2D 和 3D 游戏,然后部署到各种游戏平台上。

当然也包括这些主流游戏平台: Windows、 iOS、 Android、 Xbox 360、 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来摆放。

public enum GameState{Runing,Pause}public class GameManager : MonoBehaviour {public static GameManager _instance;public int score=0;private GUIText guiText;public GameState gameState = GameState.Runing;void Awake(){_instance=this;guiText=GameObject.FindGameObjectWithTag("ScoreGUI").GetComponent<GUIText>();}// Update is called once per framevoid Update () {guiText.text="Score:"+score;}public void transfromGameState(){if(gameState==GameState.Runing){pauseGame();}else if(gameState==GameState.Pause){continueGame();}}3.然后我们来实现背景的滚动。

首先创建两个一样的背景图片上下摆放,如下图所示,这里切换到3d 模式,更加形象如图3-1-34.下面创建用于绑定在背景上的脚本BackgroundTransform,代码如下public class BackgroundTransform : MonoBehaviour {public static float moveSpeed = 2f;// Update is called once per framevoid Update () {this.transform.Translate( Vector3.down * moveSpeed * Time.deltaTime );Vector3 postion = this.transform.position;if(postion.y<=-8.52f){this.transform.position = new Vector3(postion.x,postion.y+8.52f*2,postion.z );}}}然后将脚本绑定在两张背景图上即可。

5.主角创建与背景创建基本一样,也是可以用一张2d贴图,就不多说了。

主角脚本主要处理移动,发射子弹,处理碰撞等,代码如下:public class Bullet : MonoBehaviour {public float speed = 2;// Update is called once per framevoid Update () {transform.Translate( Vector3.up * speed *Time.deltaTime );if(transform.position.y>4.3f){Destroy(this.gameObject);}}void OnTriggerEnter2D(Collider2D other) {if(other.tag=="Enemy"){if(!other.GetComponent<Enemy>().isDeath){other.gameObject.SendMessage("BeHit");GameObject.Destroy(this.gameObject);}}6.上面代码中我用了bulletTop,bulletLeft,bullfight,这是我为主机添加的两个子对象,主要是用于发射子弹,相当于炮筒吧,而bullet则是定义的预设,其中绑定的脚本后面会说明。

3-1-6代码实现如下:public class Gun : MonoBehaviour {public float rate =0.2f;public GameObject bullet;public void fire(){GameObject.Instantiate(bullet,transform.position,Quaternion.identity );}public void openFire(){InvokeRepeating("fire",1,rate);}public void stopFire(){CancelInvoke("fire");}好了,通过以上的代码我们就可以按键盘的方向键移动飞机,按空格键发射子弹了,我已经等不及要打敌人了。

3.2 创建敌机1.敌机也是先拖入敌机图片,然后绑定脚本,添加组件,然后保存为预设,我们以后还有个敌机生产器要生产敌机呢。

我创建了三种敌机预设3-2-1 敌机预制2.敌机主要是移动,碰撞。

下面来看看敌机脚本:public enum EnemyType{smallEnemy,middleEnemy,bigEnemy}public class Enemy : MonoBehaviour {public int hp = 1;public float speed = 2;public int score = 100;public EnemyType type= EnemyType.smallEnemy;public bool isDeath = false;public Sprite[] explosionSprites;private float timer=0;public int explosionAnimationFrame=10;private SpriteRenderer render;public float hitTimer = 0.2f;private float resetHitTime ;public Sprite[] hitSprites;// Use this for initializationvoid Start () {render = this.GetComponent<SpriteRenderer>();resetHitTime=hitTimer;hitTimer=0;}// Update is called once per framevoid Update () {this.transform.Translate( Vector3.down*speed*Time.deltaTime );if(this.transform.position.y<=-5.6f){Destroy(this.gameObject);}if(isDeath){timer+=Time.deltaTime;// 0int frameIndex = (int)(timer/(1f/explosionAnimationFrame));if(frameIndex>=explosionSprites.Length){//destroyDestroy(this.gameObject);}else{render.sprite= explosionSprites[frameIndex];}}else{if(type==EnemyType.middleEnemy||type==EnemyType.bigEnemy){if(hitTimer>=0){hitTimer-=Time.deltaTime;int frameIndex = (int)((resetHitTime-hitTimer)/(1f/explosionAnimationFrame));frameIndex%=2;render.sprite= hitSprites[frameIndex];}}}if (Input.GetKeyDown(KeyCode.Space) && BombManager._instance.count>0 ) {toDie();}}public void BeHit(){hp-=1;// explosionif(hp<=0){toDie();}else{hitTimer=resetHitTime;}}private void toDie(){if(!isDeath){isDeath=true;GameManager._instance.score+=score;}}}3-2-23.上面使用到了一个动画,就是敌机爆炸时的动画。

相关主题