GameFramework事件池
类图
使用
public abstract class YourBaseEventArgs : BaseEventArgs
{
}
class YourEventManager : MonoBehaviour
{
EventPool<YourBaseEventArgs> m_eventPool;
void Awake()
{
m_eventPool = new EventPool<YourBaseEventArgs>(EventPoolMode.AllowNoHandler | EventPoolMode.AllowMultiHandler);
}
void OnDestroy()
{
m_eventPool.Shutdown();
}
void Update()
{
m_eventPool.Update(Time.deltaTime, Time.unscaledDeltaTime);
}
public EventPool<YourBaseEventArgs> EventPool => m_eventPool;
}
public class YourEventArgs1 : YourBaseEventArgs
{
public static int EventId = typeof(YourEventArgs1).GetHashCode();
public override int Id
{
get
{
return EventId;
}
}
public float Duration;
}
class Test : MonoBehaviour
{
public YourEventManager EventManager;
void Start()
{
EventManager.Subscribe(YourEventArgs1.EventId, OnEventFired);
}
void OnDestroy()
{
EventManager.Unsubscribe(YourEventArgs1.EventId, OnEventFired);
}
void OnEventFired(object sender, YourBaseEventArgs e)
{
YourEventArgs1 args = (YourEventArgs1)e;
}
void DoSomething()
{
EventManager.Fire(this, new YourEventArgs1{Duration=5});
}
}
代码分析
EventPool.Subscribe(id, handler)
{
m_EventHandlers.Add(id, handler);
}
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);
}
}
}