目录

一、学习方向

二、制作步骤

1.新建项目

3.设置为精灵模式

4.精灵图像分割

5.场景布局设置

6.录制小鸟飞翔动画

7.构建飞翔的小鸟让其响应

8.构建UI对象并让其响应

9.构建游戏背景并让其移动

10.障碍生成制作

三、结语


一、学习方向

1.学习设置2D图形

2.搭建2D游戏场景

3.录制小鸟飞翔动画

4.构建飞翔的小鸟让其响应

5.构建UI对象并让其响应

6.构建游戏背景并让其移动

7.障碍生成制作

二、制作步骤

1.新建项目

新建unity2D视图,命名为FlappyBird。(注意:项目名称和存储路径中不要包含中文)

2、导入资源与场景设置

在unity中把我们需要的资源文件Fonts和Sprites拖拽到项目视图文件夹Assets中如下图(选中解压文件夹直接拖动即可)

素材链接:https://pan.baidu.com/s/1au5i39kyDubrhRejYtZT9w?pwd=x46m 
提取码:x46m

3.设置为精灵模式

(1).在工具栏中找到Windows点击,然后在下拉菜单中找到Package Manager 点击弹出如下窗口。

(2).在加号后的菜单中选择Unity  Registry

(3).在Packages选项中找到2D Sprite然后导入(install)即可

4.精灵图像分割

在Assets文件夹中的sprits文件夹中找到我们的BirdHero选中,然后在Inspector(检视视图)中,将Texture Type设置为Sprite(2D and UI),将Sprite Mode设置为Multiple(也就是将单个更改为多个),最后在弹出的窗口中选择Apply(应用)。(如下图所示) 

在点击Apply 之后会弹出新的窗口,在新的窗口最上方菜单栏中选择Slice下拉菜单中点击Slice,这样我们就将BirdHero图片分成了三个小鸟贴图。

关闭这个窗口后,在我们的Sprite文件夹的小鸟素材中就可以看到有三个小鸟素材(如果你的依然显示为BirdHero,不要着急我们只需要点击后面的小三角即可显示。)

5.场景布局设置

(1)将BridHero_01拖到Hierarchy(层级视图)中,重命名为Bird

(2)依次将Grass Thin Sprite和Sky Tile Sprite拖拽到Hierarchy(层级视图)中重命名为Ground和Background

(3)调整图层顺序

选择我们需要调整的图层,在(Inspector)检视视图中找到Order in Layer设置数字,将Bird设置为3,Ground设置为1,BackGround设置为0(效果图如下)

6.录制小鸟飞翔动画

(1)给Bird添加组件Polygen Collider 2D和Rigidbody 2D Component

给Ground添加Box Collider 2D,调整属性,设置参数(如下图),运行一下会发现小鸟会掉落在草地上。

(2)这时的小鸟还不会飞翔,所以我们需要制作小鸟飞翔的动画,步骤如下:

a.选择Bird,在菜单栏中找到Window下拉菜单中的Animation。

b.在弹出的窗口中点击Creat,接着会弹出新的窗口将文件命名为IDLE用来存放资源,然后点击保存即可。(如下图)

c.点击录制按钮,然后点击Add Property,选择Sprite Renderer在下拉菜单中找到Sprite,点击后面的加号。

d.这时候我们需要选中最后一个关键帧将其删除(选中,delete即可)。

e.选择第一个关键帧,在Inspector(检视视图)中将Sprite设置为BirdHero_0

f.选择第一个关键帧复制,点击左上角的IDLE下拉菜单中Creat New Clip,命名为Flappy,保存。

在Flappy面板中首先点击录制按钮,然后将我们复制的IDLE的第一个关键帧粘贴在我们Flappy中,在Inspector(检视视图)中找到Sprite为BirdHero_1。

g.按照步骤f,新建一个Clip命名为DIE,点击录制按钮,复制第一个关键帧,然后更改Sprite为BirdHero_2。到这一步我们就完成了小鸟飞翔的录制。点击关闭Animation,在弹出的窗口保存为Animations。(如果没有弹出系统会默认保存在Assets文件中)

