首页 > 其他分享 >Unity实战案例全解析 :PVZ 植物脚本分析

Unity实战案例全解析 :PVZ 植物脚本分析

时间:2024-09-16 23:48:40浏览次数:3  
标签:float void PVZ System private Unity using 解析 public

         植物都继承了Pants脚本,但是我因为没注意听讲,把Pants也挂在植物上了,所以子类的PlantEnableUpdate和PlantDisableUpdate抢不过父类,无法正确触发动画,我还找不到哪里出了问题,所以就使用了携程加while强行触发了,但是经过对源码和工程的分析比对,我发现了问题所在,所以写都写了就这样吧,又不是不能跑,而且协程优化还好一些吗,气死我了呜呜,耽误了好几个小时,下次我一定好好听课呜呜呜

植物状态脚本 

using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using Unity.VisualScripting;
using UnityEngine;
using static ControlState;

//植物状态枚举
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;
    }
}

向日葵脚本

using System.Collections;
using UnityEngine;
using System.Collections.Generic;
using Unity.VisualScripting;

public class SunFlower : Plants {
    private Animator animator;
    public GameObject sunPrefab; // 阳光预制体
    public float minTime = 4f; // 最小生成时间
    public float maxTime = 10f;//最大生成时间
    public float offsetY = -0.5f;
    public float offsetX;
    

    private void Awake() {
        animator = this.GetComponent<Animator>();
    }
    private void Start() {
        StartCoroutine(GenerateSun());
    }
    protected override void PlantEnableUpdate() {
        //if (!isGeneratingSun) {
        //    isGeneratingSun = true;
            
        //}
    }

    private IEnumerator GenerateSun() {
        while (true) {
            // 随机等待时间
            float waitTime = Random.Range(minTime, maxTime);
            yield return new WaitForSeconds(waitTime);

            animator.SetTrigger("CreatSun");
            yield return new WaitForSeconds(1f);
            // 随机生成阳光位置
            offsetX = Random.Range(-0.5f, 0.5f);
            Vector3 sunPosition = new Vector3(transform.position.x + offsetX, transform.position.y + offsetY, transform.position.z);
            GameObject sunInstance = Instantiate(sunPrefab, transform.position, Quaternion.identity);

            // 获取 Sun 组件并调用 JumpTo 方法
            Sun sunComponent = sunInstance.GetComponent<Sun>();
            if (sunComponent != null) {
                sunComponent.JumpTo(sunPosition);
            }
        }
    }
}

豌豆射手脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PeashShooter : Plants
{
    //攻击间隔
    public float atkTime = 2;
    //攻击计时
    public float atkTimer=0;
    //豌豆预制体
    public GameObject peach;

    //豌豆实例化位置
    public Transform peashPos;
    void Start() {
        PlantEnableUpdate();
        StartCoroutine(GenerateSun());
    }
 
    private IEnumerator GenerateSun() {
        while (true) {
            atkTimer += Time.deltaTime;
            if (atkTimer > atkTime) {
                atkTimer = 0;
                Shoot();
            }
            yield return new WaitForSeconds(0);
        }
}
    public void Shoot() {
        GameObject.Instantiate(peach, peashPos.transform.position,Quaternion.identity);
    }
}

标签:float,void,PVZ,System,private,Unity,using,解析,public
From: https://blog.csdn.net/2301_77947509/article/details/142291281

相关文章

  • 惊艳不已!智能解析10个API接口分类
    常见的API接口开发平台:通信类短信API语音API彩信APIFAXAPIIVRAPITTSAPI在线客服API短信/语音验证码API定时提醒API常见的API接口开放平台:测评类API便捷数据网常见的API接口开发平台:通信类iContact、Mailgun、Mandrill、SendGrid:都是云邮件发送平台,提供易于使......
  • 基于CosyVoice的多语言语音合成技术解析
    CosyVoice是阿里通义实验室开源的先进语音模型,专为自然语音生成而设计。该模型不仅支持多语言的语音合成,还能够精准地控制音色和情感表现,显著提升语音合成的自然度和真实感。CosyVoice在多语言语音生成、零样本语音生成、跨语言声音合成以及指令执行方面表现卓越,是目前语音......
  • shopify主题开发之template模板解析
    在Shopify主题开发中,template 文件是核心部分,它们定义了店铺中不同页面的布局和结构。下面将详细介绍Shopify主题中的 template 模板。一、template文件结构在Shopify主题中,templates 文件夹包含了所有用于生成店铺页面的模板文件,使用两种不同的文件类型:JSON和L......
  • MySQL 子查询全解析:执行、性能影响与优化策略
    在MySQL数据库的操作中,子查询是一个强大而又复杂的工具。今天,我们就来深入探讨MySQL如何执行子查询、其性能影响、优化方法以及哪些情况下应避免使用子查询。一、MySQL如何执行子查询非相关子查询非相关子查询也被称为独立子查询,它可以独立于外部查询进行执行。MySQL通......
  • Javaweb之SpringBootWeb案例之阿里云OSS服务集成的详细解析
     2.3.3集成阿里云oss对象存储服务的准备工作以及入门程序我们都已经完成了,接下来我们就需要在案例当中集成oss对象存储服务,来存储和管理案例中上传的图片。编辑在新增员工的时候,上传员工的图像,而之所以需要上传员工的图像,是因为将来我们需要在系统页面当中访问并展示员工的图像。......
  • 如何基于Java解析国密数字证书
    一、说明随着信息安全的重要性日益凸显,数字证书在各种安全通信场景中扮演着至关重要的角色。国密算法,作为我国自主研发的加密算法标准,其应用也愈发广泛。然而,在Java环境中解析使用国密算法的数字证书时,我们可能会遇到一些挑战。本文主要分享如何在Java中解析采用SM3WITHSM2......
  • C# 新技能 DynamicExpresso 动态表达式解析器
    目录前言项目介绍项目特点项目应用项目示例1、参数2、返回值3、生成动态委托4、Lambda表达式5、特殊标识符项目地址最后前言项目开发中有时候我们需要快速地执行一些小脚本,不想每次都去生成编译整个项目。这时如果有一个好用的动态表达式解析器那就就特别方......
  • Unity中的三种渲染路径
    Unity中的渲染路径Unity的渲染路径在Unity里,渲染路径(RenderingPath)决定了光照是如何应用到UnityShader中的。因此,我们只有为Shader正确地选择和设置了需要的渲染路径,该shader的光照计算才可以被正确执行。unity中的渲染路径:ForwardRenderingPath(向前渲染路径)DeferredR......
  • 【C++】模板进阶:深入解析模板特化
    C++语法相关知识点可以通过点击以下链接进行学习一起加油!命名空间缺省参数与函数重载C++相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类C/C++内存管理模板初阶String使用String模拟实现Vector使用及其模拟实现List使用及其模拟实现容器适配器Stack与Queue本章将......
  • 排它锁、共享锁与死锁的全面解析
    ‍前言在数据库技术中,封锁是实现并发控制的核心手段。它保证了多个事务同时进行时的数据一致性,避免了数据冲突和错误。对于初学者来说,理解封锁技术是迈向数据库高手的第一步。这篇文章将通过简洁明了的方式,帮助你轻松掌握封锁的相关知识。什么是封锁?为什么重要?封锁,顾......