经典游戏案例:愤怒的小鸟

学习目标:愤怒的小鸟核心玩法

游戏画面

项目结构目录

部分核心代码

using System.Collections;
using System.Collections.Generic;
using birds;
using utils;
using UnityEngine;public class GameManager : MonoBehaviour
{public static GameManager sInstance;private readonly List<Bird> birds = new List<Bird>(); //存放场景中的小鸟public List<Pig> pigs = new List<Pig>(); //存放场景中的小猪private float allScore; //总成绩[HideInInspector] public bool gameIsOver; //比赛是否结束private GameObject winUi; //胜利的UIprivate GameObject loseUi; //失败的UIprivate GameObject stars; //存放星星的物体public Vector3 originPos; //小鸟的初始位置public AudioClip birdWinAudio; //小鸟胜利的音乐private void Awake(){sInstance = this; //单例模式GameObject canvas = GameObject.Find("Canvas");winUi = canvas.transform.Find("WinPanel").gameObject;loseUi = canvas.transform.Find("LosePanel").gameObject;stars = winUi.transform.Find("bg").Find("stars").gameObject;}/// <summary>/// 这个时候去绑定小鸟们/// </summary>private void Start(){Transform birdsTransform = transform.parent.Find("birds"); //找到存放小鸟的游戏物体Vector2 springPos = new Vector2();for (int i = 0; i < birdsTransform.childCount; i++){if (i == 0){originPos = birdsTransform.GetChild(i).position; //设置一下位置springPos = birdsTransform.GetChild(i).GetComponent<SpringJoint2D>().connectedAnchor;}else{birdsTransform.GetChild(i).GetComponent<SpringJoint2D>().connectedAnchor = springPos;}birds.Add(birdsTransform.GetChild(i).GetComponent<Bird>()); //将小鸟添加进来allScore += birds[i].addScore;}Transform pigTransform = transform.parent.Find("pigs"); //找到存放小猪的游戏物体for (int i = 0; i < pigTransform.childCount; i++){pigs.Add(pigTransform.GetChild(i).GetComponent<Pig>()); //将小猪添加进去allScore += pigs[i].addScore; //所用的成绩加加}Transform blockTransform = transform.parent.Find("blocks"); //找到存放小猪的游戏物体for (int i = 0; i < blockTransform.childCount; i++){if (blockTransform.GetChild(i).GetComponent<Block>() != null)allScore += blockTransform.GetChild(i).GetComponent<Block>().addScore; //所有的成绩加加}print("游戏场景的所有成绩 allScore " + allScore);Initialized(); //初始化一下}private void Initialized(){for (int i = 0; i < birds.Count; i++){if (i == 0){birds[i].TriggerCollider.enabled = true; //触发碰撞器启用birds[i].Ready();birds[i].springJoint2D.enabled = true; //启用birds[i].enabled = true; //可用}else{birds[i].TriggerCollider.enabled = false; //触发碰撞器禁用birds[i].springJoint2D.enabled = false; //启用birds[i].enabled = false; //可用}}}/// <summary>/// 下一只小鸟/// </summary>public void NextBird(){if (gameIsOver) //游戏结束就返回return;if (birds.Count > 0){birds.RemoveAt(0); //移除第一只小鸟}if (pigs.Count > 0){if (birds.Count > 0) //还有小鸟,替换下一只小鸟{Initialized(); //替换小鸟}else{gameIsOver = true; //游戏结束loseUi.SetActive(true); //失败UI可见}}else{Win(); //游戏胜利}}/// <summary>/// 判断是否胜利/// </summary>public void IsSuccess(){if (!gameIsOver) //没有游戏结束{if (pigs.Count <= 0){if (birds.Count > 0 && birds[0].IsIdle()){Win();}}}}/// <summary>/// 胜利的效果/// </summary>private void Win(){gameIsOver = true; //游戏结束AudioUtil.sInstance.AudioPlay(birdWinAudio); //播放小鸟胜利音乐StartCoroutine("ShowBird"); //开启协程}/// <summary>/// 展示小鸟/// </summary>/// <returns></returns>private IEnumerator ShowBird(){if (birds.Count > 0){birds[0].enabled = true; //可用for (int i = 0; i < birds.Count; i++){yield return new WaitForSeconds(1f);birds[i].Win(); //播放胜利特效}}yield return new WaitForSeconds(1f); //休息1秒winUi.SetActive(true); //胜利了}/// <summary>/// 展示星星/// </summary>public void ShowStart(){int counts = 1; //用户得到的星星数if (Score.sInstance.getNowScore() / allScore > 3 / 4f)counts = 3; //三颗星else if (Score.sInstance.getNowScore() / allScore > 0.5f)counts = 2; //三颗星if (counts >= 2)StartCoroutine("Show", 3);else if (counts == 1)StartCoroutine("Show", 2);elseStartCoroutine("Show", 1);}/// <summary>/// 显示星星/// </summary>/// <param name="num">星星数目</param>/// <returns></returns>private IEnumerator Show(int num){saveStar(num); //存储一下for (int i = 0; i < num; i++){stars.transform.GetChild(i).gameObject.SetActive(true); //激活星星yield return new WaitForSeconds(0.3f);}}/// <summary>/// 将星星存储一下/// </summary>private void saveStar(int num){int starNum = PlayerPrefUtil.GetNowMapLevelStarNum(); //得到星星数if (num > starNum){PlayerPrefUtil.addTotalStar(num - starNum); //添加总星星PlayerPrefUtil.addNowMapTotalStar(num - starNum); //添加当前地图星星PlayerPrefUtil.SetNowMapLevelStarNum(num); //设置星星数}}
}

