编程语言
首页 > 编程语言> > C#-委托

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