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);
}
}
希望对各位有所帮助!
热门推荐
失眠困扰你多久了?这些睡眠误区你一定要知道
球面镜片和非球面镜片的区别,在设计原理、视觉体验、外观,佩戴和价格等方面有差异!
干货 | 赛前两周如何科学备战马拉松?
城乡居民基础养老金怎么申请?
养老金计发月数的计算方法是怎样的?为什么60岁是139个月?
如何判断汽车充电器是否为快充?这些标准帮你快速识别
憋回去的屁,都到哪去了?屁多不一定是肠胃有问题,这类食物影响很大……
苏轼七句话,带你走出人生的困境
水煮肉片的烹饪技巧分享
怎样才能优化设置,减少电量消耗,提升手机续航
爱上一个人和不爱一个人,竟然可以自我控制?研究说:可以
中国传统花鸟画的历史演变与艺术特色
正常人怎么查乙肝
20个寓言故事教你人生道理,助你智慧决策!
保护手机安全,教你几招有用的方法
分析李白诗歌中的生态意识及思想渊源
安全驾驶学院
英文职位申请信的格式与写作指南(2025版)
如何正确设置路由器的DNS以提高网络速度?
如何通过旅行增进恋爱关系?这些方法必不可少
如何分析甜味剂白糖的价格差异原因?这种价格差异如何影响市场需求?
四大指标教你如何挑选适合你的枕头
37.5度低烧怎么处理
丁酸的生理功能
电线材料的选择依据是什么?这种选择依据存在哪些影响因素?
公务员退休后的升职空间:政策解读与职业发展路径分析
惊!电风扇的“逆向思维”降温法:窗外吹来屋内爽?
广州首条地铁环线将“上线”它为何是全城焦点
2025中国艺术类大学TOP20强院校有哪些?附校友会详细排名
山腰上的中国:红旗渠:一场普通人与自然的壮丽对决 | 新书