利用委托实现玩家扣血,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; } }
开发时减少彼此代码之间的耦合度