下载链接:AngerBird-master: 愤怒的小鸟

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

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

相关文章

【C++】优先队列的使用及模拟实现

&#x1f497;个人主页&#x1f497; ⭐个人专栏——C学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 目录 导读 一、什么是优先队列 二、优先队列的使用 1. 优先队列的构造 2. 优先队列的基本操作 3. 使用示例 三、优先队列模拟实…

【硬件开发】共模电感

为什么电源无论直流还是交流的输入端都需要一个共模电感 图中L1就是共模电感&#xff0c;长下面这个样子&#xff0c;两侧的匝数&#xff0c;线径和材料都是一模一样的 共模电感的作用是为了抑制共模信号 抑制共模信号工作原理 http://【共模电感是如何抑制共模信号的】https…

【免费】中国电子学会2024年03月份青少年软件编程Python等级考试试卷一级真题(含答案)

2024-03 Python一级真题 分数&#xff1a;100 题数&#xff1a;37 测试时长&#xff1a;60min 一、单选题(共25题&#xff0c;共50分) 1. 下列哪个命令&#xff0c;可以将2024转换成2024 呢&#xff1f;&#xff08; A&#xff09;(2分) A.str(2024) B.int(2024) C.fl…

细说AGV的12种导航方式和原理

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》人俱乐部 这十二种导航方式各自具有不同的特点和应用场景&#xff0c;下面我将逐一进行简要介绍&#xff1a; 磁钉导航&#xff1a; 原理&#xf…

Python学习笔记17:进阶篇(六)代码测试

代码测试 代码测试是软件开发过程中的关键环节&#xff0c;旨在确保代码质量、功能正确性以及性能符合预期。 在开发过程中&#xff0c;进行代码测试有很多好处&#xff1a; 提高软件质量&#xff1a;通过发现并修复错误&#xff0c;测试有助于提升软件的功能性、可靠性和稳…

LSTM架构的演进:LSTM、xLSTM、LSTM+Transformer

文章目录 1. LSTM2. xLSTM2.1 理论介绍2.2 代码实现 3. LSTMTransformer 1. LSTM 传统的 LSTM (长短期记忆网络) 的计算公式涉及几个关键部分&#xff1a;输入门、遗忘门、输出门和单元状态。 2. xLSTM xLSTM之所以称之为xLSTM就是因为它将LSTM扩展为多个LSTM的变体&#xff…

【LLVM】‘ffast-math’ and ‘ffp-contract’

最近看到一个issue&#xff0c;修改的核心代码部分并不多&#xff0c;可以参考此处的介绍以及此处的issue。 看起来关键就是判断-ffp-contract会将contract的值设为最后一个此选项的值&#xff0c;否则的话&#xff0c;如果只指定了-ffast-math但是没有通过-ffp-contract设置值…

fffdddd

