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

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

游戏画面

项目结构目录

部分核心代码

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…

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

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

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

栈 一.栈的概念及结构二.顺序栈与链栈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、其目标是设计出一个满足应用要求、简洁、高效、规范合理的数…

Map集合之HashMap细说

最近在看面试题&#xff0c;看到了hashmap相关的知识&#xff0c;面试中问的也挺多的&#xff0c;然后我这里记录下来&#xff0c;供大家学习。 Hashmap为什么线程不安全 jdk 1.7中&#xff0c;在扩容的时候因为使用头插法导致链表需要倒转&#xff0c;从而可能出现循环链表问…

航行在水域:使用数据湖构建生产级 RAG 应用程序

在 2024 年年中&#xff0c;创建一个令人印象深刻和兴奋的 AI 演示可能很容易。需要一个强大的开发人员&#xff0c;一些聪明的提示实验&#xff0c;以及一些对强大基础模型的API调用&#xff0c;你通常可以在一个下午建立一个定制的AI机器人。添加一个像 langchain 或 llamain…

c++ 内存分析模型、引用

一、内存模型分区 内存四区的意义&#xff1a; 不同区域存放的数据&#xff0c;赋予不同的生命周期&#xff0c;给我们更大的灵活编程 &#xff08;一&#xff09;程序运行前 在程序编译后&#xff0c;生成了exe可执行程序&#xff0c;未执行程序前分为两个区域 代码区&…

SpringMVC系列七: 手动实现SpringMVC底层机制-上

手动实现SpringMVC底层机制 博客的技术栈分析 &#x1f6e0;️具体实现细节总结 &#x1f41f;准备工作&#x1f34d;搭建SpringMVC底层机制开发环境 实现任务阶段一&#x1f34d;开发ZzwDispatcherServlet&#x1f966;说明: 编写ZzwDispatcherServlet充当原生的DispatcherSer…

码云建仓库

1.新建仓库 码云地址 打开 码云地址 &#xff0c;点击“”&#xff0c;新建仓库&#xff0c;添加仓库内容 &#xff0c;创建。 小提示&#xff1a;如果本地已有项目&#xff0c;就不要选初始化&#xff0c;设置模板&#xff0c;容易冲突。 2. 进入当前仓库页 小提示&#x…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] LYA的巡演(100分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…

心明眼亮 洞悉万物

如何洞悉事物的本质呢&#xff1f; 阳明先生&#xff1a;世间之事&#xff0c;纷繁复杂&#xff0c;不可能一一研究得过来。 圣人只需要把内心的明镜擦亮&#xff0c;而无需担心外部的事事物物在镜子中如何映照。 —— 外界事物是无穷无尽的&#xff0c;永远探究不完&#xf…