Unity中人物属性面板UI的构成
创作时间:
作者:
@小白创作中心
Unity中人物属性面板UI的构成
引用
CSDN
1.
https://blog.csdn.net/qq_65230893/article/details/139078044
在许多游戏中,角色属性面板UI是必不可少的组件,用于显示角色的血量、蓝条、防御等关键属性。本文将通过一个简单的示例,详细介绍如何在Unity中实现一个包含血量、蓝条和护甲的角色属性面板。
角色中的属性构成
在此次demo中角色属性包含血量、蓝条和护甲。我们首先在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);
}
}
热门推荐
羊蝎子:一道跨越千年的美食传奇
冬季自驾318国道全攻略:2142公里冰雪之路的安全指南
川藏线自驾安全指南:六大风险防范,助你征服“最美景观大道”
燕窝冰箱里能怎么样存放
寺庙商业化:在保护与发展间寻求平衡
少林寺商业化:经济效益与争议并存的20年
【这些文化遗存现今的模样】聆听古琴那悠悠雅韵……
十二星座男生性格大揭秘:谁是你心中的Mr. Right?
G318川藏南线:穿越雪山草原,串联九大美景
春秋季节自驾318国道:8天7夜安全穿越川藏线
稻城亚丁:三神山守护的香格里拉,最佳季节与实用攻略
青海西宁环线自驾游,绝美风光等你发现
八达岭长城错峰游正当时:秋景绝美,游客稀少
《清明上河图密码》收视率暴跌,张颂文还能翻红吗?
2025年端午节股市休市安排出炉,这份投资指南请收好
中哈霍尔果斯合作中心:中欧班列的新亮点
专家解析:牙龈肿胀的五大病因及治疗方案
牙龈肿胀完全指南:原因、症状及治疗方案
羊蝎子:冬天里的暖心美食
清炖羊蝎子:冬季养生的滋补美味
冬日暖心羊蝎子,新年餐桌必备!
光纤激光切割机:金属非金属皆可切,十大工业领域广泛应用
中金 | 电信服务全球研究系列:美国电信运营商篇
一句粤语日常对话,竟藏着这么多古汉语词汇!
越吃眼睛越亮的3种菜,隔天吃一次,不仅养肝明目,还能补脾养胃
Vlog新手入门指南:从主题设定到后期制作全流程解析
Vlog新手入门必看:从主题设定到后期制作的完整指南
Vlog新手入门必看:从主题设定到后期制作的完整指南
泡脚不简单!泡得好养生,泡不好伤身
4节课堂展示+3场专家讲座,埇桥区音乐教师培训助力新课标落地