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);
}
}
希望对各位有所帮助!
热门推荐
合同履行内容明确双方权利义务,确保合同顺利执行
新材料新技术在军事防护装备中的应用
没签合同工程款拖欠怎么办?三种欠薪情况处理指南
永生花的特点及养护方法有哪些?
超市发现过期商品怎么办
青蛙属于昆虫还是动物,是动物长大后用肺呼吸
水龙头多久一检?水龙头检验报告有效期多久?
刀片电池崛起与演变:新能源领域的技术革命
手机严重卡顿怎么办?
手机通话声音小怎么办
情感语录文案看透:从制作技巧到商业价值
日本就业市场持续向好:就业人数连续23个月增长,失业率降至2.5%
日本就业率,理想的数据不理想的结构
遭遇市场波动时,如何灵活调整年度经营计划?
关注四川首届新高考丨高一这样选科的学生,高三赢面更大
甘蔗煮水喝有什么功效和作用
零基础入门Qt 6编程:PDF资源指南
自私的基因:从生物学角度探讨人类自私行为
甲亢怀孕应该进行哪些检查项目?
机器视觉系统如何进行多相机系统的同步
躯体化反应:探索身体对心理压力的自动响应机制!
贵州:弘扬多彩饮食文化
贵州旅游:美食之旅不可错过的美味体验!
雞心對狗有好處嗎?
PPO(近端策略优化)算法基本原理
春节假期,长沙到底有多 “热”?949 万人次给出答案!
“五一”假期长沙持续出圈,居“全国旅游热度最高目的地城市”等榜单前列
近视的人吃鱼眼睛会有所改善吗
国补省钱攻略来了
公司违反劳动法不给加班费怎么举报