开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

首页   >   博客   >   均歌

简单小型事件系统(欢迎吐槽)

2018-1-10 10:02
/// <summary>
    /// 事件子系统
    /// </summary>
    public enum EventSystemType
    {
        None
    }

public class EventCenter
    {
        //[事件系统 [事件名称,事件列表]]
        private Dictionary<EventSystemType,Dictionary<string,List<Action>>> m_allEvent;

        public EventCenter()
        {
            m_allEvent = new Dictionary<EventSystemType,Dictionary<string,List<Action>>>();
        }

        /// <summary>
        /// 注册事件
        /// </summary>
        /// <param name="eventSystemType">事件所在系统</param>
        /// <param name="eventType">事件类型名称</param>
        /// <param name="handler">注册的方法</param>
        public void RegEventListener(EventSystemType eventSystemType,string eventType,Action handler)
        {
            if(!m_allEvent.ContainsKey(eventSystemType))
            {
                m_allEvent.Add(eventSystemType,new Dictionary<string,List<Action>>());
            }

            if(!m_allEvent[eventSystemType].ContainsKey(eventType))
            {
                m_allEvent[eventSystemType].Add(eventType,new List<Action>());
            }

            m_allEvent[eventSystemType][eventType].Add(handler);
        }

        /// <summary>
        /// 注销事件
        /// </summary>
        /// <param name="eventSystemType">事件所在系统</param>
        /// <param name="eventType">事件类型</param>
        /// <param name="handler">注销的方法</param>
        public void UnRegEventListener(EventSystemType eventSystemType,string eventType,Action handler)
        {
            if(!CanAddOrRemove(eventSystemType,eventType))
            {
                return;
            }

            List<Action> list = m_allEvent[eventSystemType][eventType];
            for(int i = list.Count - 1; i >= 0; i--)
            {

                if(list[i].GetHashCode() == handler.GetHashCode())
                {
                    list.RemoveAt(i);
                    break;
                }
            }

            if(m_allEvent[eventSystemType][eventType].Count == 0)
            {
                m_allEvent[eventSystemType].Remove(eventType);
                if(m_allEvent[eventSystemType].Count == 0)
                {
                    m_allEvent.Remove(eventSystemType);
                }
            }
        }

        /// <summary>
        /// 触发事件
        /// </summary>
        /// <param name="eventSystemType">事件所在系统</param>
        /// <param name="eventType">事件类型</param>
        public void TriggerEvent(EventSystemType eventSystemType,string eventType)
        {
            if(!CanAddOrRemove(eventSystemType,eventType))
            {
                return;
            }

            List<Action> list = m_allEvent[eventSystemType][eventType];
            for(int i = 0; i < list.Count; i++)
            {
                if(list[i] != null)
                {
                    list[i]();
                }
                else
                {
                    Debug.LogError(string.Format("TriggerEvent {0} error: types of parameters are not match.",eventType));
                }
            }
        }

        /// <summary>
        /// 从某个事件类型系统里面移除某个类型的事件
        /// </summary>
        /// <param name="eventSystemType">事件系统</param>
        /// <param name="eventType">事件类型</param>
        public void RemoveEventTypeInEventSystemType(EventSystemType eventSystemType,string eventType)
        {
            if(!CanAddOrRemove(eventSystemType,eventType))
            {
                return;
            }
            m_allEvent[eventSystemType].Remove(eventType);
        }

        /// <summary>
        /// 移除某个事件系统
        /// </summary>
        /// <param name="eventSystemType"></param>
        public void RemoveEventSystemType(EventSystemType eventSystemType)
        {
            if(!m_allEvent.ContainsKey(eventSystemType))
            {
                Debug.LogError(string.Format("m_allEvent not Contains EventSystemType: {0}",eventSystemType));
                return;
            }
            m_allEvent.Remove(eventSystemType);
        }


        private bool CanAddOrRemove(EventSystemType eventSystemType,string eventType)
        {
            if(!m_allEvent.ContainsKey(eventSystemType))
            {
                Debug.LogError(string.Format("m_allEvent not Contains EventSystemType: {0}",eventSystemType));
                return false;
            }
            if(!m_allEvent[eventSystemType].ContainsKey(eventType))
            {
                Debug.LogError(string.Format("eventSystemType :{0} not contains eventType: {1}",eventSystemType,eventType));
                return false;
            }
            return true;
        }

        public bool ContainsEvent(EventSystemType eventSystemType,string eventType)
        {
            return m_allEvent.ContainsKey(eventSystemType) && m_allEvent[eventSystemType].ContainsKey(eventType);
        }
    }
0 0

作者的其他最新博客

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册帐号
返回顶部