自学内容网 自学内容网

Unity类银河战士恶魔城学习总结(P139 In Game UI游戏内UI)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili

教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/

本章节在游戏的界面添加了技能UI,并且加上了冷却时间的动画

在最下角加入了技能的冷却时间动画

UI_InGame.cs

1. Start() 方法

  • 订阅事件:将playerStatsonHealthChanged事件与UpdateHealthUI方法绑定,用于在玩家血量改变时自动更新UI。
  • 初始化技能管理器:从单例SkillManager.instance中获取技能相关数据。

2. Update() 方法

主要功能

  • 更新灵魂数量。
  • 检测玩家按键,触发冷却动画。
  • 实时检查每个技能的冷却状态并更新图标。

3. 方法分析

UpdateHealthUI()
  • maxValue:根据玩家的最大血量动态调整血条范围。
  • value:实时更新血条,显示当前血量
CheckCoolDownOf()
  • 逐帧减少fillAmount值。
  • 使用1 / _coolDown * Time.deltaTime计算每帧的减少量,使冷却效果与时间精确对应。
using UnityEngine;
using UnityEngine.UI;
using TMPro;


//2024年11月22日
public class UI_InGame : MonoBehaviour
{
    [SerializeField] private PlayerStats playerStats;
    [SerializeField] private Slider slider;

    [SerializeField] private Image dashImage;
    [SerializeField] private Image parryImage;
    [SerializeField] private Image crystalImage;
    [SerializeField] private Image swordImage;
    [SerializeField] private Image blackholeImage;
    [SerializeField] private Image flaskImage;

    [SerializeField] private TextMeshProUGUI currentSouls;
    private SkillManager skills;


    void Start()
    {
        if(playerStats != null) 
            playerStats.onHealthChanged += UpdateHealthUI;

        skills = SkillManager.instance;
    }

    
    void Update()
    {
        currentSouls.text = PlayerManager.instance.GetCurrency().ToString("#,#");


        if (Input.GetKeyDown(KeyCode.LeftShift) && skills.dash.dashUnlocked)
            SetCooldownOf(dashImage);

        if(Input.GetKeyDown(KeyCode.Q)&&skills.parry.parryUnlocked)
            SetCooldownOf(parryImage);

        if(Input.GetKeyDown(KeyCode.F)&& skills.crystal.crystalUnlocked)
            SetCooldownOf(crystalImage);

        if(Input.GetKeyDown(KeyCode.Mouse1)&&skills.sword.swordUnlocked)
            SetCooldownOf(swordImage);

        if (Input.GetKeyDown(KeyCode.R)&& skills.blackhole.blackHoleUnlocked)
            SetCooldownOf(blackholeImage);

        if(Input.GetKeyDown(KeyCode.Alpha1)&& Inventory.instance.GetEquipment(EquipmentType.Flask) !=null )//必须获取药水
            SetCooldownOf(flaskImage);



        CheckCoolDownOf(dashImage, skills.dash.cooldown);
        CheckCoolDownOf(parryImage, skills.parry.cooldown);
        CheckCoolDownOf(crystalImage, skills.crystal.cooldown);
        CheckCoolDownOf(swordImage, skills.sword.cooldown);
        CheckCoolDownOf(blackholeImage, skills.blackhole.cooldown);
        CheckCoolDownOf(flaskImage, Inventory.instance.flaskCoolDown);
    }


    private void UpdateHealthUI()//更新血条值
    {
        slider.maxValue = playerStats.GetMaxHealthValue();
        slider.value = playerStats.currentHealth;
    }


    private void SetCooldownOf(Image _image)//设置技能冷却时间动画
    {
        if (_image.fillAmount <= 0)
            _image.fillAmount = 1;
    }

    private void CheckCoolDownOf(Image _image,float _coolDown)
    {
        if (_image.fillAmount > 0)
            _image.fillAmount -= 1 / _coolDown * Time.deltaTime;
    }

}

UI.cs

using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.UI;

public class UI : MonoBehaviour
{
    //存放4个UI界面
    [SerializeField] private GameObject characterUI;
    [SerializeField] private GameObject skillTreeUI;
    [SerializeField] private GameObject craftUI;
    [SerializeField] private GameObject optionsUI;
    [SerializeField] private GameObject inGameUI;

    //物品提示框和状态提示框
    public UI_SkillToolTip skillToolTip;
    public UI_ItemTooltip itemToolTip;
    public UI_StatToolTip statToolTip;
    public UI_CraftWindow craftWindow;

    private void Awake()
    {
        SwitchTo(skillTreeUI);//2024年11月22日,P138 Skill Tree Hot Fix,启动时默认显示技能树界面
    }


    void Start()
    {
        SwitchTo(inGameUI);

        itemToolTip.gameObject.SetActive(false);//戏启动时隐藏物品提示框和状态提示框
        statToolTip.gameObject.SetActive(false);
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.C))
            SwitchWithKeyTo(characterUI);

        if (Input.GetKeyDown(KeyCode.B))
            SwitchWithKeyTo(craftUI);

        if (Input.GetKeyDown(KeyCode.K))
            SwitchWithKeyTo(skillTreeUI);

        if (Input.GetKeyDown(KeyCode.O))
            SwitchWithKeyTo(optionsUI);

    }

    public void SwitchTo(GameObject _menu)// 该方法用于切换到指定的UI界面
    {
        for (int i = 0; i < transform.childCount; i++)//遍历当前UI对象的所有子物体
        {
            transform.GetChild(i).gameObject.SetActive(false);//遍历并隐藏所有子元素,确保了在显示新的UI界面时,所有其他的UI界面都会被隐藏
        }


        if (_menu != null)//传入的菜单不为空
        {
            _menu.SetActive(true);//显示
        }
    }


    public void SwitchWithKeyTo(GameObject _menu)//处理切换UI的逻辑
    {
        if (_menu != null && _menu.activeSelf)// UI界面已经显示,隐藏, 如果目标UI界面未显示,调用 SwitchTo 显示。
        {
            _menu.SetActive(false);
            CheckForInGameUI();
            return;
        }

        SwitchTo(_menu);
    }


    private void CheckForInGameUI()//关闭其他UI都会回到InGameUI
    {
        for (int i = 0; i < transform.childCount; i++)
        {
            if (transform.GetChild(i).gameObject.activeSelf)
                return;

        }

        SwitchTo(inGameUI);


    }
}

PlayerManager.cs

添加了获取游戏货币数量的函数!!!

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//P63,制作玩家管理器和技能管理器
//可以在SkeletonBattleState中通过PlayerManager.instance.player.transform获取到玩家的位置
public class PlayerManager : MonoBehaviour
{
    //全局访问
    public static PlayerManager instance;//单例模式
    public Player player;

    public int currency;

    private void Awake()
    {
        if (instance != null)
            Destroy(instance.gameObject);
        else
            instance = this;
    }

    public bool HaveEnoughMoney(int _price)//是否有钱去买技能
    {
        if (_price > currency)
        {
            Debug.Log("没有足够的钱");
            return false;
        }
        else
        
        currency -= _price;
        return true;
    }

    public int GetCurrency() => currency;//返回当前的货币数量

}


原文地址:https://blog.csdn.net/suzh1qian/article/details/143975011

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!