(3)双击Bird Controller进入Animator 面板中

选择IDLE右击选择Make Transition

将IDLRE和另外两个(DIE和Flappy)链接起来,然后选择Flappy右键选择Make Transition制作一条从Flappy到IDLE 的线

在我们的Animator 面板菜单栏中找到Parameters在下面创建两个Trigger分别命名为Flappy和Die

选择从IDLE到DIE的线,在Inspector(检视视图)中,取消勾选Has Exit Time,在下面Conditions中点击加号选择Die

选择从IDLE到Flappy的线,在Inspector(检视视图)中,取消勾选Has Exit Time,在下面Conditions中点击加号选择Flappy(如下图所示)。

从Flappy到IDLE这条线,我们希望在Flappy播放完后直接切换回IDLE,因此不需要取消Has Exit Time的勾选,也不需要设置Conditions,所以这条线就不用管了。

7.构建飞翔的小鸟让其响应

回到Scene视口,首先我们在Assets中新建一个文件夹:点击Assets在空白区域右击选择Create在下拉列表中找到Folder就会创建出一个新的文件夹,这个文件夹主要存放我们的脚本

双击打开我们的Scripts文件夹,然后空白区域右键选择Create下拉列表中的C# Script,然后重命名为Bird,然后将我们的脚本左击不放拖拽到Bird上面

