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

embedded/2024/9/23 9:34:01/

前篇: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.ppmy.cn/embedded/113466.html

相关文章

MySQL基于GTID同步模式搭建主从复制

系列文章目录 rpmbuild构建mysql5.7.42版本的rpm包 文章目录 系列文章目录一、mysql-5.7.42RPM包构建二、同步模式分类介绍1.异步同步模式2.半同步模式2.1.实现半同步操作流程2.2.半同步问题总结2.3.半同步一致性2.4.异步与半同步对比 3.GTID同步 三、GTID同步介绍1.gtid介绍2…

小程序面试题八

一、微信小程序如何处理页面间的数据通信&#xff1f; 微信小程序处理页面间的数据通信&#xff0c;可以采用多种方式&#xff0c;这些方法根据具体需求和场景的不同而有所选择。以下是几种常见的页面间数据通信方式&#xff1a; 1. URL 传递参数 适用场景&#xff1a;适用于…

Docker学习笔记(四)单主机网络

简介 Docker从容器中抽象除出了底层的主机连接网络&#xff0c;使得程序不用关心运行时的环境。连接到Docker网络的容器将获得唯一的地址&#xff0c;其他连接到同一Docker网络的容器也可以根据该IP找到目标容器并发送消息。   但是容器内运行的软件没法方便的确定主机IP地址…

【物联网】深入解析时序数据库TDengine及其Java应用实践

文章目录 一、什么是时序数据库&#xff1f;二、TDengine简介三、TDengine的Java应用实践&#xff08;1&#xff09;环境准备&#xff08;2&#xff09;数据插入&#xff08;3&#xff09;数据查询 一、什么是时序数据库&#xff1f; 时序数据库&#xff08;Time-Series Datab…

MybatisPlus的一点了解

1.MybatisPlus使用&#xff1a; &#xff08;1&#xff09;Serializable id 这种参数要怎么传入值&#xff0c;对应的底层调用和数据库表格命名和实体类映射之间有什么关系 在 Java 中&#xff0c;Serializable 是一个标记接口&#xff0c;它表示一个类的实例可以被序列化&am…

后端开发刷题 | 最长上升子序列

描述 给定一个长度为 n 的数组 arr&#xff0c;求它的最长严格上升子序列的长度。 所谓子序列&#xff0c;指一个数组删掉一些数&#xff08;也可以不删&#xff09;之后&#xff0c;形成的新数组。例如 [1,5,3,7,3] 数组&#xff0c;其子序列有&#xff1a;[1,3,3]、[7] 等。…

【Java Bean Validation API】Spring3 集成 Bean 参数校验框架

Spring3 集成 Bean 参数校验框架 Java Bean Validation API 1. 依赖 Spring 版本&#xff1a;3.0.5 Java 版本&#xff1a;jdk21 检验框架依赖&#xff08;也可能不需要&#xff0c;在前面 spring 的启动依赖里就有&#xff09;&#xff1a; <!-- 自定义验证注解 -->…

Excel数据转置|Excel数据旋转90°

Excel数据转置|Excel数据旋转90 将需要转置的数据复制在旁边空格处点击鼠标右键&#xff0c;选择图中转置按钮&#xff0c;即可完成数据的转置。&#xff01;&#xff01;&#xff01;&#xff01;非常有用啊啊啊&#xff01;&#xff01;&#xff01;