一、添加游戏背景和卡片槽
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();
}
所以逻辑编写之后,运行游戏会有如下效果:
一开始会是冷却状态,冷却过后会进入等待阳光状态,当阳光足够时点击卡片又重新进入冷却状态。