这个实现是用于ECS的实现,具体项目还要有所更改
1. 先定义装消息的容器
GameEventArgs.cs
// 系统消息
public abstract class GameEventArgs : EventArgs { }
// 带Entity消息
public abstract class EntityEventArgs : GameEventArgs
{
public Entity Entity = Entity.Null;
}
// 例子1
public class MoveInputEventArgs : GameEventArgs
{
public static readonly int Id = typeof(MoveInputEventArgs).GetHashCode();
public Vector3 Value;
}
//例子2
public class NoticeUIEventArgs : EntityEventArgs
{
public enum NoticeType
{
LackOfBullet,
Cooling,
Skill1Cooled,
Skill2Cooled
}
public NoticeType Type;
public static readonly int Id = typeof(NoticeUIEventArgs).GetHashCode();
}
2. 消息管理类
EventManager.cs
public sealed class EventManager : Singleton<EventManager>
{
private Dictionary<int, EventHandler<GameEventArgs>> m_EventHandlers;
public override void Initialize()
{
m_EventHandlers = new Dictionary<int, EventHandler<GameEventArgs>>();
}
public override void Destroy()
{
}
// 注册事件
public void Subscribe(int id, EventHandler<GameEventArgs> handler)
{
if (m_EventHandlers.ContainsKey(id))
{
m_EventHandlers[id] += handler;
}
else
{
m_EventHandlers.Add(id, handler);
}
}
// 注销事件
public void Unsubscribe(int id, EventHandler<GameEventArgs> handler)
{
if (m_EventHandlers.ContainsKey(id) && m_EventHandlers[id] != null)
{
m_EventHandlers[id] -= handler;
}
}
// 调用事件
public void Invoke(int id, object sender, GameEventArgs args)
{
if (m_EventHandlers.ContainsKey(id) && m_EventHandlers[id] != null)
{
m_EventHandlers[id](sender, args);
}
}
}
3. 具体调用
...
...
// 在需要注册的地方注册
public override void Initialize()
{
EventManager.Instance.Subscribe(NoticeUIEventArgs.Id, PopUpLessAmmunitionTips);
}
...
// 绑定的事件
private void PopUpLessAmmunitionTips(object sender, GameEventArgs e)
{
var eventArgs = e as NoticeUIEventArgs;
// 判断是那个Entity发送的消息 如果不是就return(如果是系统消息就不用加这个了)
if (eventArgs.Entity == Entity.Null ||
eventArgs.Entity != LocalPlayer.Instance.PlayerEntity)
{
return;
}
switch (eventArgs.Type)
{
case NoticeUIEventArgs.NoticeType.LackOfBullet:
DoSomething...
break;
case NoticeUIEventArgs.NoticeType.Cooling:
DoSomething...
break;
case NoticeUIEventArgs.NoticeType.Skill1Cooled:
DoSomething...
break;
case NoticeUIEventArgs.NoticeType.Skill2Cooled:
DoSomething...
break;
default:
break;
}
}
DoSomething...
// 最后别忘了注销事件
public override void Destory()
{
EventManager.Instance.Unsubscribe(NoticeUIEventArgs.Id, PopUpLessAmmunitionTips);
}