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

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

植物状态脚本

cs 复制代码
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;
    }
}

向日葵脚本

cs 复制代码
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);
            }
        }
    }
}

豌豆射手脚本

cs 复制代码
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);
    }
}
相关推荐
寂寞的船15 小时前
【Unity知识速递】第13期 Unity 内存泄漏排查实战:从 Memory Profiler 到 Lua 引用泄漏的生产级全链路诊断
unity·junit·c#·游戏引擎·lua
寂寞的船1 天前
【Unity Bug挑战】第12期 Awaitable 二次 await 死锁之谜 —— 为什么同一个异步操作等两次就卡死?
unity·c#·游戏引擎·bug
探求虚无3 天前
用 AI 在 Unity 里做一款 RTS:最难的不是生成代码,而是证明它真的能玩
人工智能·unity·游戏引擎
17岁的勇气4 天前
Unity Shader unity文档学习笔记(二十二):shader变体
笔记·学习·unity
寂寞的船5 天前
【Unity知识速递】第10期 Unity GC 零分配实战:从 UnityEngine.Pool 到手动 GC 控制的全链路优化
jvm·unity·c#·游戏引擎·lucene
Martina_03215 天前
AI生成3D场景的霓虹灯一开就糊成光团?用6步检查Emissive、Bloom与曝光
人工智能·3d·ai·自然语言处理·游戏引擎·材质·贴图
寂寞的船7 天前
【Unity知识速递】第8期 IL2CPP 托管堆内存碎片与原生堆交互机制深度解析
unity·游戏引擎·交互
寂寞的船7 天前
【Unity知识速递】第5期 Unity 6.2 深度解析:AI Assistant 登场,World Space UI 与 Sentis 全面升级
人工智能·ui·unity
寂寞的船7 天前
【Unity知识速递】第4期 MCP for Unity:用 AI 自然语言控制编辑器
人工智能·unity·编辑器
淡海水8 天前
09-04-内存-Unity原生对象生命周期
unity·c#·游戏引擎·gc