双击打开脚本,进行编译,这一步是鼠标点击屏幕小鸟向上飞翔,Ctrl+s保存脚本然后回到我们的Unity中,这时点击运行我们的游戏,就实现了小鸟向上飞翔

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Bird : MonoBehaviour
{public float upperForce = 250f;         // the force add to bird when it flappy.private Rigidbody2D rb2d;               // the rigidbody 2d componentprivate Animator animator;              // the animator componentprivate bool isDead = false;            // mark if bird is dead.void Start(){rb2d = GetComponent<Rigidbody2D>();animator = GetComponent<Animator>();}void Update(){if (Input.GetMouseButtonDown(0) && !isDead){      // check input and bird's statusrb2d.velocity = Vector2.zero;rb2d.AddForce(new Vector2(0, upperForce));    // add a upper forceanimator.SetTrigger("Flappy");                 // change current animation clip to flappy}}void OnCollisionEnter2D(){rb2d.velocity = Vector2.zero;isDead = true;animator.SetTrigger("Die");                        // change current animation clip to Die}}

 8.构建UI对象并让其响应

(1)在Hierarchy(层级视图)中右键找到UI在下拉列表中找到legacy(旧版)下拉列表选择Text点击创建,重命名为Score Text用来记录分数

(2)选中Score Text,更改Text属性为Score:0,将字体改为LuckiesGuy,设置字体大小Font Size为22,将Alignment属性选择中间两个将字体居中,把字体颜色更改为白色。

(3)选中Score Text,Ctrl+d拷贝两份,分别重命名为GameOverText和RestartText,参照上一步调整字体大小及位置(记得更改Text属性哦),将RestartText拖拽到GameOverText上,让RestartText成为GameOverText的子对象。效果图如下

(4)在Hierarchy视图中右键创建空物体CreateEmpty重命名为GameManager

(5)在Scripts文件夹中创建脚本,右键>create>C# script,重命名为GameManager,然后将其拖拽到我们创建的空物体GameManager上。

(6)双击打开GameManager脚本,进行编辑,主要是更新得分和小鸟死后弹出Game Over UI更新画面Ctrl+s保存,回到unity。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using System;public class GameManager : MonoBehaviour
{public static GameManager instance;             // single instancepublic GameObject gameOverText;                 // game over UIpublic Text scoreText;                          // score textpublic Button playBtn;public GameObject logo;private bool gameOver = false;                  // mark current game statusprivate int score = 0;                          // store score.void Awake(){if (instance == null){                     // set single instanceinstance = this;}else if (instance != null){Destroy(gameObject);}}void Update(){if (gameOver == true && Input.GetMouseButtonDown(0)){         // if gameover and click the picture, restart the game.SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);}}public void AddScore()                          // when the bird cross a obstacle, add score.{if (gameOver)return;score += 1;scoreText.text = "Score: " + score.ToString();}public void GameOver()                          // game over function.{gameOverText.SetActive(true);gameOver = true;}}

(7)双击打开Bird脚本,添加GameOver方法GameManager.instance.GameOver(),添加在 void OnCollisionEnter2D中,Ctrl+S保存,回到unity。

 void OnCollisionEnter2D(){rb2d.velocity = Vector2.zero;isDead = true;animator.SetTrigger("Die");                        // change current animation clip to DieGameManager.instance.GameOver();}

(8)在Hirarchy视图中添加一个Image(图片)重命名为logo,和一个Botton(按钮)重命名为playBtn

选中logo在Inspector视图中更改Source Image属性为标题

选中 playBtn,删除下面自带的Text(Legacy),在Inspector视图中更改Source Image属性为btnPlay

调整playBtn 和logo位置及大小效果图如下

(9)选中Hierarchy视图中的GameManager,将Score Text、Game Over、logo 、playBtn 拖拽到Inspector相应的位置。

选中GameOver 取消勾选Active。

(10)创建一个脚本命名为UIManager,将这个脚本拖拽到logo 和playBtn 上

双击打开我们的GameManager脚本,在代码最后面添加Play的定义指令(添加在GameOver后),这样我们就可以在UIManager脚本中调用Ctrl+s保存

 public void GameOver()                          // game over function.{gameOverText.SetActive(true);gameOver = true;//UIManager.Instance.ShowUI();}internal void Play(){throw new NotImplementedException();}

接下开打开我们的UIManager脚本进行编辑,Ctrl+s保存,将此脚本拖分别拽到playBtn和logo上

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Events;
public class UIManager : MonoBehaviour
{public Button playBtn;public GameObject logo;public static UIManager Instance;// Use this for initializationvoid Awake(){Instance = this;}void Start(){playBtn.onClick.AddListener(onPlay);}// Update is called once per framevoid Update(){}private void onPlay(){playBtn.gameObject.SetActive(false);logo.SetActive(false);GameManager.instance.Play();}public void ShowUI(){playBtn.gameObject.SetActive(true);}
}

选中logo在Inspector中修改UIManager 属性,如下图所示

9.构建游戏背景并让其移动

(1)给Ground添加一个Rigidbody  2D的组件,将Body Type属性更改为Kinematic(因为是通过脚本来移动,而不是用物理系统来完成移动)

在Scripts文件夹中创建新的脚本重命名为ScorllingObject,Ctrl+S将其赋予到Ground上

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class ScrollingObject : MonoBehaviour
{public float scrollSpeed = -2f;         // object scroll speed.private Rigidbody2D rb2d;void Start(){rb2d = GetComponent<Rigidbody2D>();rb2d.velocity = new Vector2(scrollSpeed, 0);}void Update(){if (GameManager.instance.gameOver == true){rb2d.velocity = Vector2.zero;}}}

(2)新建一个c#脚本重命名为RepeatingBackground,打开编辑脚本,Ctrl+s保存脚本将脚本拖拽到Ground上。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class RepeatingBackground : MonoBehaviour
{private BoxCollider2D groundCollider;private float groundHorizontalLength;               // store background's width.void Start(){groundCollider = GetComponent<BoxCollider2D>();groundHorizontalLength = groundCollider.size.x;             // get background's width;}void Update(){if (transform.position.x < -groundHorizontalLength){       // when it move out of screen, reset it's position.RepositionBackground();}}void RepositionBackground(){Vector2 groundOffset = new Vector2(groundHorizontalLength * 2f, 0);transform.position = (Vector2)transform.position + groundOffset;        // reset position}}

(3)将Background拖拽到Ground上,让其成为Ground的一个子对象,新建一个空物体重命名为Bg,将Ground拖拽到Bg上让他成为Bg的子对象,调整Ground的位置,复制一份Groung,效果图如下 。

10.障碍生成制作

(1)将ColumnSprite拖拽到Hierarchy中,为其添加一个Box Collider 2D Component组件调整大小修改属性参数,如下图所示

(2)复制一份ColumnSprite,旋转,调整位置如下

(3)创建一个空物体命名为Column,将两个ColumnSprite拖拽到空物体上,给空物体添加RigidBody 2D组件,设置Type为Kinematic,添加一个Box Collider 2D组件,勾选Is Trigger,调整属性参数,如下图所示

 (4)将ScrollingObject脚本拖拽到Column上,然后新建脚本命名为ColumnCtrl+s保存,然后将脚本拖拽到Column上。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Column : MonoBehaviour
{void OnTriggerEnter2D(Collider2D other){if (other.GetComponent<Bird>() != null){GameManager.instance.AddScore();}}
}

(5)在Project中新建文件夹命名为Prefabds,将空物体Column拖拽到文件夹中让其成为预制件,这时你会发现Column变成了蓝色。 

(6)新建一个脚本命名为ColumnPool,用于管理Column,将此脚本拖拽到GameManager上然后将预制文件夹中的Column拖拽到Column Prefab中如下图所示。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class ColumnsPool : MonoBehaviour
{public GameObject columnPrefab;         // column prefabpublic int poolSize = 5;                // max size of poolpublic float spawnRate = 4.5f;          // spawn ratepublic float columnYMin = -1.45f;       // column's min ypublic float columnYMax = 2.8f;         // column's max yprivate GameObject[] columns;           // column poolprivate Vector2 startSpawnPos = new Vector2(13f, 0f);  // origin start spawn position.private float spawnXPosition = 10f;     // column's x not change.private float lastSpawnTime = 0;        // record the last spawn time.private int currentIndex = 0;           // current column's index in poolvoid Start(){columns = new GameObject[poolSize];     // init columns poolfor (int i = 0; i < poolSize; i++){columns[i] = (GameObject)Instantiate(columnPrefab, startSpawnPos, Quaternion.identity);columns[i].SetActive(false);}}void Update(){if (Time.time - spawnRate > lastSpawnTime){        // after spawnRate time, reset a column's positionlastSpawnTime = Time.time;float columnY = Random.Range(columnYMin, columnYMax);  // get a random y.columns[currentIndex].transform.position = new Vector2(spawnXPosition, columnY);  // reset positioncolumns[currentIndex].SetActive(true);        // active columncurrentIndex++;                                 // turn to next column.if (currentIndex >= poolSize){                 // check overflowcurrentIndex = 0;}}}}

(7)删除Hierarachy中的 Column,运行游戏测试一下即可。

(8)当你运行的时候发现,你的游戏界面是这样的,那么我们只需要修改游戏场景的大小即可

打开我们的游戏视图,点击Free Aspect下拉列表找到+号,创建一个320×480场景大小即可

最后你就会得到这样的视图

三、结语

如果你想让你的游戏更加有趣可以为他添加游戏音效等等,那么本次游戏制作就到此结束啦,不要忘了点赞加关注哦~

注意:如果发现本文章有侵权内容,可以随时联系作者本人,本人将即使撤回进行修改。

Unity3d制作2D游戏飞翔的小鸟(FlappyBird)相关推荐

  1. 使用Unity3D制作2D游戏的重点做法

    官网上有提供一个2D游戏的教学范例,这个游戏只不过把镜头摆放在横向位置跟随角色移动,游戏内物件运动时固定一个轴不动,使他像横轴式的2D游戏来玩,本质上其实还是个3D游戏,所以如果没有3D建模的话不就没 ...

  2. 【源码+图片素材+详细教程】Java游戏开发_Java开发经典游戏飞翔的小鸟_飞扬的小鸟_Java游戏项目Flappy Bird像素鸟游戏_Java课程设计项目

    课程目标: 1.通过本课程的学习巩固Java的相关基础知识,例如循环判断,数组和集合的使用,对象的继承,接口的实现,窗口的创建,事件监听,图形绘制. 2.完成小鸟的移动,管道自动生成.碰撞死亡,计分系 ...

  3. java小游戏——飞翔的小鸟(java初学作品)

    注:学习了java基础后,做出来的一个小作品,可以用来巩固学习 概述: 飞翔的小鸟能够作为Java基础的收官之作,包涵了Java很多的基础知识,在学习完Java基础后,尝试编写一些东西,能够起到很好的 ...

  4. java小游戏-飞翔的小鸟

    java小游戏-ava小游戏-飞翔的小鸟 1 游戏窗口的显示 2 游戏背景添加 3 背景颜色的添加 4 屏幕中绘制小鸟 5 实现小鸟上下移动 6 解决屏幕闪烁问题 7 云彩的添加与移动 8 云彩的自动 ...

  5. 如何用UE4制作2D游戏文档(一)——基础篇

    一.前言 首先感谢B站马克镇镇长的视频讲解清晰把很多细节都照顾到了,我本来自己做的时候没有视频说的那么细,参考他的全套系列视频之后完善了很多内容. 视频指路:https://www.bilibili. ...

  6. 如何用UE4制作2D游戏文档(二)——资源篇

    一.前言 首先感谢B站马克镇镇长的视频讲解清晰把很多细节都照顾到了,我本来自己做的时候没有视频说的那么细,参考他的全套系列视频之后完善了很多内容. 视频指路:https://www.bilibili. ...

  7. 【教程+源码】Java开发经典游戏飞翔的小鸟_Java游戏项目Flappy Bird像素鸟游戏

    在飞翔的小鸟游戏中,玩家只需通过点击方向键操纵让小鸟避开绿色管道等障碍物即可继续前进.如果小鸟碰到管道,游戏立即结束. 那么如何用Java编写一款属于自己的飞翔的小鸟游戏呢?其过程并不复杂,本课程详细 ...

  8. Unity3D制作3dRPG游戏——主角移动控制实现

    Unity3D制作3dRPG游戏--主角移动控制实现 目录 Unity3D制作3dRPG游戏--主角移动控制实现 实现原理 具体操作 问题解决 总体代码及效果展示 完整代码(镜头控制由之前的文章修改得 ...

  9. Unity3D制作3dRPG游戏——登录系统

    Unity3D制作3dRPG游戏--登录系统 目录 Unity3D制作3dRPG游戏--登录系统 设定辅助摄像机(登录界面背景) UI界面设计 编写代码GameManage思路过程 代码GameMan ...

最新文章

  1. ISE和Modelsim联合仿真
  2. FASHION STORE OPENCART 2.X 自适应主题模板 ABC-0588
  3. java数据传递给安卓_Android数据传递的五种方法汇总
  4. java.util.ConcurrentModificationException
  5. 用PyMC3进行贝叶斯统计分析(代码+实例)
  6. Abp vnext Web应用程序开发教程 8 —— 作者:应用程序层
  7. python pandas 数据处理
  8. 1092 最好吃的月饼 (20 point(s))- PAT乙级真题
  9. Java中将inputstream输入流转换成byte[]字节数组
  10. .net Core 2.*使用autofac注入
  11. (转)首个比特币投资基金在加拿大获批上线!
  12. 计算机无法共享打印机共享的打印机驱动,打印机不能共享_打印机不能共享怎么办?-太平洋IT百科...
  13. 华电C语言题库(循环中等难度)
  14. 蛋白质配体复合物-分子动力学模拟Gromacs
  15. net-java-php-python-教学资源管理系统hsg修改版计算机毕业设计程序
  16. 浅谈mysqli连接方式与PDO连接方式
  17. 10亿数据导入oracle方案
  18. 50组顶级4K彩色水墨溶解飞溅动画视频素材合集 mbackground ink
  19. jQuery实现 自动滚屏操作
  20. 2010-2019,我,一个普通职场人的十年变迁

热门文章

  1. 短文本分类:电力95598工单分类实现
  2. 注入修改代码,白嫖按键精灵ios手机版
  3. 【四二学堂】标准GPS坐标,转换成百度坐标
  4. Python|动态规划问题--斐波那契数列
  5. 大龄程序员转行的开始
  6. MTK机器原始OTA更新方法
  7. Cobbler自动部署CentOS系统
  8. ED1 SoC Linux环境搭建
  9. 遛狗已经不流行,“遛”智能购物车成为新潮流
  10. 拦截QT关闭窗口的CloseEvent()解析