6.《植物大战僵尸》检测和生成阳光值,点击植物卡片装换状态

这期我们来制作生成阳光,通过检测当前阳光的数量,来判断是否可以使用植物

(源码放在文章最后)

1.创建管理阳光的脚本

  新建一个空对象Manager用来管理脚本,创建一个脚本SunManager用来管理阳光,挂载给Manager。

通过单例模式,其它脚本可以检测到当前阳光值,后期在使用植物消耗阳光时,也会通过这个改变阳光的数量

声明用来展示阳光数量的text,并提前声明一个反馈消耗阳光的方法,这里后面在点击植物卡片的时候就可以通过传入消耗阳光的值,来更新当前阳光的数量。这里用到的是Text (TMP),方便后面在unity里对text的编辑

给CardListUI创建一个Text - TextMeshPro

能Import的都Import一下,完事后叉掉

调整一下刚刚创建的Text - TextMeshPro(即Text (TMP))的位置和参数

最后再将Text (TMP)拖到sunPointText这里

2.实现点击植物卡片来切换卡片的状态

通过单例模式获取到当前阳光的数量,然后再对比生成植物所需要的阳光,从而判定当前卡片的状态;最后反馈生成植物所消耗的阳光。知道大家累了,所以具体的脚本放在了文章的最下方,可自行copy。

3.给卡片(CardLight)添加一个按钮,绑定脚本(Card)的方法Onclik()

(注意:需要先完成第二步)

4.添加向日葵和豌豆射手

  之前就是以向日葵为例,所以我们只需要copy两份CardTemplate,分别命名为CardPeaShooter(豌豆射手) 和 CardSunFlower(向日葵),再给豌豆射手换一下UI即可。

可以在面板上修改植物的 cd 和 需要的阳光数量 (needSunPoint),实现生成不同植物所需要消耗的阳光和冷却时间

  

脚本Card:

using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using UnityEngine;
using UnityEngine.UI;

enum CardState
{
    Cooling,       //冷却状态
    WaitingSun,    //缺乏阳光状态
    Ready          //可以状态
}
public class Card : MonoBehaviour
{
    //将植物的默认状态设为冷却状态
    private CardState cardState = CardState.Cooling;

    public GameObject cardLight;
    public GameObject cardGray;
    public Image grayMask;

    public float cdTime = 2.5f;   //植物的冷却时间
    private float cdTimer = 0;    //计时器

    [SerializeField]
    private int needSunPoint = 50;  //生成植物所需要的阳光
   
    void Update()
    {
        switch (cardState)
        {
            case CardState.Cooling:
                CoolingUpdate();
                break;
            case CardState.WaitingSun:
                WaitingSunUpdate();
                break;
            case CardState.Ready:
                ReadyUpdate();
                break;
            default:
                break;
        }
       
    }

    void CoolingUpdate()
    {
        cdTimer += Time.deltaTime;
        grayMask.fillAmount = (cdTime - cdTimer) / cdTime;

        if (cdTimer >= cdTime)
        {
           //cdTimer = 0;  //重置计时器
           TransitionToWaitingSun();
        }
    }

    void WaitingSunUpdate()
    {
        //如果阳光充足
        if(needSunPoint <= SunManager.Instance.SunPoint)
        {
            TransitionToReady();  //转化为可使用状态
        }
    }

    void ReadyUpdate()
    {
        //如果阳光不足
        if (needSunPoint > SunManager.Instance.SunPoint)
        {
            TransitionToWaitingSun();
        }
    }

    void TransitionToWaitingSun()  //转化为缺乏阳光的状态
    {
        //改变植物卡片的状态
        cardState = CardState.WaitingSun;

        //隐藏另外两个Image
        cardLight.SetActive(false);
        cardGray.SetActive(true);
        grayMask.gameObject.SetActive(false);
    }

    void TransitionToReady()  //转化为可使用状态
    {
        //改变植物卡片的状态
        cardState = CardState.Ready;

        //隐藏另外两个Image
        cardLight.SetActive(true);
        cardGray.SetActive(false);
        grayMask.gameObject.SetActive(false);
    }

    void TransitionCooling()  //转化为冷却状态
    {
        //改变植物卡片的状态
        cardState = CardState.Cooling;
        cdTimer = 0;  //重置计时器

        //隐藏另外两个Image
        cardLight.SetActive(false);
        cardGray.SetActive(true);
        grayMask.gameObject.SetActive(true);
    }

    public void Onclik()  //绑定卡片上按钮的方法
    {
        if (needSunPoint > SunManager.Instance.SunPoint)
            return;

        //消耗阳光值,并进行种植

        TransitionCooling();  //种植后转变为冷却状态

        SunManager.Instance.SubSun(needSunPoint); //  反馈所消耗的阳光
    }
}

脚本SunManager:

using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;

public class SunManager : MonoBehaviour
{
    public static SunManager Instance
    {
        get; 
        private set;
    }

    public TextMeshProUGUI sunPointText;  //阳光数量文本

    private void Awake()
    {
        Instance = this;
    }

    [SerializeField]
    private int sunPoint = 250;  //阳光总量
    public int SunPoint
    {
        get { return sunPoint; }
    }

    private void Start()
    {
        UpdateSunPointText();
    }

    public void UpdateSunPointText()
    {
        //将阳光数量以文本形式展现
        sunPointText.text = sunPoint.ToString();
    }

    public void SubSun(int point)
    {
        //更新消耗阳光后的阳光数量
        sunPoint -= point;
        UpdateSunPointText();
    }
}

到了这里,就实现了在阳光充足的情况下,通过点击植物卡片反馈所消耗的阳光和返回卡片的cd状态。

  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值