更新日期:2019年9月25日。
Github源码:​​​[点我获取源码]​​​ Gitee源码:​​[点我获取源码]​

索引

  • ​​Event模块简介​​
  • ​​使用Event​​
  • ​​自定义事件​​
  • ​​订阅事件​​
  • ​​抛出事件​​
  • ​​取消订阅事件​​
  • ​​运行时检视面板​​

Event模块简介

在Event模块,可以将一切操作定义为具体事件,通过订阅事件、抛出事件以驱动整个业务逻辑!从而将逻辑耦合度降到最低。

使用Event

自定义事件

事件可以被订阅、取消订阅、抛出等,想要自定义事件,必须满足以下条件:

1.继承至EventHandlerBase

推荐使用快捷创建方式:

Project界面右键 -> Create -> HTFramework -> C# EventHandler Script

【Unity】 HTFramework框架(二) Event全局事件系统_Power


如下图,我自定义了一个名为PlayerAttackEvent的事件:

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

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

}
}

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

/// <summary>
/// 玩家攻击
/// </summary>
public class PlayerAttackEvent : EventHandlerBase
{
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));
//推荐使用引用池生成事件对象
Main.m_Event.Throw(this, Main.m_ReferencePool.Spawn<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);
}
}

运行!

【Unity】 HTFramework框架(二) Event全局事件系统_Power_02

取消订阅事件

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

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

运行时检视面板

在编辑器中运行时将会出现运行时检视面板(Runtime Data),主要用以调试或数据监测,目前面板如下:

【Unity】 HTFramework框架(二) Event全局事件系统_出事件_03


1.Event List:当前存在的所有事件(当该事件存在至少一个注册对象时,可点击后面的Throw按钮模拟抛出事件,不过请注意,对于带参数的事件对象,这里的模拟抛出并不会赋予参数)。