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);
}
}
希望对各位有所帮助!
热门推荐
宋江:忠义与权谋的复杂交织
中国古代文学名著解读之《水浒传》的文化内涵
企业创新心理健康服务,多形式活动助力女性职场减压
携程CEO孙洁:女性领导者需兼具战略思维与同理心
从偏见到平衡:职场女性的人际关系攻略
朱悦:从华尔街到香港,打破金融行业“玻璃天花板”的女性典范
贝恩合伙人:女性高管展现独特优势,企业需打造包容文化
皮秒激光致黑色素沉着:原因分析与科学应对指南
激光术后冬季护理要点:防晒、保湿是关键
《无限暖暖》第二期巡游:40个特色打卡点详解
2024春节压岁钱攻略:让孩子财商爆表
压岁钱理财攻略:让孩子从小学会钱生钱
压岁钱理财,让孩子变身小小理财家
交强险应赔商三者险不应赔,法院明确被保险人本车碰撞赔付规则
江苏海安“以旧换新”政策引爆二手房市场
《水浒传》中的宋代社会风貌:从皇宫到市井的全景展现
四大名著谁主沉浮?且看文学巅峰上的群雄逐鹿
揭秘《水浒传》拍摄幕后:张绍林、袁和平和李雪健的传奇合作
口碑炸裂的6部高分欧美剧,一集上头根本停不下来
深度睡眠,真的能帮你瘦下来吗?
王者荣耀新春地图发布引争议,玩家热议英雄平衡与皮肤优化
微信被清理的图片怎么恢复?恢复过期文件,只需简单7招
最新!彩票中大奖要缴多少税?官方权威解读来了
《甄嬛传》里的权力游戏:乾隆如何平衡孝道与皇权
华妃凭权势横行,皇后靠心机掌权:《甄嬛传》权力斗争解析
AI 助力游戏开发中的常用算法实现
过期的雪碧还能有新用途?(浇花是不错的选择!)
雪碧可以浇花吗?专家为你解答
《甄嬛传》三大配角十年后:华妃转型实力派,安陵容成综艺妈妈
4罐储蓄法,让孩子变身理财小达人!