版权声明:本文为博主原创文章,未经博主允许不得转载。 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);