Unity实战案例全解析:PVZ 植物放置分析

前篇:Unity实战案例全解析:PVZ 植物卡片状态分析-CSDN博客 

植物应该如何从卡牌状态转为实物?

其实就只需要考虑两个步骤加一个后续处理:

1.点击卡牌后就实例化

需要一个植物状态枚举,因为卡牌分为拿在手上和种植下去两种状态

//植物状态枚举
enum PlantsState {Disable,Enable
}
public class Plants : MonoBehaviour {//拿到植物类型public PlantType plantType;PlantsState plantsState = PlantsState.Disable;private void Awake() {plantType = PlantType.Sun_Flower;Translate2Disable();}private void Update() {switch (plantsState) {case PlantsState.Disable:PlantDisableUpdate();break;case PlantsState.Enable:PlantEnableUpdate();break;default:break;}}protected virtual void PlantEnableUpdate() {}protected virtual void PlantDisableUpdate() {}public void Translate2Disable() {Debug.Log("关闭");plantsState = PlantsState.Disable;GetComponent<Animator>().enabled = false;}public void Translate2Enable() {Debug.Log("开启");plantsState = PlantsState.Enable;GetComponent<Animator>().enabled = true;}
}

同时可以创建一个放置管理器,创建一个List表存放植物

GetPlant是获取植物的类型

Addplant是为了获取并实例化该植物

FllowHand是为了将植物跟随鼠标,同时关闭植物的功能

OnClick里调用了Cell脚本的种植方法,将植物种下去

public class HandManger : MonoBehaviour
{private static HandManger instance;private HandManger() {instance = this;}public static HandManger Instance => instance;//植物预制体列表public List<Plants> plantsPrefabList;//当前鼠标内的植物private Plants currentPlant;private void Update() {FllowHand();}//添加植物方法,并且加入一个返回值用来判断当前手上是否有植物public bool AddPlant(PlantType plantType){ if(currentPlant != null) return false;//获取植物Plants plants =GetPlant(plantType);if (plants == null)  {Debug.Log("未得到对应类型的植物");  return false;}        //实例化对应植物currentPlant =GameObject.Instantiate(plants);return true;}//判断类型获取植物类型private Plants GetPlant(PlantType plantType){foreach (Plants item in plantsPrefabList) {if(item.plantType == plantType){ return item;}}return null;}//跟随鼠标private void FllowHand() {if(currentPlant ==null) return;//放在鼠标上的时候,不要有动画currentPlant.Translate2Disable();Vector3 handPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);handPos.z= 0;   currentPlant.transform.position = handPos;}//种植到单元格内public void OnCellClick(Cell cells) {if (currentPlant == null)return ;bool isPlaned = cells.AddPlant(currentPlant);//种植成功if(isPlaned ==true)currentPlant = null;         }
}

2.放到草地上,同时开启其功能

草地的实现就是设置一个个碰撞器作为网格,考虑使用mesh组件,不然太多的碰撞器会消耗性能

Cell表示单元格,放到草地上就是将鼠标上的对象坐标转为单元格的坐标(因为单元格锚点默认在中心,可以在组件中调整) 

该脚本的AddPlant是种植方法,但是没有触发就只能算是预处理

public class Cell : MonoBehaviour
{//检查单元格内是否有植物public Plants CellCurrentPlant;//放置植物到单元格内private void OnMouseDown() {HandManger.Instance.OnCellClick(this);      }//为单元格添加植物public bool AddPlant(Plants plants){ if(CellCurrentPlant != null) {return false;}CellCurrentPlant = plants;CellCurrentPlant.transform.position = transform.position;plants.Translate2Enable();return true;}
}

3.处理阳光消耗

这个函数是写在卡牌切换的脚本之中的,needSunPoint是植物卡牌上的所需要阳光数,可以对不同卡牌进行不同设置,其实就是一个植物卡牌的模板,修改一下皮肤,修改一下数值就算是新的植物了

