C#-委托
作者:互联网
利用委托实现玩家扣血,UI刷新功能
玩家血量逻辑
/*玩家的数据,通过向外部暴露一个委托,从而减少代码之间的耦合度*/
using UnityEngine;
// 声明一个血量变动的委托
public delegate void HpChange(float curHp, float maxHp);
public class Player : MonoBehaviour
{
// 将声明的委托进行实例化
public HpChange Hurt;
// 当前血量
float curHp;
// 最大血量
float maxHp;
void Start() {
// 初始化赋值
curHp = maxHp = 100;
// 首次执行,刷新委托,防止显示不正确
Hurt?.Invoke(CurHp,maxHp);
}
public float CurHp {
get => curHp;
set {
// 血量变动
curHp = value;
// 执行委托方法
Hurt?.Invoke(CurHp,maxHp);
}
}
// 测试逻辑
[ContextMenu("扣血")]
public void HurtTest() {
CurHp -= 10;
}
}
UI显示逻辑
/*显示UI脚本,通过向玩家的委托中注册事件,无需获得玩家的对应数据也可以获得相应的显示效果*/
using UnityEngine;
using UnityEngine.UI;
// 玩家血量UI
public class PlayerHpUI : MonoBehaviour
{
// 玩家
Player player;
// 血量Image
Image imageHp;
// 血量Text
Text textHp;
void Awake() {
// 获得要显示的UI
imageHp = GameObject.Find("HpImage").GetComponent<Image>();
textHp = GameObject.Find("HpImage/Hp").GetComponent<Text>();
// 获得对应的游戏物体
player = FindObjectOfType<Player>();
// 向游戏物体中的委托注册血量变动的方法
player.Hurt += hpShow;
}
//血量显示,当游戏物体上的委托调用,这里也会相应的调用
private void hpShow(float curHp, float maxHp) {
imageHp.fillAmount = curHp / maxHp;
textHp.text = curHp + "/" + maxHp;
}
}
开发时减少彼此代码之间的耦合度
标签:委托,C#,float,血量,UI,maxHp,curHp,public 来源: https://www.cnblogs.com/wuzhongke/p/16580798.html