原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/youxikaifa/2019/0511/491.html
	前言
	App开发培训游戏开发中抛事情,收事情也是比拟常用的解耦方式,我所了解的设计形式旁观者形式有相似的原理,所以事情系统在一个框架中还是蛮重要的一块,本惹事件系统不算一个大系统,代码量不多,主要是思绪就是注册监听。
	代码
	EventManager
	using GF.Debug;
	using System;
	using System.Collections.Generic;
	using System.Linq;
	using System.Reflection;
	using System.Text;
	namespace GF.EventSystem
	{
	    /// <summary>
	    /// 音讯分发器
	    /// </summary>
	    public class EventManager
	    {
	        private static EventManager instance;
	        public static EventManager Instance
	        {
	            get
	            {
	                if (null == instance)
	                    instance = new EventManager();
	                return instance;
	            }
	            set
	            {
	                instance = value;
	            }
	        }
	        /// <summary>
	        /// 拜托事情
	        /// </summary>
	        /// <typeparam name="T"></typeparam>
	        /// <param name="sender"></param>
	        /// <param name="evt"></param>
	        public delegate void EventHandler<T>(object sender, T evt);
	        /// <summary>
	        /// 注册事情字典
	        /// </summary>
	        public Dictionary<Type, List<object>> handlers = new Dictionary<Type, List<object>>();
	        /// <summary>
	        /// 注册事情
	        /// </summary>
	        /// <typeparam name="T">Class类型</typeparam>
	        /// <param name="handler">函数</param>
	        public void Register<T>(EventHandler<T> handler)
	        {
	            Debugger.Log("注册事情:" + handler.Method.Name);
	            Register(typeof(T), handler);
	        }
	        private void Register<T>(Type EventType, EventHandler<T> handler)
	        {
	            if (!handlers.ContainsKey(EventType))
	            {
	                handlers.Add(EventType, new List<object>());
	            }
	            if (!handlers[EventType].Contains(handler))
	            {
	                handlers[EventType].Add(handler);
	            }
	        }
	        /// <summary>
	        /// 分发事情
	        /// </summary>
	        /// <typeparam name="T"></typeparam>
	        /// <param name="sender"></param>
	        /// <param name="evt"></param>
	        public void Publish<T>(object sender, T evt)
	        {
	            subscribe(null, typeof(T), evt);
	        }
	        /// <summary>
	        /// 发送通知事情
	        /// </summary>
	        /// <typeparam name="T"></typeparam>
	        /// <param name="sender"></param>
	        /// <param name="EventType"></param>
	        /// <param name="evt"></param>
	        private void publish<T>(object sender, Type EventType, T evt)
	        {
	            if (handlers.ContainsKey(EventType))
	            {
	                Debugger.Log("public event key:" + typeof(T));
	                //移除一切的无效事情
	                handlers[EventType].RemoveAll(delegate (object handler) { return handler == null; });
	                for (int i = 0; i < handlers[EventType].Count; i++)
	                {
	                    object handler = handlers[EventType][i];
	                    MethodInfo method = handler.GetType().GetMethod("Invoke");
	                    method.Invoke(handler, new object[] { sender, evt });
	                }
	            }
	            else
	            {
	                Debugger.Log(string.Format("<color=red>未注册的Key:{0}</color>", EventType));
	            }
	        }
	        /// <summary>
	        /// 注销事情
	        /// </summary>
	        /// <typeparam name="T">类型</typeparam>
	        /// <param name="handler">注册函数名</param>
	        public void UnRegister<T>(EventHandler<T> handler)
	        {
	            UnRegister(typeof(T), handler);
	        }
	        private void UnRegister<T>(Type EventType, EventHandler<T> handler)
	        {
	            if (handlers.ContainsKey(EventType))
	            {
	                handlers[EventType].Remove(handler);
	                Debugger.Log("Remove Event:" + handler);
	                if (0 == handlers[EventType].Count)//注册常州网站开发培训事情为空时,移除字典Key
	                {
	                    handlers.Remove(EventType);
	                }
	            }
	        }
	        /// <summary>
	        /// 清空注册事情
	        /// </summary>
	        public void Clear()
	        {
	            handlers.Clear();
	        }
	    }
	}
	运用
	监听音讯
	EventManager.Instance.Register<FishRoundData>(onFrameData);
	取消监听
	EventManager.Instance.UnRegister<FishRoundData>(onFrameData);
	监听音讯回调
	private void onFrameData(object sender, FishRoundData data)
	{
	}
	分发音讯
	EventManager.Instance.Publish<FishRoundData>(this, roundData.Value);
	改良
	我们能够将要监听的事情构造笼统一下,然后每新增一个音讯就直接继承这个基类,这样我们监听音讯回调就是一个统一的办法,然后强转data变成自定义的事情构造。
	事情基类 GFEventArgs
	  /// <summary>
	    /// 游戏框架中包含事情数据的类的基类。
	    /// </summary>
	    public abstract class GFEventArgs : EventArgs
	    {
	        /// <summary>
	        /// 初始化游戏框架中包含事情数据的类的新实例。
	        /// </summary>
	        public GFEventArgs()
	        {
	        }
	    }
	游戏事情基类
	/// <summary>
	    /// 游戏逻辑事情基类。
	    /// </summary>
	    public abstract class GameEventArgs : GFEventArgs
	    {
	    }
	EventManager
	internal sealed class EventManager1
	{
	    private readonly List<GameEventArgs> m_EventPool;
	    public EventManager1()
	    {
	        m_EventPool = new List<GameEventArgs>();
	    }
	    public bool Check(int id, EventHandler<GameEventArgs> handler)
	    {
	        //检查事情
	    }
	    public void Subscribe(int id, EventHandler<GameEventArgs> handler)
	    {
	        //订阅音讯
	    }
	    public void Unsubscribe(int id, EventHandler<GameEventArgs> handler)
	    {
	        //取消订阅企业培训
	    }
	    public void Fire(object sender, GameEventArgs e)
	    {
	        //放入事情响应队列
	    }
	    public void FireNow(object sender, GameEventArgs e)
	    {
	        //立即响应
	    }
	}
	运用
	Event.Subscribe(OpenUIFormSuccessEventArgs.EventId, OnOpenUIFormSuccess);
	private void OnOpenUIFormSuccess(object sender, GameEventArgs e)
	{
	    OpenUIFormSuccessEventArgs ne = (OpenUIFormSuccessEventArgs)e;
	    // 判别userData能否为本人
	    if (ne.UserData != this)
	    {
	        return;
	    }
	    Log.Debug("UI_Menu:祝贺你,胜利地召唤了我。");
	}
上篇:上一篇:Unity+IOS GPS后台更新GPS数据
下篇:下一篇:particle-editor用法




