unity学习笔记----游戏练习01

发布时间:2023年12月28日

一、添加游戏背景和卡片槽

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

所以逻辑编写之后,运行游戏会有如下效果:

一开始会是冷却状态,冷却过后会进入等待阳光状态,当阳光足够时点击卡片又重新进入冷却状态。

文章来源:https://blog.csdn.net/2301_79022588/article/details/135257673
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。