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();
    }
}
相关推荐
LZQqqqqo4 分钟前
C# 中 ArrayList动态数组、List<T>列表与 Dictionary<T Key, T Value>字典的深度对比
windows·c#·list
Dm_dotnet3 小时前
Stylet启动机制详解:从Bootstrap到View显示
c#
三千道应用题4 小时前
WPF&C#超市管理系统(6)订单详情、顾客注册、商品销售排行查询和库存提示、LiveChat报表
开发语言·c#·wpf
唐青枫9 小时前
别滥用 Task.Run:C# 异步并发实操指南
c#·.net
我好喜欢你~16 小时前
C#---StopWatch类
开发语言·c#
NRatel19 小时前
亚马逊S3的使用简记(游戏资源发布更新)
游戏·unity·amazon s3
一阵没来由的风19 小时前
拒绝造轮子(C#篇)ZLG CAN卡驱动封装应用
c#·can·封装·zlg·基础封装·轮子
SmalBox1 天前
【渲染流水线】[几何阶段]-[屏幕映射]以UnityURP为例
unity·渲染
一枚小小程序员哈1 天前
基于微信小程序的家教服务平台的设计与实现/基于asp.net/c#的家教服务平台/基于asp.net/c#的家教管理系统
后端·c#·asp.net
Eternity_GQM1 天前
【Word VBA Zotero 引用宏错误分析与改正指南】【解决[21–23]参考文献格式插入超链接问题】
开发语言·c#·word