经典游戏案例:仿植物大战僵尸

学习目标:仿植物大战僵尸核心玩法实现

游戏画面

项目结构目录

部分核心代码

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using Random = UnityEngine.Random;public enum ZombieType
{Zombie1,   ConeHeadZombie,BucketHeadZombie,
}[Serializable]
public struct Wave
{[Serializable]public struct Data{public ZombieType zombieType;public uint count;}public bool isLargeWave;[Range(0f,1f)]public float percentage;public Data[] zombieData;
}public class GameController : MonoBehaviour
{public GameObject zombie1;public GameObject BucketheadZombie;public GameObject ConeheadZombie;private GameModel model;public GameObject progressBar;public GameObject gameLabel;public GameObject sunPrefab;public GameObject cardDialog;public GameObject sunLabel;public GameObject shovelBG;public GameObject btnSubmitObj;public GameObject btnResetObj;public string nextStage;public float readyTime;public float elapsedTime;public float playTime;public float sunInterval;public AudioClip readySound;public AudioClip zombieComing;public AudioClip hugeWaveSound;public AudioClip finalWaveSound;public AudioClip loseMusic;public AudioClip winMusic;public Wave[] waves;public int initSun;private bool isLostGame = false;void Awake(){model = GameModel.GetInstance();}void Start (){model.Clear();model.sun = initSun;ArrayList flags=new ArrayList();for (int i = 0; i < waves.Length; i++){if (waves[i].isLargeWave){flags.Add(waves[i].percentage);}}progressBar.GetComponent<ProgressBar>().InitWithFlag((float[])flags.ToArray(typeof(float)));progressBar.SetActive(false);cardDialog.SetActive(false);sunLabel.SetActive(false);shovelBG.SetActive(false);btnResetObj.SetActive(false);btnSubmitObj.SetActive(false);GetComponent<HandlerForShovel>().enabled = false;GetComponent<HandlerForPlants>().enabled = false;StartCoroutine(GameReady());}Vector3 origin{get{return new Vector3(-2f,-2.6f);}}void OnDrawGizmos(){// DeBugDrawGrid(origin,0.8f,1f,9,5,Color.blue);}void DeBugDrawGrid(Vector3 _orgin,float x,float y,int col,int row,Color color){for (int i = 0; i < col+1; i++){Vector3 startPoint = _orgin + Vector3.right*i*x;Vector3 endPoint = startPoint + Vector3.up*row*y;Debug.DrawLine(startPoint,endPoint,color);}for (int i = 0; i < row+1; i++){Vector3 startPoint = _orgin + Vector3.up * i * y;Vector3 endPoint = startPoint + Vector3.right * col * x;Debug.DrawLine(startPoint, endPoint, color);}}public void AfterSelectCard(){btnResetObj.SetActive(false);btnSubmitObj.SetActive(false);Destroy(cardDialog);GetComponent<HandlerForShovel>().enabled = true;GetComponent<HandlerForPlants>().enabled = true;Camera.main.transform.position=new Vector3(1.1f,0,-1f);StartCoroutine(WorkFlow());InvokeRepeating("ProduceSun", sunInterval, sunInterval);}IEnumerator GameReady(){yield return new WaitForSeconds(0.5f);MoveBy move = Camera.main.gameObject.AddComponent<MoveBy>();move.offset=new Vector3(3.55f,0,0);move.time = 1f;move.Begin();yield return  new WaitForSeconds(1.5f);sunLabel.SetActive(true);shovelBG.SetActive(true);cardDialog.SetActive(true);btnResetObj.SetActive(true);btnSubmitObj.SetActive(true);}void Update(){if (Input.GetKeyDown(KeyCode.S)){model.sun += 50;}if (!isLostGame){for (int row = 0; row < model.zombieList.Length; row++){foreach (GameObject zombie in model.zombieList[row]){if (zombie.transform.position.x<(StageMap.GRID_LEFT-0.4f)){LoseGame();isLostGame = true;return;}}}  }}IEnumerator WorkFlow(){gameLabel.GetComponent<GameTips>().ShowStartTip();AudioManager.GetInstance().PlaySound(readySound);yield return new WaitForSeconds(readyTime);ShowProgressBar();AudioManager.GetInstance().PlaySound(zombieComing);for (int i = 0; i < waves.Length; i++){yield return StartCoroutine(WaitForWavePercentage(waves[i].percentage));if (waves[i].isLargeWave){StopCoroutine(UpdateProgress());yield return StartCoroutine(WaitForZombieClear());yield return new WaitForSeconds(3.0f);gameLabel.GetComponent<GameTips>().ShowApproachingTip();AudioManager.GetInstance().PlaySound(hugeWaveSound);yield return new WaitForSeconds(3.0f);StartCoroutine(UpdateProgress());}if (i+1==waves.Length){gameLabel.GetComponent<GameTips>().ShowFinalTip();AudioManager.GetInstance().PlaySound(finalWaveSound);}yield return StartCoroutine(WaitForZombieClear());CreatZombies(ref waves[i]);}yield return StartCoroutine(WaitForZombieClear());yield return new WaitForSeconds(2f);WinGame();}IEnumerator WaitForZombieClear(){while (true){bool hasZombie = false;for (int row = 0; row < StageMap.ROW_MAX; row++){if (model.zombieList[row].Count!=0){hasZombie = true;break;}}if (hasZombie){yield return new WaitForSeconds(0.1f);}else{break;}}}IEnumerator WaitForWavePercentage(float percentage){while (true){if ((elapsedTime/playTime)>=percentage){break;}else{yield return 0;}}}IEnumerator UpdateProgress(){while (true){elapsedTime += Time.deltaTime;  progressBar.GetComponent<ProgressBar>().SetProgress(elapsedTime/playTime);          yield return 0;}}void ShowProgressBar(){progressBar.SetActive(true);StartCoroutine(UpdateProgress());}void CreatZombies(ref Wave wave){foreach (Wave.Data data in wave.zombieData){for (int i = 0; i < data.count; i++){CreatOneZombie(data.zombieType);}}}void CreatOneZombie(ZombieType type){GameObject zombie=null;switch (type){case ZombieType.Zombie1:zombie = Instantiate(zombie1);break;            case ZombieType.ConeHeadZombie:zombie = Instantiate(ConeheadZombie);break;case ZombieType.BucketHeadZombie:zombie = Instantiate(BucketheadZombie);break;               }int row = Random.Range(0, StageMap.ROW_MAX);      zombie.transform.position = StageMap.SetZombiePos(row);zombie.GetComponent<ZombieMove>().row = row;zombie.GetComponent<SpriteDisplay>().SetOrderByRow(row);model.zombieList[row].Add(zombie);}void ProduceSun(){float x = Random.Range(StageMap.GRID_LEFT, StageMap.GRID_RIGTH);float y = Random.Range(StageMap.GRID_BOTTOM, StageMap.GRID_TOP);float startY = StageMap.GRID_TOP + 1.5f;GameObject sun = Instantiate(sunPrefab);sun.transform.position=new Vector3(x,startY,0);MoveBy move = sun.AddComponent<MoveBy>();move.offset=new Vector3(0,y-startY,0);move.time = (startY - y)/1.0f;move.Begin();}void LoseGame(){gameLabel.GetComponent<GameTips>().ShowLostTip();GetComponent<HandlerForPlants>().enabled = false;CancelInvoke("ProduceSun");AudioManager.GetInstance().PlayMusic(loseMusic,false);}void WinGame(){CancelInvoke("ProduceSun");AudioManager.GetInstance().PlayMusic(winMusic, false);Invoke("GotoNextStage",3.0f);}void GotoNextStage(){       SceneManager.LoadScene(nextStage);}
}

下载链接:PlantsVsZombies: 经典游戏:植物大战僵尸

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

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

相关文章

STM32启动流程 和 map文件的作用

一&#xff0c;启动流程 1. 复位/上电 2. 根据 BOOT0/BOOT1 确定程序从哪个存储位置执行 3. 初始化 SP 及 PC 指针 将 0X08000000 位置的栈顶地址存放在 SP 指针中 将 0x08000004 位置存放的向量地址装入 PC 程序计数器 4. 初始化系统时钟 5. 初始化用户堆栈 6. 进入main函数 二…

idea中maven新增的配置文件xx.xml没生效问题

项目场景&#xff1a; 因为公司使用自己的私服下载jar,则没有使用默认的settings.xml文件。而是新增了一个settingsold.xml文件 问题描述 公司项目有用自己的私服,Maven正常去私服下载jar包是没问题的。但是一直是去找的阿里云镜像,到导致阿里云镜像找不到相关的jar包报错!!!…

条码二维码读取设备在医疗设备自助服务的重要性

医疗数字信息化建设的深入推进&#xff0c;医疗设备自助服务系统已成为医疗服务领域的一大趋势&#xff0c;条码二维码读取设备作为自助设备的重要组成部分&#xff0c;通过快速、准确地读取条形码二维码信息&#xff0c;不公提升了医疗服务效率&#xff0c;还为患者提供了更加…

CMN-700(1)CMN-700概述

本章介绍CMN-700&#xff0c;这是用于AMBA5 CHI互连&#xff0c;且可根据需要定制的网格拓扑结构。 1. 关于CMN‐700 CMN‐700是一种可配置扩展的一致性互连网络&#xff0c;旨在满足高端网络和企业计算应用中使用的一致性网络系统的功率、性能和面积(PPA)要求。支持1-256个处…

PHP 界的扛把子 Swoole 异步通信利器

大家好&#xff0c;我是码农先森。 引言 我今天主要介绍的内容是包括但不仅限于 Swoole &#xff0c;也有一部分 Go 语言的内容。 为什么要介绍 Swoole ? 先说一说背景吧&#xff0c;我们项目组之前要为《香港 01》开发一个积分系统的项目&#xff0c;这个系统的主要功能包…

【Linux详解】冯诺依曼架构 | 操作系统设计 | 斯坦福经典项目Pintos

目录 一. 冯诺依曼体系结构 (Von Neumann Architecture) 注意事项 存储器的意义&#xff1a;缓冲 数据流动示例 二. 操作系统 (Operating System) 操作系统的概念 操作系统的定位与目的 操作系统的管理 系统调用和库函数 操作系统的管理&#xff1a; sum 三. 系统调…

Ruby langchainrb gem and custom configuration for the model setup

题意&#xff1a;Ruby 的 langchainrb gem 以及针对模型设置的自定义配置 问题背景&#xff1a; I am working in a prototype using the gem langchainrb. I am using the module assistant module to implemente a basic RAG architecture. 我正在使用 langchainrb 这个 ge…

学习入门 chatgpt原理 一

学习文章&#xff1a;人人都能看懂的chatGpt原理课 笔记作为学习用&#xff0c;侵删 Chatph和自然语言处理 什么是ChatGpt ChatGPT&#xff08;Chat Generative Pre-training Transformer&#xff09; 是一个 AI 模型&#xff0c;属于自然语言处理&#xff08; Natural Lang…

深度神经网络(dnn)--风格迁移(简单易懂)

概括 深度神经网络&#xff08;DNN&#xff09;在风格迁移领域的应用&#xff0c;实现了将一幅图像的艺术风格迁移到另一幅图像上的目标。该技术基于深度学习模型&#xff0c;特别是卷积神经网络&#xff08;CNN&#xff09;&#xff0c;通过提取内容图像的内容特征和风格图像的…

SK Hynix 3D DRAM良率突破56.1%,开启存储新时代

根据韩国财经媒体Business Korea独家报道&#xff1a;在刚刚结束的VLSI 2024国际研讨会上&#xff0c;韩国半导体巨头SK Hynix公布了一项振奋人心的进展&#xff1a;其五层堆叠3D DRAM的制造良率已达到56.1%。此成果标志着3D DRAM技术在商业化道路上迈出了坚实的一步&#xff0…

VS 在多线程中仅调试某个线程

调试多线程程序时&#xff0c;只想观察某个线程的运行情况&#xff1b; 但是&#xff0c;由于线程切换执行&#xff0c;会导致调试时焦点在几个代码块之间跳来跳去&#xff0c;故需要解决这个问题。 参考文章&#xff1a; C#使用线程窗口调试多线程程序。 1 打开线程窗口&…

Hadoop 2.0 大家族(一)

目录 一、Hadoop 2.0大家族概述&#xff08;一&#xff09;分布式组件&#xff08;二&#xff09;部署概述 二、ZooKeeper&#xff08;一&#xff09;ZooKeeper简介&#xff08;二&#xff09;ZooKeeper 入门 一、Hadoop 2.0大家族概述 &#xff08;一&#xff09;分布式组件 …

CVPR讲座总结(二)-探索图像生成基础模型的最新进展探索多模态代理的最新进展:从视频理解到可操作代理

引言 在CVPR24上的教程中&#xff0c;微软高级研究员Linjie Li为我们带来了多模态代理的深入探索。这些代理通过整合多模态专家和大语言模型&#xff08;LLM&#xff09;来增强感知、理解和生成能力。本文总结了Linjie Li的讲座内容&#xff0c;重点介绍了多模态记忆、可操作代…

ElementUI搭建

概述 Element&#xff0c;一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组 件库. 安装 ElementUI npm 安装 推荐使用 npm 的方式安装&#xff0c;它能更好地和 webpack 打包工具配合使用。 npm i element-ui -S 在控制台输入此命令来安装ElementUI 在 main.j…

低代码平台实践:打造高效动态表单解决方案的探索与思考

&#x1f525;需求背景 我司业务同事在抓取到候选人的简历之后&#xff0c;经常会出现&#xff0c;很多意向候选人简历信息不完整&#xff0c;一个个打电话确认的情况&#xff0c;严重影响了HR的工作效率&#xff0c;于是提出我们可以通过发送邮件、短信、H5链接的方式来提醒候…

迈巴赫S480升级增强现实AR抬头显示hud比普通抬头显示HUD更好用吗

增强AR实景抬头显示HUD&#xff08;Augmented Reality Head-Up Display&#xff09;是一种更高级的驾驶辅助技术&#xff0c;相比于普通抬头显示HUD&#xff0c;它提供了更丰富、更具沉浸感的驾驶体验。以下是它比普通抬头显示HUD多的一些功能&#xff1a; • 信息呈现方式&am…

七天速通javaSE:第二天 基础:标识符与数据类型

文章目录 前言一、注释与标识符1. 注释2. 标识符2.1 标识符2.2 关键字 二、数据类型1. 语言类型2. 数据类型2.1 基本数据类型2.2引用数据类型 三、类型转换1. 自动转换2. 强制转换&#xff08;不建议&#xff09; 四、代码规范 前言 今天将学习Java语法的基础&#xff0c;认识…

idea添加文档注释

一、easy javadoc插件 在settings的plugins中下载easy javadoc插件。 安装完成后重启idea&#xff0c;再次打开settings界面。会出现easyDoc相关配置。 二、设置模版以及使用 类描述模版参考设置&#xff1a; /** * 类描述 -> * * Author: ywz * Date: $Date$ */ 方法描述…

【SSM】

Spring常见面试题总结 Spring 基础 什么是 Spring 框架? Spring 是一款开源的轻量级 Java 开发框架&#xff0c;旨在提高开发人员的开发效率以及系统的可维护性。 我们一般说 Spring 框架指的都是 Spring Framework&#xff0c;它是很多模块的集合&#xff0c;使用这些模块…

AI助力校园安全:EasyCVR视频智能技术在校园欺凌中的应用

一、背景分析 近年来&#xff0c;各地深入开展中小学生欺凌行为治理工作&#xff0c;但有的地方学生欺凌事件仍时有发生&#xff0c;严重损害学生身心健康&#xff0c;引发社会广泛关注。为此&#xff0c;教育部制定了《防范中小学生欺凌专项治理行动工作方案》进一步防范和遏…