一、添加游戏背景和卡片槽
1.植物在卡片槽上的状态有三种,高亮、灰色、冷却状态,现在以向日葵为列作为示例:
因此要创建三个Image,为其添加不同的状态:
然后去控制植物在冷却时的效果,这个时候需要设置图片的图像类型,将其设置为以填充,最后通过控制填充总数的值的变化来达到,冷却的显示效果。
设置好了之后为其创建一个公共的父类,然后将其设置为预设体。如下效果:
2.通过脚本控制不同状态,在CardTemplate上添加脚本来控制。
定义枚举来控制不同状态,在冷却完毕后会进入等待阳光的状态,当阳光够了之后会直接进入Ready状态,当我们点击后进入Cooling状态。
enum CardState
{
? ? Cooling,
? ? WaitingSun,
? ? Ready,
}
定义一个默认状态的属性:
?private CardState cardState = CardState.Cooling;
定义两个游戏物体引用,定义一个Image属性
? ? public GameObject cardLight;?
? ? public GameObject cardGray;
? ? public Image cardMask;
定义冷却时间属性和计时器
? ? public float cdTime = 2;
? ? public float cdTimer = 0;
在Update里面使用switch语句来对不同状态进行判断,并在对应的状态调用对应的方法。
? private void Update()
? ? {
? ? ? ? switch (cardState)
? ? ? ? {
? ? ? ? ? ? case CardState.Cooling:
? ? ? ? ? ? ? ? CoolingUpdata();
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case CardState.WaitingSun:
? ? ? ? ? ? ? ? WaitingSunUpdata();
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case CardState.Ready:
? ? ? ? ? ? ? ? ReadyUpdata();
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? default:
? ? ? ? ? ? ? ? break;
? ? ? ? }
? ? }
现在为具体的方法写对应的逻辑
现在为不同状态的转换写入相应方法
切换到等待阳光状态:
? ? void TransitionTowaitingSun()
? ? ? {
? ? ? ? cardState = CardState.WaitingSun;
? ? ? ? cardLight.SetActive(false);
? ? ? ? cardGray.SetActive(true);
? ? ? ? cardMask.gameObject.SetActive(false);
? ? }
切换到可种植状态:
? ? private void TransitionToReady()
? ? {
? ? ? ? cardState = CardState.Ready;
? ? ? ? cardLight.SetActive(true);
? ? ? ? cardGray.SetActive(false);
? ? ? ? cardMask.gameObject.SetActive(false);
? ? }
切换到冷却状态:
? void TransitionToCooling()
? ? {
? ? ? ? cardState = CardState.Cooling;
? ? ? ? cdTimer = 0;
? ? ? ? cardLight.SetActive(false);
? ? ? ? cardGray.SetActive(true);
? ? ? ? cardMask.gameObject.SetActive(true);
? ? }
对于CoolingUpdata方法:这个方法需要修改Image组件上的填充属性,让其从一慢慢渐变到零表示冷却时间结束。这个属性显示的是剩余时间的比例,因此:
? ? private void CoolingUpdata()
? ? {
? ? ? ? cdTimer += Time.deltaTime;
? ? ? ? cardMask.fillAmount = (cdTime - cdTimer) / cdTime;
? ? ? ? if (cdTimer >= cdTime)
? ? ? ? {
? ? ? ? ? ? TransitionTowaitingSun();
? ? ? ? }
? ? }
现在编写WaitingSunUpdata方法,在这个方法里面只需要判断阳光是否足够即可。
对于阳光,创建一个SunManager的类来单独管理阳光,并将其设置为单例模式。
? ? public static SunManager Instance { get; private set; }
? ? private void Awake()
? ? {
? ? ? ? Instance = this;
? ? }
? ? //添加序列化标签,方便测试
? ? [SerializeField]
? ? private int sunPoint;?
? ? public int SunPoint
? ? {
? ? ? ? get { return sunPoint; }
? ? }
回到WaitingSunUpdata方法里
声明需要的阳光值的属性
? ? [SerializeField]
? ? private int needSunPoint = 50;
? ? private void WaitingSunUpdata()
? ? {
? ? ? ? if (needSunPoint <= SunManager.Instance.SunPoint)
? ? ? ? ? ? {
? ? ? ? ? ? ? ?TransitionToReady();
? ? ? ? ? ? }
? ? }
当阳光足够时调用TransitionToReady方法切换到可种植状态。
现在编写ReadyUpdata方法,这个方法是表示植物是可以被种植的,同样也要检测阳光是否足够,如果不够就切换状态,而且这个状态植物是可以被点击的,因此为其添加一个button组件,为其添加一个点击事件。
? ? private void WaitingSunUpdata()
? ? {
? ? ? ? if (needSunPoint <= SunManager.Instance.SunPoint)
? ? ? ? ? ? {
? ? ? ? ? ? ? ?TransitionToReady();
? ? ? ? ? ? }
? ? }
//点击事件
? ? public void Onclick()
? ? {
? ? ? ? if (needSunPoint > SunManager.Instance.SunPoint) return;
? ? ? ? //TODO:消耗阳光值,并进行种植
? ? ? ? ?TransitionToCooling();
? ? }
所以逻辑编写之后,运行游戏会有如下效果:
一开始会是冷却状态,冷却过后会进入等待阳光状态,当阳光足够时点击卡片又重新进入冷却状态。