Unity类银河战士恶魔城学习总结(P139 In Game UI游戏内UI)
【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili
教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/
本章节在游戏的界面添加了技能UI,并且加上了冷却时间的动画
在最下角加入了技能的冷却时间动画
UI_InGame.cs
1. Start()
方法
- 订阅事件:将
playerStats
的onHealthChanged
事件与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)!