Unity 消息类事件类实现

这个实现是用于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);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值