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

news2024/11/15 8:20:20

前篇: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.coloradmin.cn/o/2139086.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android 10.0 mtk平板camera2横屏预览旋转90度横屏保存圆形预览缩略图旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,点击录像和照片下保存的圆形预览缩略图 依然是竖屏的,所以说同样需要…

需求导向的正则表达式

目录 re.sub 需求&#xff1a;把 1. 2.这些序号转成&#xff08;1&#xff09; &#xff08;2&#xff09; 需求&#xff1a;反过来&#xff0c;把(1)->1. ,&#xff08;2&#xff09;》2. 。 需求&#xff1a;把出现的 1 2 3都转成下标 进阶1&#xff01;只想让化学符…

Redis入门2

在java中操作Redis Redis的Java客户端 Redis 的 Java 客户端很多&#xff0c;常用的几种: Jedis Lettuce Spring Data Redis Spring Data Redis 是 Spring 的一部分&#xff0c;对 Redis 底层开发包进行了高度封装。 在 Spring 项目中&#xff0c;可以使用Spring Data R…

把项目部署到Linux系统上(如何在阿里云服务器上安装和配置SpringBoot+vue全栈开发环境)

项目部署上线 环境准备下载安装Linux系统和ssh连接工具背景知识安装虚拟机安装Linux系统选择installCentOS7按命令IP addr查看服务器IP地址&#xff0c;ens33网卡中会出现IP地址配置好后就可以查看了一个可远程连接Linux服务器的工具1.&#xff08;基于finalshell工具&#xff…

小明震惊OpenAI 的新模型 01

在硅谷的中心&#xff0c;繁忙的咖啡馆和创业中心周围&#xff0c;年轻的软件工程师小明坐在他的办公桌前&#xff0c;面露困惑。科技界一直在盛传一项新的AI突破&#xff0c;但他持怀疑态度&#xff0c;不敢抱太大希望。他认为AI泡沫即将破灭&#xff0c;炒作列车即将出轨&…

网络原理 IP协议与以太网协议

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:MySQL数据库 JavaEE专栏:JavaEE 关注博主带你了解更多数据结构知识 目录 1.网络层 IP协议 1.IP协议格式 2.地址管理 2.1 IP地址 2.2 解决IP地址不够用的问题 2.3NAT网络地址转换 2.4网段划分 3.路由选择…

北极星计划的回响:从Leap Motion到Midjourney的AI 3D硬件梦想

在科技的浩瀚星空中,总有一些梦想如同北极星般璀璨,指引着探索者前行。六年前,Leap Motion的CEO David以一篇充满激情的博客文章,向我们揭示了“北极星计划”——一个旨在打破数字与物理界限,创造流畅统一体验的增强现实平台。今天,随着Midjourney在AI文生图领域的全球爆…

2024.9.15周报

一、题目信息 题目&#xff1a;Physics-informed neural networks for solving flow problems modeled by the 2D Shallow Water Equations without labeled data 链接&#xff1a;物理信息神经网络用于解决由二维浅水方程建模的流动问题&#xff0c;无需标记数据- ScienceDi…

【Node.js】初识 RabbitMQ

概述 MQ 顾名思义&#xff0c;是消息队列。 RabbitMQ 是一个消息队列系统&#xff0c;用于实现异步通信。基于 AMQP。AMQP(高级消息队列协议) 实现了对于消息的排序&#xff0c;点对点通讯&#xff0c;和发布订阅&#xff0c;保持可靠性、保证安全性。 在 Node.js 的微服务架…

LAMP+WordPress

一、简介 LAMP&#xff1a; L&#xff1a;linux——操作系统&#xff0c;提供服务器运行的基础环境。A&#xff1a;apache&#xff08;httpd&#xff09;——网页服务器软件&#xff0c;负责处理HTTP请求和提供网页内容。M&#xff1a;mysql&#xff0c;mariadb——数据库管理…

PCL 窗口可视化两个点云

目录 一、概述 1.1原理 1.2实现步骤 1.3 应用场景 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xff08;长期更新&#xff09; 一、概述 本文将介绍如何使用PCL库…

8.4Prewitt算子边缘检测

基本原理 Prewitt算子是一种用于边缘检测的经典算子&#xff0c;它通过计算图像中像素值的&#xff08;一阶导数&#xff09;梯度来检测边缘。Prewitt算子通常包括两个3x3的卷积核&#xff0c;一个用于检测水平方向上的边缘&#xff0c;另一个用于检测垂直方向上的边缘。 示例…

【动漫资源管理系统】Java SpringBoot助力,搭建一个高清动漫在线观看网站

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

【插件】【干货】用EPPlus在Unity中读写Excel表

EPPlus是什么我就不说了&#xff0c;你都点进来了肯定知道 几个常用的api 1.index下标都是从1开始的 2.可以读取任意单元格上的任意内容&#xff0c;不需要给excel表写规则 但是如果你写了规则&#xff0c;就需要自己用额外的代码 --- 数据结构去实现 3.打开excel表 ExcelP…

[数据集][目标检测]智慧交通铁路异物入侵检测数据集VOC+YOLO格式802张7类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;802 标注数量(xml文件个数)&#xff1a;802 标注数量(txt文件个数)&#xff1a;802 标注类别…

萤石举办2024清洁机器人新品发布会 多维智能再造行业标杆

导言&#xff1a;作为智慧生活守护者&#xff0c;萤石今日发布了两款清洁机器人&#xff0c;AI扫拖机器人RS20 Pro Ultra 和AI洗地机器人RX30 Max &#xff0c;标志着萤石在智能清洁领域的全新突破。RS20 Pro Ultra基于CutFree 2.0内切割滚刷专利&#xff0c;有效解决毛发缠绕难…

速通GPT:《Improving Language Understanding by Generative Pre-Training》全文解读

文章目录 速通GPT系列几个重要概念1、微调的具体做法2、任务感知输入变换3、判别式训练模型 Abstract概括分析和观点1. 自然语言理解中的数据问题2. 生成预训练和监督微调的结合3. 任务感知输入变换4. 模型的强大性能 Introduction概括分析和观点1. 自然语言理解的挑战在于对标…

探索Python的HTML处理神器:pyquery的魔力

文章目录 探索Python的HTML处理神器&#xff1a;pyquery的魔力背景&#xff1a;为何选择pyquery&#xff1f;pyquery是什么&#xff1f;安装pyquery五个简单的库函数使用方法1. $&#xff1a;选择元素2. .text()&#xff1a;获取文本内容3. .html()&#xff1a;获取HTML内容4. …

SSM框架学习(三、MyBatis实践:提高持久层数据处理效率)

目录 一、Mybatis简介 1.简介 2.持久层框架对比 3.快速入门&#xff08;基于Mybatis3方式&#xff09; 4.ibatis方式的实现和原理 5.ibatis与mybatis之间的关系 二、Mybatis基本使用 1.向 sql 语句传参 &#xff08;1&#xff09;mybatis日志输出配置 &#xff08;2&…

小程序开发设计-第一个小程序:创建小程序项目④

上一篇文章导航&#xff1a; 小程序开发设计-第一个小程序&#xff1a;安装开发者工具③-CSDN博客https://blog.csdn.net/qq_60872637/article/details/142219152?spm1001.2014.3001.5501 须知&#xff1a;注&#xff1a;不同版本选项有所不同&#xff0c;并无大碍。 一、创…