Unity3D_Util_事件管理

在使用Unity进行开发的过程中,我们总需要响应各种事件,有时一个事件的触发需要我们同时进行几项处理。举个例子:在inputfield中输入的文字要做多个Text上显示,这时候就用到了事件管理了。
 
1,创建一个事件参数接口
  Id为事件的唯一标示,生成后就不能改变
public interface IEventArgs
    {
        /// <summary>
        /// 事件Id。
        /// </summary>
       int Id { get; }
        
    }

2 、创建事件模型

  包含事件的发起者,传递的参数

/// <summary>
    /// 事件模型
    /// </summary>
    internal class EventMode
    {
        private readonly object sender;
        private readonly IEventArgs eventArgs;
        public EventMode(object sender, IEventArgs args)
        {
            this.sender = sender;
            this.eventArgs = args;
        }
        public object Sender
        {
            get { return sender; }
        }
        public IEventArgs EventArgs
        {
            get { return eventArgs; }
        }
    }

3,事件管理类

   

  public class EventManager
    {
        private readonly Dictionary<int, LinkedList<EventHandler<IEventArgs>>> eventHandlers;
        private readonly Queue<EventMode> events;
        public EventManager()
        {
            eventHandlers = new Dictionary<int, LinkedList<EventHandler<IEventArgs>>>();
            events = new Queue<EventMode>();
            //创建定时更新任务
            var updateAgent = FactoryManager.CreatSingtonMonoBehaviour<MonoBehaviourAgent>() as MonoBehaviourAgent;
            updateAgent.UpdateAgentEvent += Update;
        }
        private void Update()
        {
            lock (events)
            {
                while (events.Count > 0)
                {
                    var e = events.Dequeue();
                    HandleEvent(e.Sender, e.EventArgs);
                }
            }
        }
        /// <summary>
        /// 清理事件
        /// </summary>
        public void Shutdown()
        {
            lock (events)
            {
                events.Clear();
            }
            eventHandlers.Clear();
        }
        /// <summary>
        /// 注册事件
        /// </summary>
        /// <param name="id">事件id</param>
        /// <param name="handler">事件处理函数</param>
        public void Subscribe(int id, EventHandler<IEventArgs> handler)
        {
            if (null != handler)
            {
                LinkedList<EventHandler<IEventArgs>> handlers = null;
                if (!eventHandlers.TryGetValue(id, out handlers))
                {
                    handlers = new LinkedList<EventHandler<IEventArgs>>();
                    handlers.AddLast(handler);
                    eventHandlers.Add(id, handlers);
                }
                else
                {
                    handlers.AddLast(handler);
                }
            }
        }
        /// <summary>
        /// 取消注册事件
        /// </summary>
        /// <param name="id">事件id</param>
        /// <param name="handler">事件处理函数</param>
        public void Unsubscribe(int id, EventHandler<IEventArgs> handler)
        {
            if (null != handler)
            {
                LinkedList<EventHandler<IEventArgs>> handlers = null;
                if (eventHandlers.TryGetValue(id, out handlers))
                {
                    handlers.Remove(handler);
                }
            }
        }
        /// <summary>
        ///返回主线程触发执行
        /// </summary>
        /// <param name="sender">事件发起者</param>
        /// <param name="e">参数</param>
        public void FireOnMainThread(object sender, IEventArgs e)
        {
            EventMode eventNode = new EventMode(sender, e);
            lock (events)
            {
                events.Enqueue(eventNode);
            }
        }
        /// <summary>
        /// 立即触发执行
        /// </summary>
        /// <param name="sender">事件发起者</param>
        /// <param name="e">参数</param>
        public void Fire (object sender, IEventArgs e)
        {
            HandleEvent(sender, e);
        }
        /// <summary>
        /// 具体执行函数
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        private void HandleCore(object sender, IEventArgs args)
        {
            int eventId = args.Id;
            LinkedList<EventHandler<IEventArgs>> handlers = null;
            if (eventHandlers.TryGetValue(eventId, out handlers) && handlers.Count > 0)
            {
                LinkedListNode<EventHandler<IEventArgs>> current = handlers.First;
                while (current != null)
                {
                    LinkedListNode<EventHandler<IEventArgs>> next = current.Next;
                    current.Value(sender, args);
                    current = next;
                }
            }
FactoryManager.ClearEventReference(args); } }

 

  

转载于:https://www.cnblogs.com/PandaHome/p/10934130.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值