欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > Unity类银河战士恶魔城学习总结(P139 In Game UI游戏内UI)

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

2025/9/26 2:24:29 来源:https://blog.csdn.net/suzh1qian/article/details/143975011  浏览:    关键词: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);elseinstance = this;}public bool HaveEnoughMoney(int _price)//是否有钱去买技能{if (_price > currency){Debug.Log("没有足够的钱");return false;}elsecurrency -= _price;return true;}public int GetCurrency() => currency;//返回当前的货币数量}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词