public void OnClick(){//阳光不够则什么也不发生if (needSunPoint > SunManger.Instance.SunPoint)return;//触发植物种植,如果植物被成功种下才触发减少阳光和进入cd状态bool isSuccessPlant = HandManger.Instance.AddPlant(plantType);if(isSuccessPlant == true){       //触发减少阳光SunManger.Instance.SubSun(needSunPoint);//转入cd状态Translate2Cd();}
}

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

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

相关文章

道路裂缝,坑洼,病害数据集-包括无人机视角,摩托车视角,车辆视角覆盖道路

道路裂缝&#xff0c;坑洼&#xff0c;病害数据集 包括无人机视角&#xff0c;摩托车视角&#xff0c;车辆视角 覆盖道路所有问题 一共有八类16000张 1到7依次为: [横向裂缝, 纵向裂缝, 块状裂缝, 龟裂, 坑槽, 修补网状裂缝, 修补裂缝, 修补坑槽] 道路病害&#xff08;如裂缝、…

MQ(RabbitMQ)笔记

初识MQ 同步调用优缺点 异步调用优缺点 总结&#xff1a; 时效性要求高&#xff0c;需要立刻得到结果进行处理--->同步调用 对调用结果不关心&#xff0c;对性能要求高&#xff0c;响应时间短--->异步调用

人工智能和大模型的简介

