这期我们来制作生成阳光,通过检测当前阳光的数量,来判断是否可以使用植物
(源码放在文章最后)
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状态。