1、unity3d小游戏开发星空大战毕业实训报告大学论文 毕业实训报告课题名称: Unity 游戏开发 专 业: 移动开发 班 级: 学 号: 学生姓名: 指导教师: 年 月 日中 原 工 学 院毕 业 实 训 任 务 书 年 月9日学生姓名学号专 业软件开发班级课题名称Unity3D小游戏开发(星空大战)课题来源指导教师专业软件工程职称讲师 课题说明:开发路线: 1,游戏背景(连续播放) 2,添加主角 3,设置游戏主角的动画 4,添加两种子弹并设置子弹的运动 5,添加三种子弹 设置子弹的自动生成和运动 6,添加两种奖励物品 设置奖励物品的自动生成和运动 7,设置主角的控制 7.1检测手指触摸 7
2、.2问题:防止主角飞出屏幕 8,设置Tag 添加子弹和敌人的碰撞 9,设计敌人 0 1 2 震动动画和爆炸效果 10,添加脚本GameManager做游戏的控制 11,统计分数 摘 要摘 要 游戏,目前已经是最大众化的娱乐之一,而其中的3D游戏也是技术含量较高的项目之一。Unity3D是一个3D/2D游戏开发工具和游戏引擎套件,其中包括了图形、音频、物理、网络等多方面的引擎支持,并且有一个非常强大的编辑器来整合这一切,非常适合于游戏开发。本文主要是以Unity5.3.8为开发环境,设计并开发一款单机版的三维游戏直升机大战,旨在介绍直升机战斗游戏的实现方法,并逐步介绍使用Unity3D开发3D游
3、戏的方法和技巧。通过这次游戏制作,使我体会到了,制作一个游戏所需要做的工作,包括前期的游戏策划,素材的制作,到后期的游戏的设计,代码实现等,最终形成一个完整的3D游戏,并通过Unity3D选择平台生成可执行文件。但本次设计的直升机战斗游戏所做工作还不够完善,开始场景中菜单比较简单,游戏中武器只有一种,关卡也只有一个,这些都需要以后进一步设计. 第1章 项目分析1.1 Unity 及其组成的介绍本书主要讲解的是,如何使用 Unity 开发 2D 游戏。但在开始讲解之前,最好先熟悉一 下 Unity 这个工具。本章会首先介绍 Unity 的下载和安装,然后会介绍 Unity 界面的各组成 部分,这
4、些知识会在本书后面的章节频繁使用,所以不要掉以轻心。1.2 Unity 概述Unity 现如今已是非常的流行,因此在开始学习 2D 游戏开发之前,本节就来简要说明 下 Unity,及其下载和安装方法。 1.Unity 简介 Unity 是一款跨平台的专业游戏引擎, 可以使用它轻松的开发各种 2D 和 3D 游戏, 然后 部署到各种游戏平台上。 当然也包括这些主流游戏平台: Windows、 iOS、 Android、 Xbox 360、 PS3。 第2 章 2.1 需求分析玩家:控制游戏中的战机,向敌机发出攻击;敌机: 敌机不会发射子弹攻击玩家,boss敌机由程序控制自动向玩家飞机发出攻击子弹
5、: 玩家和boss 敌机都拥有自己的子弹,玩家的子弹可以用来攻击所有的敌机子弹礼包:玩家飞机得到子弹礼包后,玩家的飞机会在一段时间内有发射双排子弹功能炸弹礼包:玩家飞机得到子弹礼包后,玩家飞机如果使用炸弹可以清除屏幕上除boss外的所有敌机。 2.2 功能需求:1用户进入游戏开始菜单可以选择开始游戏,退出游戏,游戏帮助;2进入游戏后可暂停游戏3玩家飞机以一定速度自下而上飞行,用户可以控制飞机前后左右移动4玩家飞机一直发子弹,用户通过控制飞机位置来扫描敌机;5不同种类的敌机以一定速度随机出现;6玩家飞机的发射子弹击中敌机后消失。7玩家飞机达到一定分数后,程序会随机提供子弹包和炸弹包;8玩家与礼包
6、碰撞后即可得到礼包;9弹礼包后,玩家的飞机会在一段时间内有发射双排子弹功能10进行游戏时,屏幕左上角会显示用户达到的分数;2.3 用户功能需求 由于本游戏交互性好,简单易操作,对用户并没有特殊的要求。一般用户经过几分钟后就可以掌握游戏规则。2.4 游戏性能需求 1)实时性: 本应用为手机游戏对于用户操作必须做出立即响应,否则本游戏失败 2)单机手机游戏最大的特点纪委已操作行,用户在不看说明的情况下也能够玩,并且在玩过几遍之后即熟悉本游戏规则。这是本应用对于操作性的要求。2.5 游戏流程: 如图2.5-1 第3章 场景设计3.1.创建游戏场景 1.由于创建的是2d项目,则将图片拖入Scene中,
7、该图片自动成为一个精灵,所以将图片信息拖入摆放即可。 如图 3-1-1 所示2.下面创建一个GameManager文件,其绑定在摄像机中,主要负责飞机生命,玩家得分,背景播放等的显示功能。而生命,得分的显示需要我们创建GUIText来摆放。public enum GameState Runing, Pausepublic class GameManager : MonoBehaviour public static GameManager _instance; public int score=0; private GUIText guiText; public GameState gameS
8、tate = GameState.Runing; void Awake() _instance=this; guiText=GameObject.FindGameObjectWithTag(ScoreGUI).GetComponent(); / Update is called once per frame void Update () guiText.text=Score:+score; public void transfromGameState() if(gameState=GameState.Runing) pauseGame(); else if(gameState=GameStat
9、e.Pause) continueGame(); 3.然后我们来实现背景的滚动。首先创建两个一样的背景图片上下摆放,如下图所示,这里切换到3d模式,更加形象如图 3-1-34.下面创建用于绑定在背景上的脚本BackgroundTransform,代码如下public class BackgroundTransform : MonoBehaviour public static float moveSpeed = 2f; / Update is called once per frame void Update () this.transform.Translate( Vector3.down
10、* moveSpeed * Time.deltaTime ); Vector3 postion = this.transform.position; if(postion.y4.3f) Destroy(this.gameObject); void OnTriggerEnter2D(Collider2D other) if(other.tag=Enemy) if(!other.GetComponent().isDeath) other.gameObject.SendMessage(BeHit); GameObject.Destroy(this.gameObject); 6.上面代码中我用了bul
11、letTop,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() In
12、vokeRepeating(fire,1,rate); public void stopFire() CancelInvoke(fire); 好了,通过以上的代码我们就可以按键盘的方向键移动飞机,按空格键发射子弹了,我已经等不及要打敌人了。3.2 创建敌机 1.敌机也是先拖入敌机图片,然后绑定脚本,添加组件,然后保存为预设,我们以后还有个敌机生产器要生产敌机呢。我创建了三种敌机预设 3-2-1 敌机预制2.敌机主要是移动,碰撞。下面来看看敌机脚本:public enum EnemyType smallEnemy, middleEnemy, bigEnemypublic class Enemy
13、: 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 hitTi
14、mer = 0.2f; private float resetHitTime ; public Sprite hitSprites; / Use this for initialization void Start () render = this.GetComponent(); resetHitTime=hitTimer; hitTimer=0; / Update is called once per frame void Update () this.transform.Translate( Vector3.down*speed*Time.deltaTime ); if(this.tran
15、sform.position.y=explosionSprites.Length) /destroy Destroy(this.gameObject); else render.sprite= explosionSpritesframeIndex; else if(type=EnemyType.middleEnemy|type=EnemyType.bigEnemy) if(hitTimer=0) hitTimer-=Time.deltaTime; int frameIndex = (int)(resetHitTime-hitTimer)/(1f/explosionAnimationFrame)
16、; frameIndex%=2; render.sprite= hitSpritesframeIndex; if (Input.GetKeyDown(KeyCode.Space) & BombManager._instance.count0 ) toDie(); public void BeHit() hp-=1; / explosion if(hp Animation和 Winodws - Animator可以打开如下窗口。 如图 3-1-3 如图 3-1-3-14.下面是敌机生产器,在主界面的左右两边的顶部分别放上两个空物体用来创建敌机。敌机创建时间为13秒不等,然后绑定创建脚本即可。 p
17、ublic class Spawn : MonoBehaviour public GameObject enemy0Prefab; public GameObject enemy1Prefab; public GameObject enemy2Prefab; public GameObject awardType0Prefab; public GameObject awardType1Prefab; public float enemy0Rate = 0.5f; public float enemy1Rate = 5f; public float enemy2Rate = 8f; public
18、 float awardType0Rate = 7; public float awardType1Rate = 10; / Use this for initialization void Start () InvokeRepeating(createEnemy0,1,enemy0Rate); InvokeRepeating(createEnemy1,3,enemy1Rate); InvokeRepeating(createEnemy2,6,enemy2Rate); InvokeRepeating(createAwardType0,10,awardType0Rate); InvokeRepe
19、ating(createAwardType1,10,awardType1Rate); / Update is called once per frame void Update () public void createEnemy0() float x = Random.Range(-2.15f,2.15f); GameObject.Instantiate(enemy0Prefab,new Vector3(x,transform.position.y,0),Quaternion.identity); public void createEnemy1() float x = Random.Ran
20、ge(-2.04f,2.04f); GameObject.Instantiate(enemy1Prefab,new Vector3(x,transform.position.y,0),Quaternion.identity); public void createEnemy2() float x = Random.Range(-2.04f,2.04f); GameObject.Instantiate(enemy2Prefab,new Vector3(x,transform.position.y,0),Quaternion.identity); public void createAwardTy
21、pe0() GetComponent().Play(); float x = Random.Range(-2.1f,2.1f); GameObject.Instantiate(awardType0Prefab,new Vector3(x,transform.position.y,0),Quaternion.identity); public void createAwardType1() GetComponent().Play(); float x = Random.Range(-2.1f,2.1f); GameObject.Instantiate(awardType1Prefab,new V
22、ector3(x,transform.position.y,0),Quaternion.identity); 5.关于碰撞检测敌机碰撞,如果碰到了敌机死亡:3-1-5.1敌机碰撞,由于只要碰撞就死亡,所以动画帧执行时间快,死亡很快。运行界面:3-1-5.23.2 UI 设计 :每次打死敌机加分,三种不同的加分分数,分别5,10 ,15分。在游戏界面编辑创建游戏Text,记录分数,以及退出时记录最高成绩。重新开始按钮,和退出成绩按钮Button组件。如图视窗所示: 3-2-1 Ok!下面开始通过代码来控制程序的显示和执行: 3-2-2运行程序效果:死亡时保存记录最高分 3-2-3 可以看出图中我
23、设计了奖励,保存为预制体 如果吃到奖励增加左右子弹的发射攻击敌机 3-2-4 控制奖励的移动逻辑: 3-2-5运行如下: 3-2-6 游戏结束时点击退出和重新开始执行不同的事件。 退出: 3-2-7 退出代码图重新开始就再次开始重玩即可。第4章 第五章 结束语本章是对整个实训过程的总结,首先总结实训完成情况(很好完成、较好完成、还是未完成等),要具体说明开发效果,有哪些不足,有哪些待改进;然后总结自己的心得体会,有哪些收获,有哪些经验,遇到了什么问题,是如何解决的,对整个行业的认识有什么提高,对自己的优势劣势有什么认识等等,内容不限。参考文献1 童爱红. Visual C#.NET应用教程M. 北京:人民邮电出版社,2004.32 李兰友 杨晓光. Visual C#.NET程序设计M 北京:清华大学出版社,2004.53 韩玉民. 计算机专业英语教学研究与实践 J.计算机与信息技术,2008,(6):106-107.4 When mouse use computer.EB/OL. 2008-12-26.附录A: 附加图、表附录B: 主要源程序
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1