当前位置: 首页 > news >正文

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

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

卡片状态

卡片可以有三种状态:

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

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

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

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

转换状态触发条件

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

public class ControlState : MonoBehaviour
{public enum Card_State{ //准备就绪E_Ready,//CdE_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.行为树

转换状态中要处理的逻辑

    /// <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();}
}

 

 

http://www.lryc.cn/news/440994.html

相关文章:

  • 判断变量是否为有限数字(非无穷大或NaN)math.isfinite() 判断变量是否为无穷大(正无穷大或负无穷大)math.isinf()
  • idea使用阿里云服务器运行jar包
  • 解决nginx代理SSE接口的响应没有流式返回
  • 11 - TCPClient实验
  • React框架搭建,看这一篇就够了,看完你会感谢我
  • 【rust】rust条件编译
  • 一键文本提示实现图像对象高质量剪切与透明背景生成
  • 游戏客服精华回复快捷语大全
  • 国内版Microsoft Teams 基础版部署方案
  • 计算机网络 ---- OSI参考模型TCP/IP模型
  • 在Windows环境下部署Java的Web项目集成工具的整体流程和详细步骤
  • 9.18作业
  • 【算法】滑动窗口—最小覆盖子串
  • “Fast-forward“ in git-pull result
  • Oracle(133)如何创建表空间(Tablespace)?
  • Linux中权限和指令
  • 本地镜像发布到阿里云
  • 【Linux】【Vim】Vim 基础
  • 计算机人工智能前沿进展-大语言模型方向-2024-09-18
  • ubuntu24安装vivado24(安装并解决若干错误)
  • CSS实现文本溢出省略号或完整显示
  • three.js PropertyBinding和PropertyMixer
  • ssh远程连接try1账号切换tips
  • C++之第十二课
  • Linux硬连接、软连接和复制的区别
  • 基于STM32的无人小车自主避障系统设计
  • 杂牌鼠标侧键设置
  • Android WebView H5 Hybrid 混和开发
  • 智源推出下一代检索增强大模型框架MemoRAG
  • 【AprilTag】视觉定位实战 | 使用 ROS 驱动的 USB 摄像头进行相机标定与 AprilTag 识别