Unity实战案例全解析:PVZ 植物卡片状态分析

Siki学院2023的PVZ免费了,学一下也坏

卡片状态

卡片可以有三种状态:

1.阳光足够,(且cd好了可以种植)

2.阳光不够,(cd?好了:没好 (三目运算符))

3.开始转cd,(被种下)

状态切换是单向循环的,只有a到b,没有a到c所以不会互相干扰,所以上面括号内的内容可以不用考虑

转换状态触发条件

因为教程中使用的是枚举配合Switch切换状态

cs 复制代码
public class ControlState : MonoBehaviour
{
   public enum Card_State
        { 
        //准备就绪
        E_Ready,
        //Cd
        E_Cd,
        //cd结束等待阳光
        E_WaitingSun
    }
    //三种状态的对象
    public GameObject Light;
    public GameObject WaitSun;
    public Image LayerMask;
    Card_State state;

    //计时器变量
    public float ReadNeedTime = 2;
    public float CdTime = 0;

    //需要阳光数
    public int needSunPoint = 50;

    private void Awake() {
        //初始状态表现一下Cd冷却
         state = Card_State.E_Cd;
    }
    private void Update() {
        switch (state) {

            case Card_State.E_Ready:
                ReadyUpdate();
                break;
            case Card_State.E_Cd:
                CDUpdate();
                break;
            case Card_State.E_WaitingSun:
                WaitingSunUpdate();
                break;
            default:
                throw new System.NotImplementedException("未正确返回枚举类型");
        }
    }

    /// <summary>
    /// 阳光不够就切换回等待状态
    /// </summary>
    public void ReadyUpdate()
        {
        if (needSunPoint > SunManger.Instance.SunPoint) {
            Translate2WaitSun();
        }
    }
    /// <summary>
    /// 转cd,如果cd转完了则转到等待阳光阶段
    /// </summary>
    public void CDUpdate()
        { 
      //计时器变0将图片设置为WaitingSun状态
        CdTime += Time.deltaTime;
        LayerMask.fillAmount = (ReadNeedTime - CdTime) / ReadNeedTime;

        if (CdTime>ReadNeedTime)
            {
            Translate2WaitSun();
        }
    }
    /// <summary>
    /// 阳光足够则转为准备好的阶段
    /// </summary>
    public void WaitingSunUpdate() {
        if (needSunPoint <= SunManger.Instance.SunPoint)
            {
            Translate2Ready();
        }
    }

让我想想,从难度低到难度高,还有几种方式可以切换状态

1.if else 我以切换条件定义一堆变量可以实现条件切换

2.事件,写了这么多函数是否可以用Unity.Event的配合UGUI来切换呢?有待考究

胡说但是说不定可行:3.状态机 4.行为树

转换状态中要处理的逻辑

cs 复制代码
    /// <summary>
    /// 转换方法:2WaitSun
    /// </summary>
    public void Translate2WaitSun()
        {
        state = Card_State.E_WaitingSun;
        LayerMask.gameObject.SetActive(false);
        Light.SetActive(false);
        WaitSun.SetActive(true);
        //重置计时器
        CdTime = 0;
    }
    /// <summary>
    /// 转换方法:2Ready
    /// </summary>
    public void Translate2Ready()
        {
        
        state = Card_State.E_Ready;
        LayerMask.gameObject.SetActive(false);
        Light.SetActive(true);
        WaitSun.SetActive(false);
    }

    /// <summary>
    /// 转换方法:2Cd
    /// </summary>
    public void Translate2Cd() {

        state = Card_State.E_Cd;
        LayerMask.gameObject.SetActive(true);
        Light.SetActive(false);
        WaitSun.SetActive(true);
    }
    /// <summary>
    /// Ready下被点击将会进入cd
    /// </summary>
    public void OnClick()
        {
        //阳光检查
        if (needSunPoint > SunManger.Instance.SunPoint)
            return;
        //TODO:被种植

        //转入cd状态
        Translate2Cd();
    }
}
相关推荐
WarPigs2 小时前
Unity在Create菜单添加创建自定义脚本模板选项
unity
czhc11400756633 小时前
退出防呆:用“总闸“收口所有退出入口,以及三个并发语法坑
开发语言·c#
郝学胜-神的一滴4 小时前
C++ Templates 01:拨开迷雾,读懂C++模板经典著作
开发语言·c++·程序人生·游戏·游戏引擎·软件构建
淡海水6 小时前
02-01-原理篇-Mark-Sweep与变种算法
算法·unity·c#·游戏引擎·.net·gc
babywang07 小时前
Unity笔记--塔防游戏中的ECS架构:从原理到实战的全面解析
unity·ecs架构
UIU11410 小时前
同一个变量在两个 .c 文件里类型不一致,程序会怎样?
c++·学习·c#
波力海苔夹心脆67521 小时前
C# 值类型与引用类型详解:存储位置、赋值机制、参数传递、相等比较、装箱拆箱与常见陷阱
开发语言·jvm·经验分享·笔记·c#·.net
估值探索者21 小时前
【Python量化策略实战 #02】多因子合成mom和vol两因子打分合成
开发语言·c++·python·数据挖掘·c#
babywang01 天前
Unity笔记--AssetBundle详解
unity·游戏引擎
魔士于安1 天前
经典Game
游戏·游戏引擎·贴图·技术美术·模型