文章目录
- 一、 介绍
- 制作bird向右移动的效果
- 基本动画
- 转场渐隐效果
- dotween 平滑摇头效果
- 柱子控制器
- 碰撞检测
- 下载项目文件
一、 介绍
Flappy Bird是一款由越南开发者Dong Nguyen于2013年发布的2D跳跃游戏。玩家需要控制一只小鸟躲避障碍物,通过不断飞行获得分数。游戏操作简单,只需轻触屏幕即可使小鸟向上飞行,松手则小鸟下落。游戏场景为简洁的背景和障碍物,配以简单的音效和背景音乐。Flappy Bird在发布后迅速走红,成为全球热门游戏之一,但因为游戏难度过高和玩家过度沉迷而引发争议。
场景连续过渡
动画制作
DOTween实现场景过渡
制作bird向右移动的效果
图片移动到最右端,瞬间向左回来,可以达到这个效果。
void Start()
{
startPos = transform.position;
}
void Update()
{
if(transform.position.x < -6.77f)
{
transform.position = startPos;
}
transform.Translate(-0.5f, 0, 0);
}
基本动画
转场渐隐效果
这是一个名为 “UIManager” 的脚本,注释如下:
using System.Collections.Generic;
using DG.Tweening; // 引入 DOTween 插件
using UnityEngine;
public class UIMananger : MonoBehaviour
{
public CanvasGroup canvasGroup; // 声明一个 CanvasGroup 变量,用于控制 UI 的透明度
public float time = 0.5f; // 声明一个时间变量,用于控制淡入淡出动画的速度
public void ShowUI() // 定义一个公共方法,用于显示 UI
{
canvasGroup.DOFade(1, time); // 使用 DOTween 插件实现淡入动画
}
public void HideUI() // 定义一个公共方法,用于隐藏 UI
{
canvasGroup.DOFade(0, time) // 使用 DOTween 插件实现淡出动画
.onComplete = ()=>
{
gameObject.SetActive(false); // 动画结束后将 UI 的 gameObject 设置为不活动状态
};
}
}
这个脚本可以控制 Canvas Group 的透明度,实现 UI 的
淡入淡出效果。其中,“ShowUI” 方法用于显示 UI,“HideUI” 方法用于隐藏 UI。在淡出动画结束后,还将 UI 的 gameObject 设置为不活动状态,避免继续渲染。
dotween 平滑摇头效果
向上跳跃向上抬头,向下坠落向下低头
birdImg.transform.DORotateQuaternion(Quaternion.Euler(0, 0, rb2d.velocity.y * chengdu), 0.3f);
使用了DOTween插件中的方法,作用是控制birdImg对象的旋转角度
- birdImg为要旋转的对象;
- transform代表该对象的Transform组件;
- DO代表DOTween插件的快捷方式;
- RotateQuaternion代表以四元数方式进行旋转;
- Quaternion.Euler(x, y, z)可以将欧拉角(x, y, z)转换为对应的四元数,这里的意思是将x、y、z分别设置为0、0、rb2d.velocity.y * chengdu,其中rb2d.velocity.y表示bird当前的上下速度,chengdu是一个常数,用于控制旋转速度;
- 0.3f表示旋转的时间长度,即0.3秒。
因此,这段代码的作用是根据bird对象当前的上下速度来控制其旋转角度,实现更加生动的飞行效果。
柱子控制器
这份代码实现了一个简单的 2D 游戏中的柱子生成和移动的逻辑,具体来说,它的功能包括:
-
自动随机生成柱子:每隔一定时间生成一个柱子,并随机设置柱子的高度。
-
控制柱子的移动:可以通过调用
StartMove()
方法开始所有柱子的移动,或者调用StopMove()
方法停止所有柱子的移动。 -
监听按键事件:可以通过按下
J
键开始柱子的移动,或者按下K
键停止柱子的移动。 -
存储所有柱子的信息:将所有生成的柱子的 GameObject 实例存储在一个列表中,方便后续的操作。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ZhuZiController : MonoBehaviour
{
// 存储所有柱子的父对象
public Transform ZhuZis;
// 柱子的预制体对象
public GameObject ZhuZiPrefab;
// 引用 GameMananger 脚本
public GameMananger gm;
// 生成柱子的时间间隔
public float SpawnTime = 1f;
// 存储所有柱子的列表
private List<GameObject> zhuzis = new List<GameObject>();
// 标记是否可以移动所有柱子
public bool ZhuZiIsMove = true;
// Start 方法在脚本对象被创建时调用,用于初始化生成柱子的协程
public void Start()
{
StartCoroutine(SpawnZhuZi());
}
/// <summary>
/// 开始所有柱子的移动
/// </summary>
public void StartMove()
{
ZhuZiIsMove = true;
foreach (GameObject item in zhuzis)
{
item.GetComponent<ZhuZiScript>().canMove = true;
}
}
/// <summary>
/// 停止所有柱子的移动
/// </summary>
public void StopMove()
{
ZhuZiIsMove = false;
foreach (GameObject item in zhuzis)
{
item.GetComponent<ZhuZiScript>().canMove = false;
}
}
// 生成一个柱子
public void SpawnOneZhuZi()
{
// 在父对象中实例化一个柱子
GameObject zhuzi = GameObject.Instantiate(ZhuZiPrefab, ZhuZis);
// 随机设置柱子的高度
zhuzi.GetComponent<ZhuZiScript>().RandomHeight();
// 将柱子添加到列表中
zhuzis.Add(zhuzi);
}
// Update 方法每帧调用一次,用于检测是否按下了调试用的快捷键
public void Update()
{
if (Input.GetKeyDown(KeyCode.K))
{
//SpawnOneZhuZi();
StopMove();
}
if (Input.GetKeyDown(KeyCode.J))
{
//SpawnOneZhuZi();
StartMove();
}
}
// 生成柱子的协程
IEnumerator SpawnZhuZi()
{
while (true)
{
// 每隔 SpawnTime 秒生成一个柱子
yield return new WaitForSeconds(SpawnTime);
// 如果游戏还没开始,就不生成柱子
if (!gm.isGameStart) continue;
// 如果柱子不能移动,就不生成柱子
if (!ZhuZiIsMove) continue;
SpawnOneZhuZi();
}
}
}
碰撞检测
一个物体添加两个碰撞器,撞后死亡
在终点填一个碰撞器,撞后加分
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ZhuZiScript : MonoBehaviour
{
public float speed = 0.05f;
public bool canMove = true;
public void FixedUpdate()
{
if (!canMove) return;
transform.Translate(-speed, 0, 0);
}
public void RandomHeight()
{
//2.07
//-1.58
float r = Random.Range(-1.58f, 2.07f);
transform.SetPositionAndRotation(new Vector3(transform.position.x, r, transform.position.z), transform.rotation);
}
private void OnTriggerEnter2D(Collider2D collision)
{
//Debug.Log("撞到柱子了");
GameObject.Find("GameMananger").GetComponent<GameMananger>().GameOver();
}
}
下载项目文件
https://download.csdn.net/download/qq_20179331/87631338