HTFramework框架使用手册(二) Event全局事件系统

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq992817263/article/details/85689865

Event模块简介

在Event模块,可以将一切操作定义为具体事件,通过订阅事件、抛出事件以驱动整个业务逻辑!

使用Event

自定义事件

事件可以被订阅、取消订阅、抛出等,想要自定义事件,必须满足以下条件:
1.继承至EventHandler
推荐使用快捷创建方式:
Project界面右键 -> Create -> HTFramework -> EventHandler Script
在这里插入图片描述
如下图,我自定义了一个名为PlayerAttackEvent的事件:

/// <summary>
/// 玩家攻击
/// </summary>
public class PlayerAttackEvent : EventHandler
{
    /// <summary>
    /// 填充数据,所有属性、字段的初始化工作可以在这里完成
    /// </summary>
    public PlayerAttackEvent Fill()
    {
        return this;
    }

    /// <summary>
    /// 重置引用,当被引用池回收时调用
    /// </summary>
    public override void Reset()
    {
        
    }
}

最好使用模板生成的Fill方法作为数据填充方法,我们改一下加入一个攻击力字段:

/// <summary>
/// 玩家攻击
/// </summary>
public class PlayerAttackEvent : EventHandler
{
    public int Power;

    /// <summary>
    /// 填充数据,所有属性、字段的初始化工作可以在这里完成
    /// </summary>
    public PlayerAttackEvent Fill(int power)
    {
        Power = power;
        return this;
    }

    /// <summary>
    /// 重置引用,当被引用池回收时调用
    /// </summary>
    public override void Reset()
    {
        
    }
}

订阅事件

新建自定义事件完成以后,我们接下来就可以直接订阅该事件,让我们修改下Player类:

public class Player : MonoBehaviour
{
    int code;

    private void Awake()
    {
        code = GetHashCode();
    }

    public void Attack(int power)
    {
        GlobalTools.LogInfo(code + " 攻击:[攻击力 " + power + "]");
    }

    private void Start()
    {
        //订阅 PlayerAttackEvent 事件
        Main.m_Event.Subscribe<PlayerAttackEvent>(OnPlayerAttack);

        Attack(100);
    }

    /// <summary>
    /// 处理 PlayerAttackEvent 事件
    /// </summary>
    private void OnPlayerAttack(object sender, EventHandler handler)
    {
        PlayerAttackEvent e = handler as PlayerAttackEvent;
        Debug.Log("玩家攻击事件:攻击力 " + e.Power);
    }
}

抛出事件

在任意位置都可以抛出任意事件,所有订阅了该事件的对象都将第一时间收到响应:

public class Player : MonoBehaviour
{
    int code;

    private void Awake()
    {
        code = GetHashCode();
    }

    public void Attack(int power)
    {
        //抛出 PlayerAttackEvent 事件
        Main.m_Event.Throw(this, new PlayerAttackEvent().Fill(power));

        GlobalTools.LogInfo(code + " 攻击:[攻击力 " + power + "]");
    }

    private void Start()
    {
        //订阅 PlayerAttackEvent 事件
        Main.m_Event.Subscribe<PlayerAttackEvent>(OnPlayerAttack);

        Attack(100);
    }

    /// <summary>
    /// 处理 PlayerAttackEvent 事件
    /// </summary>
    private void OnPlayerAttack(object sender, EventHandler handler)
    {
        PlayerAttackEvent e = handler as PlayerAttackEvent;
        Debug.Log("玩家攻击事件:攻击力 " + e.Power);
    }
}

运行!
在这里插入图片描述

取消订阅事件

当不需要在接收某个事件的响应时,记得取消订阅事件:

//取消订阅 PlayerAttackEvent 事件
Main.m_Event.Unsubscribe<PlayerAttackEvent>(OnPlayerAttack);

猜你喜欢

转载自blog.csdn.net/qq992817263/article/details/85689865