当前位置: 首页 > news >正文

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

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

游戏画面

项目结构目录

部分核心代码

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: 经典游戏:植物大战僵尸

相关文章:

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

学习目标&#xff1a;仿植物大战僵尸核心玩法实现 游戏画面 项目结构目录 部分核心代码 using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; using Random UnityEngine.Random;public enum…...

[Day 18] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

強化學習與生成對抗網絡(GAN) 引言 強化學習 (Reinforcement Learning, RL) 和生成對抗網絡 (Generative Adversarial Networks, GANs) 是現代人工智能中的兩大關鍵技術。強化學習使得智能體可以通過與環境交互學習最佳行動策略&#xff0c;而生成對抗網絡則通過兩個相互競爭…...

【Mac】DMG Canvas for mac(DMG镜像制作工具)软件介绍

软件介绍 DMG Canvas 是一款专门用于创建 macOS 磁盘映像文件&#xff08;DMG&#xff09;的软件。它的主要功能是让用户可以轻松地设计、定制和生成 macOS 上的安装器和磁盘映像文件&#xff0c;以下是它的一些主要特点和功能。 主要特点和功能 1. 用户界面设计 DMG Canva…...

RAG分块方法 从固定大小到自然语言处理分块——深入研究文本分块技术

发掘文本分块-准确的搜索结果和更智能的语言模型背后的秘诀&#xff0c;通过了解如何有效地分块文本&#xff0c;我们可以改进索引文档、处理用户查询和利用搜索结果的方式。准备好揭开文本分块的秘密了吗? 一、了解分块 分块是一种旨在嵌入尽可能少噪音的内容&#xff0c;同…...

FFmpeg 系列

&#x1f4da; 此篇文章是先引入ffmpeg的概念以及主要的功能&#xff0c;后面会根据每一个特点进行详解&#xff0c;喜欢ffmpeg的可以持续关注。 ffmpeg是什么&#xff1f; FFmpeg 是一个开源的跨平台音视频处理工具&#xff0c;它可以用来录制、转换以及流化音视频内容。具体…...

240626_昇思学习打卡-Day8-稀疏矩阵

240626_昇思学习打卡-Day8-稀疏矩阵 稀疏矩阵 在一些应用场景中&#xff0c;比如训练二值化图像分割时&#xff0c;图像的特征是稀疏的&#xff0c;使用一堆0和极个别的1表示这些特征即费事又难看&#xff0c;此时就可以使用稀疏矩阵。通过参考大佬博文&#xff0c;结合个人理…...

Docker: 使用容器化数据库

使用容器化数据库 使用本地容器化数据库提供了灵活性和简易的设置,使您能够在不需要传统数据库安装开销的情况下,紧密模拟生产环境。Docker 简化了这一过程,只需几条命令就可以在隔离的容器中部署、管理和扩展数据库。 在本指南中,您将学习如何: 运行本地容器化数据库访…...

Oracle对用户敏感数据进行编码处理

由于系统运行时间比较长&#xff0c;没有对用户的身份证号、邮箱、手机号进行脱敏处理&#xff0c;后期对数据进行了编码。 更新表数据 sql UPDATE sys_staff SET MOBIL_PHONE CASEWHEN MOBIL_PHONE IS NULL THEN ELSE utl_raw.cast_to_varchar2(utl_encode.base64_encode(ut…...

VXLAN详解:概念、架构、原理、搭建过程、常用命令与实战案例

一、VXLAN概述 1.1 VXLAN的定义 VXLAN&#xff08;Virtual Extensible LAN&#xff0c;虚拟可扩展局域网&#xff09;是一种网络虚拟化技术&#xff0c;通过在现有IP网络上创建虚拟网络&#xff0c;使数据中心可以实现大规模的网络隔离和扩展。VXLAN使用MAC-in-UDP封装技术&a…...

Redis-数据类型-Hash

文章目录 1、查看redis是否启动2、通过客户端连接redis3、切换到db3数据库4、插入新数据返回15、获取指定哈希&#xff08;hash&#xff09;对象的所有字段&#xff08;field&#xff09;名6、获取存储在指定哈希&#xff08;hash&#xff09;对象中的所有字段&#xff08;fiel…...

基于redisson实现tomcat集群session共享

目录 1、环境 2、修改server.xml 3、修改context.xml 4、新增redisson配置文件 5、下载并复制2个Jar包到Tomcat Lib目录中 6、 安装redis 7、配置nginx负载均衡 8、配置测试页面 9、session共享测试验证 前言&#xff1a; 上篇中&#xff0c;Tomcat session复制及ses…...

postgres数据库的流复制

1. 流复制和逻辑复制的差异 逻辑复制和流复制最直观的不同是&#xff0c;逻辑复制支持表级别复制区分点事原理不同 逻辑日志是在wal日志产生的数据库上&#xff0c;由逻辑解析模块对wal日志进行初步的解析&#xff0c;解析结果是ReorderBufferChange&#xff08;理解为HeapTup…...