文章目录 前言一、大模型简介二、大模型主要功能1、自然语言理解和生成2、文本总结和翻译3、文本分类和信息检索4、多模态处理三、大模型的技术特性1、深度学习架构2、大规模预训练3、自适应能力前言 随着技术的进步,人工智能(Artificial Intelligence, AI)和机器学习(Mac…

NPM如何切换淘宝镜像进行加速

什么是淘宝镜像NPM&#xff1f; 淘宝镜像NPM和官方NPM的主要区别在于服务器的地理位置和网络访问速度。淘宝镜像NPM是由淘宝团队维护的一个npm镜像源&#xff0c;主要服务于中国大陆用户&#xff0c;提供了一个国内的npm镜像源&#xff0c;地址为 https://registry.npmmirror.…

论文阅读 - SELF-REFINE: Iterative Refinement with Self-Feedback

https://arxiv.org/pdf/2303.17651 目录 Abstract Introduction 2 Iterative Refinement with SELF-REFINE Evaluation 3.1 Instantiating SELF-REFINE 3.2 Metrics 3.3 Results Abstract 与人类一样&#xff0c;大型语言模型&#xff08;LLMs&#xff09;并非总能在首次…

【有啥问啥】深入浅出马尔可夫链蒙特卡罗(Markov Chain Monte Carlo, MCMC)算法

深入浅出马尔可夫链蒙特卡罗&#xff08;Markov Chain Monte Carlo, MCMC&#xff09;算法 0. 引言 Markov Chain Monte Carlo&#xff08;MCMC&#xff09;是一类用于从复杂分布中采样的强大算法&#xff0c;特别是在难以直接计算分布的情况下。它广泛应用于统计学、机器学习…

【python设计模式2】创建型模式1

目录 简单工厂模式 工厂方法模式 简单工厂模式 简单工厂模式不是23中设计模式中的&#xff0c;但是必须要知道。简单工厂模式不直接向客户端暴露对象创建的细节&#xff0c;而是通过一个工厂类来负责创建产品类的实例。简单工程模式的角色有&#xff1a;工厂角色、抽象产品角…

Redis——常用数据类型string

目录 常用数据结构&#xff08;类型&#xff09;Redis单线程模型Reids为啥效率这么高&#xff1f;速度这么快&#xff1f;&#xff08;参照于其他数据库&#xff09; stringsetgetMSET 和 MGETSETNX&#xff0c;SETEX&#xff0c;PSETEXincr&#xff0c;incrby&#xff0c;decr…

go多线程

1、简单使用&#xff08;这个执行完成&#xff0c;如果进程执行比较久&#xff0c;这里不会等待它们结束&#xff09; package mainimport "time"func main() {go func() {println("Hello, World!")}()time.Sleep(1 * time.Second) }2、wg.Add(数量)使用&…

STM32 定时器 输入捕获

定时器输入捕获 1 工作原理1.1 单个通道的工作原理 2 输入滤波2.1 输入滤波原理 3 边沿检测3.1 边沿检测3.2 信号选择 4 分频5 通道使能 1 工作原理 1.1 单个通道的工作原理 2 输入滤波 2.1 输入滤波原理 fck_INT&#xff1a;内部时钟频率&#xff0c;当PCLKx_Pre为1时&…

prometheus 集成 grafana 保姆级别安装部署

前言 本文 grafana 展示效果只需要 prometheus node_exporter grafana 其他的选择安装 环境和版本号 系统: CentOS 7.9 prometheus: 2.54.1 pushgateway: 1.9.0 node_exporter: 1.8.2 alertmanager: 0.27.0 grafana:11.2.0 官网:https://prometheus.io/ 下载地址:h…

软件测试 | APP测试 —— Appium 的环境搭建及工具安装教程

大家应该都有同一种感觉&#xff0c;学习appium最大的难处之一在于环境的安装&#xff0c;安装流程比较繁琐&#xff0c;安装的工具和步骤也较多&#xff0c;以下是基于Windows系统下的Android手机端的安装流程。就像我们在用Selenium进行web自动化测试的时候一样&#xff0c;我…

Gin渲染

HTML渲染 【示例1】 首先定义一个存放模板文件的 templates文件夹&#xff0c;然后在其内部按照业务分别定义一个 posts 文件夹和一个 users 文件夹。 posts/index.tmpl {{define "posts/index.tmpl"}} <!DOCTYPE html> <html lang"en">&…

计算机毕业设计 视频点播网站 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

day22JS-npm中的部分插件使用方法

1. 静态资源目录 静态资源目录就是访问服务器的某些路劲时候&#xff0c;服务器可以吐出一个写好的指定页面。 实现思路&#xff1a; 1、先判断要找的路径是否是文件&#xff0c;如果是文件&#xff0c;就加载发给对方。 2、如果是文件夹&#xff0c;找到这个文件夹所在路径中…

Spring Boot基础

项目创建 项目启动 请求响应 RestController 1.返回值处理 RestController&#xff1a;这个注解结合了Controller和ResponseBody的功能。它默认将所有处理请求的方法的返回值直接作为响应体内容返回&#xff0c;主要用于构建RESTful API。返回的数据格式通常是JSON或XML&…

Linux:软件包管理器 yum和编辑器-vim使用

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习《Linux&#xff1a;软件包管理器 yum和编辑器-vim使用》&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 如果本篇文章对你有帮助&#xff0c;还请各位点…

整流电路的有源逆变工作状态

目录 1. 逆变的概念 2. 有源逆变的条件 3. 电流电路的概念 4. 产生逆变的条件 5. 三相桥式全控整流电路的有源逆变工作状态 6. 逆变角的概念 7. 逆变失败的原因 8. 最小逆变角的限制 整流电路的有源逆变状态是指通过控制整流器&#xff0c;使其将直流电源的能量反向送回…

[乱码]确保命令行窗口与主流集成开发环境(IDE)统一采用UTF-8编码,以规避乱码问题

文章目录 一、前言二、命令行窗口修改编码为UTF-8三、Visual Studio 2022修改编码为UTF-8四、Eclipse修改编码为UTF-8五、DevCPP修改编码为UTF-8六、Sublime Text修改编码为UTF-8七、PyCharm、IDEA、VS Code及Python自带解释器修改编码为UTF-8 一、前言 在学习的征途中&#x…

close_wait状态的实例:一次 MySQL 主动关闭,导致服务出现大量 CLOSE_WAIT 的全流程排查过程【个人总结】

没有实际的操作设备和条件&#xff0c;只能看文章来体验。文章主要是通过观察实例来说明close_wait状态的问题&#xff0c;一般导致close_wait状态都不是有意的&#xff0c;而是操作不注意就会导致此问题的出现。所以在代码书写上一定要确保不会出现问题。 事件&#xff1a;so…