library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all;entity GJL isport(clk, reset: in std_logic;btn_green, btn_red: in std_logic; -- 新增控制按键r1, r2, y1, y2, g1, g2: out std_logic;ledag: out std_logic_…

网络编程--网络理论基础(二)

这里写目录标题 网络通信流程mac地址、ip地址arp协议交换机路由器简介子网划分网关 路由总结 为什么ip相同的主机在与同一个互联网服务通信时不冲突公网ip对于同一个路由器下的不同设备&#xff0c;虽然ip不冲突&#xff0c;但是因为都是由路由器的公网ip转发通信&#xff0c;接…

在Java中使用Apache Kafka进行消息队列处理

在Java中使用Apache Kafka进行消息队列处理 消息队列(Message Queue)是分布式系统中用于异步通信的关键组件,广泛应用于解耦生产者和消费者、平滑流量突增、提高系统弹性等场景。Apache Kafka作为一个高吞吐量、分布式的消息队列系统,已经成为许多企业的首选。本文将介绍如…

Linux 进程管理指令

Linux 进程管理是系统管理的重要部分&#xff0c;通过各种工具和命令&#xff0c;你可以查看、控制、调试和管理进程。以下是一些常用的 Linux 进程管理命令和工具。 查看进程 1. ps ps 命令用于列出当前系统的进程。 查看当前用户的所有进程&#xff1a; ps -u $USER查看…

Python statistics 模块

Python 的 statistics 模块提供了一组用于执行各种统计计算的函数&#xff0c;包括平均值、中位数、标准差、方差以及其他统计量。让我来简单介绍一下。 首先&#xff0c;你可以使用以下方式导入 statistics 模块&#xff1a; python import statistics 接下来&#xff0c;…

主流中间件--Redis

NOSQL 什么是NOSQL NoSQL(NoSQL Not Only SQL )&#xff0c;意即“不仅仅是SQL”&#xff0c;它泛指非关系型的数据库。 关系型数据库&#xff1a;以关系(由行和列组成的二维表)模型建模的数据库。简单理解&#xff1a;有表的就是关系型数据库。 NOSQL分类 Redis 什么是Redi…

内容安全复习 7 - 对抗攻击与防御

文章目录 概述攻击对抗性攻击的目的攻击的损失函数如何攻击FGSM黑盒与白盒真实世界的攻击 防御被动防御主动防御 概述 动机 &#xff08;1&#xff09;不仅要在实验室中部署机器学习分类器&#xff0c;也要在现实世界中部署&#xff1b;实际应用 &#xff08;2&#xff09;分类…

shell jq教程

1. jq 简介 jq 是一款命令行下处理JSON数据的工具。其可以接受标准输入&#xff0c;命令管道或者文件中的JSON数据&#xff0c;经过一系列的过滤器(filters)和表达式的转后形成我们需要的数据结构并将结果输出到标准输出中。jq的这种特性使我们可以很容易地在Shell脚本中调用它…

LeetCode 23. 合并 K 个升序链表

更多题解尽在 https://sugar.matrixlab.dev/algorithm 每日更新。 组队打卡&#xff0c;更多解法等你一起来参与哦&#xff01; LeetCode 23. 合并 K 个升序链表&#xff0c;难度困难。 优先队列&#xff08;小顶堆&#xff09; 解题思路&#xff1a;拿到题首先想到以下几个方…

【数据结构】线性表之《栈》超详细实现

栈 一.栈的概念及结构二.顺序栈与链栈1.顺序栈2.链栈1.单链表栈2.双链表栈 三.顺序栈的实现1.栈的初始化2.检查栈的容量3.入栈4.出栈5.获取栈顶元素6.栈的大小7.栈的判空8.栈的清空9.栈的销毁 四.模块化源代码1.Stack.h2.Stack.c3.test.c 一.栈的概念及结构 栈&#xff1a;一种…

程序猿成长之路之数据挖掘篇——决策树分类算法(1)——信息熵和信息增益

决策树不仅在人工智能领域发挥着他的作用&#xff0c;而且在数据挖掘中也在分类领域中独占鳌头。了解决策树的思想是学习数据挖掘中的分类算法的关键&#xff0c;也是学习分类算法的基础。 什么是决策树 用术语来说&#xff0c;决策树&#xff08;Decision Tree&#xff09;是…

Go自定义数据的序列化流程

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

数据库设计概述-数据库设计内容、数据库设计方法(基于E-R模型的规范设计方法)

一、引言 如何利用关系数据库理论设计一个满足应用系统需求的数据库 二、数据库设计内容 1、数据库设计是基于应用系统需求分析中对数据的需求&#xff0c;解决数据的抽象、数据的表达和数据的存储结构等问题 2、其目标是设计出一个满足应用要求、简洁、高效、规范合理的数…