Unity中人物属性面板UI的构成
创作时间:
作者:
@小白创作中心
Unity中人物属性面板UI的构成
引用
CSDN
1.
https://blog.csdn.net/qq_65230893/article/details/139078044
在许多游戏中,角色属性面板UI是必不可少的组件,通常会显示血量、蓝条、防御等关键属性。本文将通过一个简单的示例,介绍如何在Unity中实现这样的UI面板。
角色中的属性构成
在此次demo中,角色属性包含血量(HP)、蓝条(MP)和护甲(Defense)。我们首先在Player脚本中定义这些属性:
//上限
public float MaxHp = 3f;
public float MaxMp = 5f;
public float MaxDefense = 5f;
//初始血量
private float hp = 3f;
private float mp = 5f;
private float defense = 5f;
UI面板中绑定各个字段
我们可以简单设置一个UI的面板。其中保证文字的一致性,我们可以让"/"左侧的文字居右,右侧的文字居左。
角色脚本中更新数据的同时唤醒事件
为了保证数据的更新一致性,可以添加一个事件,用于在数据更新时通知UI面板更新。为了区分变更的到底是哪个数据,需要现在UI挂载的脚本添加一个枚举类,用于区分传递的数据。
UI面板挂载的脚本:
public enum Attr
{
HP,
MP,
DEFENSE,
}
这样,在角色脚本中就可以通过UI脚本中的Attr发送不同的数据:
//在数据发生变化时唤醒该事件,并传递一个属性
public event EventHandler<OnAttrChangedEventArgs> OnAttrChanged;
public class OnAttrChangedEventArgs : EventArgs
{
public PlayerAttributePanelUI.Attr attr;
}
public float HP
{
get { return hp; }
set
{
if (hp != value)
{
hp = value;
OnAttrChanged?.Invoke(this, new OnAttrChangedEventArgs
{
attr = PlayerAttributePanelUI.Attr.HP
});
}
}
}
public float MP
{
get { return mp; }
set
{
if(mp != value)
{
mp = value;
OnAttrChanged?.Invoke(this, new OnAttrChangedEventArgs
{
attr = PlayerAttributePanelUI.Attr.MP
});
}
}
}
public float DEFENSE
{
get { return defense; }
set
{
if(defense != value)
{
defense = value;
OnAttrChanged?.Invoke(this, new OnAttrChangedEventArgs
{
attr = PlayerAttributePanelUI.Attr.DEFENSE
});
}
}
}
UI面板脚本中订阅事件并同步更新
在UI脚本中我们就可以根据接收到的数据来实时更新:
private void UpdateUI(Attr attr)
{
switch (attr)
{
case Attr.HP:
hpText.text = Player.Instance.HP.ToString();
hpMaxText.text = Player.Instance.MaxHp.ToString();
hpBar.fillAmount = Player.Instance.HP / Player.Instance.MaxHp;
break;
case Attr.MP:
mpText.text = Player.Instance.MP.ToString();
mpMaxText.text = Player.Instance.MaxMp.ToString();
mpBar.fillAmount = Player.Instance.MP / Player.Instance.MaxMp;
break;
case Attr.DEFENSE:
defenseText.text = Player.Instance.DEFENSE.ToString();
defenseMaxText.text = Player.Instance.MaxDefense.ToString();
defenseBar.fillAmount = Player.Instance.DEFENSE / Player.Instance.MaxDefense;
break;
}
}
在事件唤醒的时候调用UpdateUI函数即可:
private void Player_OnAttrChanged(object sender, Player.OnAttrChangedEventArgs e)
{
UpdateUI(e.attr);
}
完整代码
Player
public class Player : MonoBehaviour
{
public static Player Instance { get; private set; }
public event EventHandler<OnAttrChangedEventArgs> OnAttrChanged;
public class OnAttrChangedEventArgs : EventArgs
{
public PlayerAttributePanelUI.Attr attr;
}
//上限
public float MaxHp = 3f;
public float MaxMp = 5f;
public float MaxDefense = 5f;
private float hp = 3f;
private float mp = 5f;
private float defense = 5f;
public float HP
{
get { return hp; }
set
{
if (hp != value)
{
hp = value;
OnAttrChanged?.Invoke(this, new OnAttrChangedEventArgs
{
attr = PlayerAttributePanelUI.Attr.HP
});
}
}
}
public float MP
{
get { return mp; }
set
{
if(mp != value)
{
mp = value;
OnAttrChanged?.Invoke(this, new OnAttrChangedEventArgs
{
attr = PlayerAttributePanelUI.Attr.MP
});
}
}
}
public float DEFENSE
{
get { return defense; }
set
{
if(defense != value)
{
defense = value;
OnAttrChanged?.Invoke(this, new OnAttrChangedEventArgs
{
attr = PlayerAttributePanelUI.Attr.DEFENSE
});
}
}
}
}
PlayerAttributePanelUI
public class PlayerAttributePanelUI : MonoBehaviour
{
public enum Attr
{
HP,
MP,
DEFENSE,
}
private void Start()
{
Player.Instance.OnAttrChanged += Player_OnAttrChanged;
UpdateUI(Attr.HP);
UpdateUI(Attr.MP);
UpdateUI(Attr.DEFENSE);
}
private void UpdateUI(Attr attr)
{
switch (attr)
{
case Attr.HP:
hpText.text = Player.Instance.HP.ToString();
hpMaxText.text = Player.Instance.MaxHp.ToString();
hpBar.fillAmount = Player.Instance.HP / Player.Instance.MaxHp;
break;
case Attr.MP:
mpText.text = Player.Instance.MP.ToString();
mpMaxText.text = Player.Instance.MaxMp.ToString();
mpBar.fillAmount = Player.Instance.MP / Player.Instance.MaxMp;
break;
case Attr.DEFENSE:
defenseText.text = Player.Instance.DEFENSE.ToString();
defenseMaxText.text = Player.Instance.MaxDefense.ToString();
defenseBar.fillAmount = Player.Instance.DEFENSE / Player.Instance.MaxDefense;
break;
}
}
private void Player_OnAttrChanged(object sender, Player.OnAttrChangedEventArgs e)
{
UpdateUI(e.attr);
}
}
希望对各位有所帮助!
热门推荐
从南昌自驾游去最近的海边:2日行程、路线选择与可行性分析
湖北新高考政策解读2025版:含赋分规则、等级对照表
“深度学习教父”遇见诺贝尔物理学奖,唤起了 13 位 AI 界大神的回忆……
【结构思考力】第二章 基于目标定主题
内心宁静,烦恼皆消!做到这几点,让心重归平静
科创板ETF火爆背后的价值与风险,如何甄别投资机会?
从一座山变为一种文化符号:钟山文脉的千年传承
如何选择适合自己的路由器:全面指南与实用建议
钢铁侠反转理论!美队穿越酿成大祸,毁灭博士引爆漫威终极危机!
手动挡转速和档位如何匹配
颈动脉斑块,可防可控!
如果宇航员在国际空间站进行太空跳伞会发生什么?
周堂案件全案回顾:探究一起具有影响力的中国法治事件
Docker有哪些优点和缺点
解决晚上手臂酸痛,提高睡眠质量的方法
大学女生“受欢迎”身高,168cm排在末尾?这个观点并不完全正确
通过加快气候融资推进性别平等
睡眠时间不固定可以吗?
撞电动车后怎么办?处理方法与赔偿指南
单挑对决,F35VS苏57到底谁会笑到最后?F35能先敌发现但不占优
媒体投放效果分析:不同平台的策略比较
蓝宝石葡萄种植要点及技术详解
大观通宝古钱币版别详解:16种版别特征全解析
“崇宁通宝”、“大观通宝”钱币特征的鉴别
港交所优化交易收费标准:小额交易降本或提升市场流动性
“美队”为什么变成了他?
“太阳底下无新事”这句谚语的确切意思
感冒好转的症状表现及康复期调理指南
清朝九品十八级官制详解:从太师到九品官员的职能与权力
岩棉板对人体健康的影响及防护措施