GameFramework事件管理
类图
classDiagram
EventComponent --> EventManager
EventManager --> EventPool~GameEventArgs~
EventPool~GameEventArgs~ o--> EventHandler~GameEventArgs~
EventPool~GameEventArgs~ o--> Event~GameEventArgs~
EventHandler~GameEventArgs~ <|-- YourEventHandler
EventComponent : 入口
EventManager : 事件管理器
EventPool~GameEventArgs~ :事件池,真实管理事件的地方
EventHandler~GameEventArgs~ : 事件监听器
YourEventHandler : 你的事件监听器
Event~GameEventArgs~ : 事件对象
使用
public sealed class ShowEntitySuccessEventArgs : GameEventArgs
{
public static readonly int EventId = typeof(ShowEntitySuccessEventArgs).GetHashCode();
public override int Id
{
get
{
return EventId;
}
}
public float Duration;
}
class Test : MonoBehaviour
{
void Start()
{
GameEntry.GetComponent<EventComponent>().Subscribe(ShowEntitySuccessEventArgs.EventId, OnShowEntitySuccess);
}
void OnDestroy()
{
GameEntry.GetComponent<EventComponent>().Unsubscribe(ShowEntitySuccessEventArgs.EventId, OnShowEntitySuccess);
}
void OnShowEntitySuccess(object sender, GameEventArgs e)
{
ShowEntitySuccessEventArgs args = (ShowEntitySuccessEventArgs)e;
}
void DoSomething()
{
GameEntry.GetComponent<EventComponent>().Fire(this, new ShowEntitySuccessEventArgs{Duration=5});
}
}
代码分析
EventManager.Subscribe(int id, EventHandler<GameEventArgs> handler)
{
m_EventPool.Subscribe(id, handler)
{
m_EventHandlers.Add(id, handler);
}
}
EventManager.Update(float elapseSeconds, float realElapseSeconds)
{
m_EventPool.Update(elapseSeconds, realElapseSeconds)
{
Event eventNode = m_Events.Dequeue();
HandleEvent(eventNode.Sender, eventNode.EventArgs)
{
if (m_EventHandlers.TryGetValue(e.Id, out range))
{
foreach ( var eventHandler in m_EventHandlers )
eventHandler(sender, args);
}
}
}
}