unity 完全复刻flappy bird

news2024/11/17 12:52:41

文章目录

  • 一、 介绍
  • 制作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 游戏中的柱子生成和移动的逻辑,具体来说,它的功能包括:

  1. 自动随机生成柱子:每隔一定时间生成一个柱子,并随机设置柱子的高度。

  2. 控制柱子的移动:可以通过调用 StartMove() 方法开始所有柱子的移动,或者调用 StopMove() 方法停止所有柱子的移动。

  3. 监听按键事件:可以通过按下 J 键开始柱子的移动,或者按下 K 键停止柱子的移动。

  4. 存储所有柱子的信息:将所有生成的柱子的 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



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/509462.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如果把ChatGPT和“挖呀挖”的黄老师结合起来,她可以为你做什么事情?

ChatGPT曾经2个月用户过亿的事情已成为过去&#xff0c;虽然我也成为了其中的一份子&#xff0c;感受着他的无所不能&#xff0c;但从中也的确发现了他的一些不能做的事情。而近期爆火的“挖呀挖”的黄老师&#xff0c;几天粉丝疯涨几百万&#xff0c;也的确值得我们思考。 那么…

kafka安装及环境搭建

1. 下载 下载地址&#xff1a;Apache Kafka 我这里下载的是 3.2.1 版本。 2. 上传并解压 上传到 linux 下的 /home/software/ 目录下&#xff0c;然后解压 kafka_2.13-3.2.1.tgz 包到/usr/local/ cd /home/software tar -zxvf kafka_2.13-3.2.1.tgz -C /usr/local # -C 选…

odoo的一些基础概念

概述 三层体系结构&#xff0c;表示层是HTML5、JavaScript和CSS的组合&#xff0c;逻辑层专门用Python编写&#xff0c;而数据层只支持PostgreSQL作为RDBMS。 服务器和客户端扩展都打包为模块&#xff0c;可选地加载到数据库中。模块是针对单一目的的函数和数据的集合。Odoo中…

拉取远程分支到本地修改后上传

在git之前最好保证网络通畅 如果之前本地有项目且有git控制&#xff0c;直接更新就行了 git pull 1、拉取仓库 git clone https://github.com/用户名/仓库名.git 2、对项目进行修改(略) 3、将所有更改添加到暂存区 git add . git add .命令将所有更改添加到暂存区&#…

OpenPCDet系列 | 3.OpenPCDet点云检测框架训练准备流程

文章目录 训练准备流程1. dataloader部分2. network部分3. optimizer部分4. scheduler部分训练准备流程 对于OpenPCDet中模型的训练过程如下所示,在训练前一般需要进行4个部分的准备:数据准备、网络模型准备、以及优化器和学习率调度器。下面对这4个大部分分别介绍。主要就是…

delete方法删除对象数组中元素导致原始数据被修改

记录一个自己在码代码过程中遇到的问题。 要求&#xff1a;删除数组对象中每一组对象中的一个属性。 下面是我原始的写法(当然是错误的)。 const { log } require("console");// 用于测试delete方法&#xff0c;删除对象中的指定元素 const testForDelete () >…

【中创数智人】“周杰伦?数智人周同学!”7×24小时直播不间断,他做到了

迈进Web 3.0&#xff0c;离不开数智人。 品牌代言、公司宣传、产品介绍、直播带货......数智人扮演的角色正在不断增加。无论是替代真人服务、多模态AI助手、还是作为虚拟世界的第二分身&#xff0c;对于数智人而言都已经是触手可及的未来。 5月8日&#xff0c;周杰伦亮相中国…

【JavaEE】线程安全(难点)

目录 前言 1、线程安全的概念 2、线程不安全的原因 3、产生抢占式执行与原子性问题 4、产生多个线程修改同一个变量的问题 5、解决上述三个导致线程不安全的问题 5.1、锁 synchronized关键字 5.1.1、使用synchronized关键字进行加锁 6、由内存可见性引起的线程不安全…

KubeEdge节点分组特性简介

01 边缘应用跨地域部署场景及问题 应用生命周期管理复杂导致运维成本提高 02 边缘节点分组管理 节点分组&#xff1a;将不同地区的边缘节点按照节点组的形式组织 边缘应用&#xff1a;将应用资源整体打包并满足不同节点组之间的差异化部署需求 流量闭环&#xff1a;将服务流量…

Oracle内存管理