Dxf库中的DL_Extrusion类

类DL_Extrusion DL_Extrusion 是 DXF 库中的一个类&#xff0c;用于表示三维实体的扩展信息。在 DXF 文件中&#xff0c;DL_Extrusion 类通常用于表示具有高度的三维图形实体&#xff0c;如立方体、圆柱体等&#xff0c;以及其它具有体积的几何对象。 以下是一个简单的示例代…...

“ONLYOFFICE 8.1版本评测:功能更强大,用户体验更佳”

最新版本的在线编辑器已经发布 ONLYOFFICE在线编辑器的最新版本8.1已经发布&#xff0c;整个套件带来了30多个新功能和432个bug修复。这个强大的文档编辑器支持处理文本文档、电子表格、演示文稿、可填写的表单和PDF&#xff0c;并允许多人在线协作&#xff0c;同时支持AI集成…...

搜维尔科技:【研究】触觉手套比控制器更能带来身临其境、更安全、更高效的虚拟体验

自然交互可提高VR模拟的有效性。研究表明&#xff0c;触觉手套比控制器更能带来身临其境、更安全、更高效的虚拟体验。 以下是验证 医疗培训中的触觉技术 “ 95.5%的参与者表示触摸是 XR 教育的重要组成部分&#xff0c;90.9% 的参与者表示 XR 触觉将提供一个安全的学习场所。…...

【小学期】实体类设计——以学生管理系统为例

项目目录中的位置 将Student.java文件放在src/model目录中&#xff0c;即&#xff1a; student_management │ ├── src │ ├── model │ │ ├── Student.java // 这里是Student实体类 │ │ └── StudentDAO.java │ │ │ ├── view │ │ …...

Java测试类

在Java中&#xff0c;为了编写测试类&#xff0c;通常使用JUnit框架。 1. 首先&#xff0c;创建一个名为Calculator的简单Java类&#xff0c;它包含一个方法add用于计算两个整数的和&#xff1a; public class Calculator {public int add(int a, int b) {return a b;} } 2.…...

python 中面向对象编程:深入理解封装、继承和多态

在本章中&#xff0c;我们将深入探讨Python中的高级面向对象编程概念&#xff0c;包括封装、继承和多态。让我们开始吧&#xff01; 目录 面向对象简介类和实例属性和方法继承和多态 高级面向对象概念私有变量使用 property使用 __slots__类的特殊成员__doc____call____str____…...

OpenCV练习(2)图像校正

1、傅里叶变换 霍夫变换 直线 角度 旋转2、边缘检测 霍夫变换 直线角度 旋转3、四点透视 角度 旋转4、检测矩形轮廓 角度 旋转 1.目的 实现类似全能扫面王的图像校正功能 2. 基于轮廓提取和透射变换 基于轮廓提取和透射变换的矫正算法更适用于车牌、身份证、人民…...

Excel中的“点选输入”——次级下拉列表创建

在Excel中&#xff0c;用“数据验证”功能可以设置下拉列表&#xff0c;二级下拉列表需要设置公式。 (笔记模板由python脚本于2024年06月16日 18:36:37创建&#xff0c;本篇笔记适合经常使用Excel处理数据的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;http…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...

实战三:开发网页端界面完成黑白视频转为彩色视频

​一、需求描述 设计一个简单的视频上色应用&#xff0c;用户可以通过网页界面上传黑白视频&#xff0c;系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观&#xff0c;不需要了解技术细节。 效果图 ​二、实现思路 总体思路&#xff1a; 用户通过Gradio界面上…...

麒麟系统使用-进行.NET开发

文章目录 前言一、搭建dotnet环境1.获取相关资源2.配置dotnet 二、使用dotnet三、其他说明总结 前言 麒麟系统的内核是基于linux的&#xff0c;如果需要进行.NET开发&#xff0c;则需要安装特定的应用。由于NET Framework 是仅适用于 Windows 版本的 .NET&#xff0c;所以要进…...

Java中栈的多种实现类详解

Java中栈的多种实现类详解&#xff1a;Stack、LinkedList与ArrayDeque全方位对比 前言一、Stack类——Java最早的栈实现1.1 Stack类简介1.2 常用方法1.3 优缺点分析 二、LinkedList类——灵活的双端链表2.1 LinkedList类简介2.2 常用方法2.3 优缺点分析 三、ArrayDeque类——高…...

基于Uniapp的HarmonyOS 5.0体育应用开发攻略

一、技术架构设计 1.混合开发框架选型 &#xff08;1&#xff09;使用Uniapp 3.8版本支持ArkTS编译 &#xff08;2&#xff09;通过uni-harmony插件调用原生能力 &#xff08;3&#xff09;分层架构设计&#xff1a; graph TDA[UI层] -->|Vue语法| B(Uniapp框架)B --&g…...