| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206 | 
							- using System;
 
- using System.Collections;
 
- using System.Collections.Generic;
 
- using UnityEngine;
 
- namespace UniFramework.Event
 
- {
 
- 	public static class UniEvent
 
- 	{
 
- 		private class PostWrapper
 
- 		{
 
- 			public int PostFrame;
 
- 			public int EventID;
 
- 			public IEventMessage Message;
 
- 			public void OnRelease()
 
- 			{
 
- 				PostFrame = 0;
 
- 				EventID = 0;
 
- 				Message = null;
 
- 			}
 
- 		}
 
- 		private static bool _isInitialize = false;
 
- 		private static GameObject _driver = null;
 
- 		private static readonly Dictionary<int, LinkedList<Action<IEventMessage>>> _listeners = new Dictionary<int, LinkedList<Action<IEventMessage>>>(1000);
 
- 		private static readonly List<PostWrapper> _postingList = new List<PostWrapper>(1000);
 
- 		/// <summary>
 
- 		/// 初始化事件系统
 
- 		/// </summary>
 
- 		public static void Initalize()
 
- 		{
 
- 			if (_isInitialize)
 
- 				throw new Exception($"{nameof(UniEvent)} is initialized !");
 
- 			if (_isInitialize == false)
 
- 			{
 
- 				// 创建驱动器
 
- 				_isInitialize = true;
 
- 				_driver = new UnityEngine.GameObject($"[{nameof(UniEvent)}]");
 
- 				_driver.AddComponent<UniEventDriver>();
 
- 				UnityEngine.Object.DontDestroyOnLoad(_driver);
 
- 				UniLogger.Log($"{nameof(UniEvent)} initalize !");
 
- 			}
 
- 		}
 
- 		/// <summary>
 
- 		/// 销毁事件系统
 
- 		/// </summary>
 
- 		public static void Destroy()
 
- 		{
 
- 			if (_isInitialize)
 
- 			{
 
- 				ClearAll();
 
- 				_isInitialize = false;
 
- 				if (_driver != null)
 
- 					GameObject.Destroy(_driver);
 
- 				UniLogger.Log($"{nameof(UniEvent)} destroy all !");
 
- 			}
 
- 		}
 
- 		/// <summary>
 
- 		/// 更新事件系统
 
- 		/// </summary>
 
- 		internal static void Update()
 
- 		{
 
- 			for (int i = _postingList.Count - 1; i >= 0; i--)
 
- 			{
 
- 				var wrapper = _postingList[i];
 
- 				if (UnityEngine.Time.frameCount > wrapper.PostFrame)
 
- 				{
 
- 					SendMessage(wrapper.EventID, wrapper.Message);
 
- 					_postingList.RemoveAt(i);
 
- 				}
 
- 			}
 
- 		}
 
- 		/// <summary>
 
- 		/// 清空所有监听
 
- 		/// </summary>
 
- 		public static void ClearAll()
 
- 		{
 
- 			foreach (int eventId in _listeners.Keys)
 
- 			{
 
- 				_listeners[eventId].Clear();
 
- 			}
 
- 			_listeners.Clear();
 
- 			_postingList.Clear();
 
- 		}
 
- 		/// <summary>
 
- 		/// 添加监听
 
- 		/// </summary>
 
- 		public static void AddListener<TEvent>(System.Action<IEventMessage> listener) where TEvent : IEventMessage
 
- 		{
 
- 			System.Type eventType = typeof(TEvent);
 
- 			int eventId = eventType.GetHashCode();
 
- 			AddListener(eventId, listener);
 
- 		}
 
- 		/// <summary>
 
- 		/// 添加监听
 
- 		/// </summary>
 
- 		public static void AddListener(System.Type eventType, System.Action<IEventMessage> listener)
 
- 		{
 
- 			int eventId = eventType.GetHashCode();
 
- 			AddListener(eventId, listener);
 
- 		}
 
- 		/// <summary>
 
- 		/// 添加监听
 
- 		/// </summary>
 
- 		public static void AddListener(int eventId, System.Action<IEventMessage> listener)
 
- 		{
 
- 			if (_listeners.ContainsKey(eventId) == false)
 
- 				_listeners.Add(eventId, new LinkedList<Action<IEventMessage>>());
 
- 			if (_listeners[eventId].Contains(listener) == false)
 
- 				_listeners[eventId].AddLast(listener);
 
- 		}
 
- 		/// <summary>
 
- 		/// 移除监听
 
- 		/// </summary>
 
- 		public static void RemoveListener<TEvent>(System.Action<IEventMessage> listener) where TEvent : IEventMessage
 
- 		{
 
- 			System.Type eventType = typeof(TEvent);
 
- 			int eventId = eventType.GetHashCode();
 
- 			RemoveListener(eventId, listener);
 
- 		}
 
- 		/// <summary>
 
- 		/// 移除监听
 
- 		/// </summary>
 
- 		public static void RemoveListener(System.Type eventType, System.Action<IEventMessage> listener)
 
- 		{
 
- 			int eventId = eventType.GetHashCode();
 
- 			RemoveListener(eventId, listener);
 
- 		}
 
- 		/// <summary>
 
- 		/// 移除监听
 
- 		/// </summary>
 
- 		public static void RemoveListener(int eventId, System.Action<IEventMessage> listener)
 
- 		{
 
- 			if (_listeners.ContainsKey(eventId))
 
- 			{
 
- 				if (_listeners[eventId].Contains(listener))
 
- 					_listeners[eventId].Remove(listener);
 
- 			}
 
- 		}
 
- 		/// <summary>
 
- 		/// 实时广播事件
 
- 		/// </summary>
 
- 		public static void SendMessage(IEventMessage message)
 
- 		{
 
- 			int eventId = message.GetType().GetHashCode();
 
- 			SendMessage(eventId, message);
 
- 		}
 
- 		/// <summary>
 
- 		/// 实时广播事件
 
- 		/// </summary>
 
- 		public static void SendMessage(int eventId, IEventMessage message)
 
- 		{
 
- 			if (_listeners.ContainsKey(eventId) == false)
 
- 				return;
 
- 			LinkedList<Action<IEventMessage>> listeners = _listeners[eventId];
 
- 			if (listeners.Count > 0)
 
- 			{
 
- 				var currentNode = listeners.Last;
 
- 				while (currentNode != null)
 
- 				{
 
- 					currentNode.Value.Invoke(message);
 
- 					currentNode = currentNode.Previous;
 
- 				}
 
- 			}
 
- 		}
 
- 		/// <summary>
 
- 		/// 延迟广播事件
 
- 		/// </summary>
 
- 		public static void PostMessage(IEventMessage message)
 
- 		{
 
- 			int eventId = message.GetType().GetHashCode();
 
- 			PostMessage(eventId, message);
 
- 		}
 
- 		/// <summary>
 
- 		/// 延迟广播事件
 
- 		/// </summary>
 
- 		public static void PostMessage(int eventId, IEventMessage message)
 
- 		{
 
- 			var wrapper = new PostWrapper();
 
- 			wrapper.PostFrame = UnityEngine.Time.frameCount;
 
- 			wrapper.EventID = eventId;
 
- 			wrapper.Message = message;
 
- 			_postingList.Add(wrapper);
 
- 		}
 
- 	}
 
- }
 
 
  |