文章目录 概念内存管理方式自动内存管理自动共享内存管理手工内存管理 内存管理的转换方式相关内存参数相关数据字典 概念 为满足数据库的需求&#xff0c;通过内存管理来维护 Oracle 实例内存结构的最优大小。Oracle数 据库基于与内存相关的初始化参数设置来管理内存。 内存管…

【LeetCode】654. 最大二叉树

1.问题 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。 递归地在最大值 左边 的 子数组前缀上 构建左子树。 递归地在最大值 右边 的 子数组后缀上 构建右子树。 返回 nums 构建的 最…

美颜SDK的隐私保护与安全性分析

随着智能手机和移动应用的普及&#xff0c;美颜SDK已经成为了很多应用的标配。美颜SDK的使用可以让用户在拍照或者视频聊天时&#xff0c;实现自拍美颜、滤镜、磨皮、瘦脸等效果。但是&#xff0c;在享受美颜SDK带来的便利的同时&#xff0c;我们也需要关注美颜SDK的隐私保护与…

跟着排序学时间复杂度

带着排序学时间/空间复杂度 排序和时间复杂度 带着排序学时间/空间复杂度冒泡排序选择排序选择排序法2原理&#xff1a; 插入排序希尔排序&#xff08;缩小增量排序&#xff09;堆排序快速排序归并排序不基于比较的排序计数排序 桶排序稳定性 时间复杂度是打开数据结构大门的第…

从0搭建Vue3组件库(十二):引入现代前端测试框架 Vitest

Vitest 是个高性能的前端单元测试框架,它的用法其实和 Jest 差不多,但是它的性能要优于 Jest 不少,还提供了很好的 ESM 支持,同时对于使用 vite 作为构建工具的项目来说有一个好处就是可以公用同一个配置文件vite.config.js。因此本项目将会使用 Vitest 作为测试框架。 安装 …

FS2956A 8V~120V降压5V2A4.2V3A恒压芯片

FS2956A 内置MOS 100V开关降压型DC-DC转换器&#xff0c;FS2956A 8-100V用于电动车 滑板车 液晶仪表 5V-USB充电IC方案2A 概述&#xff1a; FS2956A 是一款支持宽电压输入的开关降压型DC-DC&#xff0c;芯片内置100V/5A功率MOS&#xff0c;最高输入电压90V。FS2956A 具有低待…

初识滴滴交易策略之一:交易市场

初识系列前言 滴滴作为一家共享出行公司&#xff0c;利用信息技术构建了实时的、智能的在线交易市场&#xff0c;在这个庞大运转的市场之中&#xff0c;滴滴秉承着用户价值至上的宗旨&#xff0c;不断通过技术提升来实现更高效的运转效率和更贴心的用户体验。 为了使得大家能够…

蚂蚁实时低代码研发和流批一体的应用实践

摘要&#xff1a;本文整理自蚂蚁实时数仓架构师马年圣&#xff0c;在 Flink Forward Asia 2022 流批一体专场的分享。本篇内容主要分为四个部分&#xff1a; 1. 实时应用场景与研发体系 2. 低代码研发 3. 流批一体 4. 规划展望 Tips&#xff1a;点击「阅读原文」查看原文视频&a…

KingbaseES V8R6备份恢复系列之 -- system-Id不匹配备份故障

​ KingbaseES V8R6备份恢复案例之---system-Id不匹配备份故障 案例说明&#xff1a; 在KingbaseES V8R6执行备份时&#xff0c;在sys_log日志中出现system-id不一致的故障并伴随有归档失败&#xff0c;故障如下图所示&#xff1a; 适用版本&#xff1a; KingbaseES V8R6 一、问…

React 学习笔记

文章目录 React 简介React 特点React 学习前提React 第一个实例 React 简介 React 是一个用于构建用户界面的 JAVASCRIPT 库。 React主要用于构建UI&#xff0c;很多人认为 React 是 MVC 中的 V&#xff08;视图&#xff09;。 React 起源于 Facebook 的内部项目&#xff0c;用…

Flink窗口

目录 窗口 Flink “存储桶” 窗口分类 按照驱动类型分类 按照窗口分配数据的规则分类 滚动窗口 滑动窗口 会话窗口 全局窗口 窗口的生命周期 窗口 窗口&#xff1a;将无限数据切割成有限的“数据块”进行处理&#xff0c;以便更高效地处理无界流 在处理无界数据流时…