Unity事件中心Event Center

  • 事件中心支持的用法

  1. 简单发送事件:
    EgoEventCenter.PostEvent("Test");
  2. 发送string类型事件:
    EgoEventCenter.PostEvent("Test","data");
  3. 发送多个参数事件:
    EgoEventCenter.PostEvent("Test", 1, 2f);
  4. 监听事件:
    EgoEventCenter.AddListener("Test",OnTestHandle);
  5. 监听带参数的事件:
    EgoEventCenter.AddListener("Test",OnTestHandle);
  6. 移除事件:
    EgoEventCenter.RemoveListener("Test",OnTestHandle);
  7. 移除所有监听事件:
    EgoEventCenter.RemoveEvent("Test");
  8. 移除事件中心的所有事件:
    EgoEventCenter.RemoveAllEvent();
  • 事件中心的作用

正常情况我们调用一个类里面的方法,一般都是访问类,然后调用里面的方法,比如

public class TestClass
{
    public void Excute()
    {
        
    }
}

void Test()
{
    TestClass test=new TestClass();
    test.Excute();
}

如果使用事件中心的话,就变成了

public class TestClass
{
    public TestClass()
    {
        EgoEventCenter.AddListener("Test",Excute);
    }
    
    public void Excute()
    {
        Debug.Log("执行了!");
    }
}

void Test()
{
    //TestClass test=new TestClass();
    //test.Excute();
    EgoEventCenter.PostEvent("Test");
}

这样的好处就是,减少了耦合, 要执行TestClass的函数,就不用对TestClass产生了依赖,如果TestClass变成了别的逻辑,只要他监听了事件中心的事件,程序就不会有任何的逻辑问题。这样带来的好处程序更加容易维护。

  • 如何实现事件中心

#region 文件信息

/***************************************
** 文件名:	EgoEventCenter
** 版  权:	(C) egogame 
** 创建人:	鱼蛋
** 日  期:	2020.07
** 描  述:	事件中心
***************************************/
#endregion

using System;
using System.Collections.Generic;

public static class EgoEventCenter{
	public delegate void EventHandle();
	public delegate void EventHandle(T value);
	public delegate void EventHandle(T1 value1,T2 value2);
	public delegate void EventHandle(T1 value1,T2 value2,T3 value3);
	static Dictionary eventHandles;

	/// 
	/// 发送事件
	/// 
	/// 事件名
	[Obsolete("已过时,请使用PostEvent函数")]
	public static void SendEvent(string eventName)
	{
		PostEvent(eventName);
	}

	/// 
	/// 发送事件
	/// 
	/// 事件名
	/// 数据
	[Obsolete("已过时,请使用PostEvent函数")]
	public static void SendEvent(string eventName,object value)
	{
		PostEvent(eventName, value);
	}
	
	/// 
	/// 发送事件
	/// 
	/// 事件名
	public static void PostEvent(string eventName){
		if (eventHandles == null) return;
		Delegate d;
		if (eventHandles.TryGetValue(eventName, out d))
		{
			if (d == null) return;
			EventHandle call = d as EventHandle;
			if (call != null)
			{
				call();
			}
			else if (d is EventHandle)
			{
				//兼容之前旧版本EgoEventCenter逻辑
				EventHandle call2 = d as EventHandle;
				call2(null);
			}
			else
			{
				throw new Exception(string.Format("事件{0}包含着不同类型的委托", eventName));
			}
		}
	}
	
	/// 
	/// 发送事件
	/// 
	/// 
	/// 
	/// 
	public static void PostEvent(string eventName,T value)
	{
		if (eventHandles == null) return;
		Delegate d;
		if (eventHandles.TryGetValue(eventName, out d))
		{
			if (d == null) return;
			EventHandle call = d as EventHandle;
			if (call != null)
			{
				call(value);
			}
			else
			{
				throw new Exception(string.Format("事件{0}包含着不同类型的委托{1}", eventName, d.GetType()));
			}
		}
	}

	/// 
	/// 发送事件
	/// 
	/// 
	/// 
	/// 
	/// 
	/// 
	public static void PostEvent(string eventName,T1 value1,T2 value2)
	{
		if (eventHandles == null) return;
		Delegate d;
		if (eventHandles.TryGetValue(eventName, out d))
		{
			if (d == null) return;
			EventHandle call = d as EventHandle;
			if (call != null)
			{
				call(value1, value2);
			}
			else
			{
				throw new Exception(string.Format("事件{0}包含着不同类型的委托{1}", eventName, d.GetType()));
			}
		}
	}

	/// 
	/// 发送事件
	/// 
	/// 
	/// 
	/// 
	/// 
	/// 
	/// 
	/// 
	public static void PostEvent(string eventName,T1 value1,T2 value2,T3 value3)
	{
		if (eventHandles == null) return;
		Delegate d;
		if (eventHandles.TryGetValue(eventName, out d))
		{
			if (d == null) return;
			EventHandle call = d as EventHandle;
			if (call != null)
			{
				call(value1, value2, value3);
			}
			else
			{
				throw new Exception(string.Format("事件{0}包含着不同类型的委托{1}", eventName, d.GetType()));
			}
		}
	}
	
	/// 
	/// 监听事件
	/// 
	/// 事件名
	/// 回调
	public static void AddListener(string eventName,EventHandle handle){
		OnListeningAdd(eventName, handle);
		eventHandles[eventName] = (EventHandle) eventHandles[eventName] + handle;
	}

	/// 
	/// 监听事件
	/// 
	/// 事件名
	/// 回调
	public static void AddListener(string eventName,EventHandle handle){
		OnListeningAdd(eventName, handle);
		eventHandles[eventName] = (EventHandle) eventHandles[eventName] + handle;
	}

	/// 
	/// 监听事件
	/// 
	/// 
	/// 
	/// 
	public static void AddListener(string eventName, EventHandle handle)
	{
		OnListeningAdd(eventName, handle);
		eventHandles[eventName] = (EventHandle) eventHandles[eventName] + handle;
	}

	/// 
	/// 监听事件
	/// 
	/// 
	/// 
	/// 
	/// 
	public static void AddListener(string eventName, EventHandle handle)
	{
		OnListeningAdd(eventName, handle);
		eventHandles[eventName] = (EventHandle) eventHandles[eventName] + handle;
	}

	/// 
	/// 监听事件
	/// 
	/// 
	/// 
	/// 
	/// 
	/// 
	public static void AddListener(string eventName, EventHandle handle)
	{
		OnListeningAdd(eventName, handle);
		eventHandles[eventName] = (EventHandle) eventHandles[eventName] + handle;
	}
	
	/// 
	/// 移除事件监听
	/// 
	/// 事件名
	/// 回调
	[Obsolete("已过时,请使用RemoveListener函数")]
	public static void RemoveHandle(string eventName,EventHandle handle)
	{
		RemoveListener(eventName, handle);
	}
	
	/// 
	/// 移除事件监听
	/// 
	/// 事件名
	/// 回调
	[Obsolete("已过时,请使用RemoveListener函数")]
	public static void RemoveHandle(string eventName,EventHandle handle)
	{
		RemoveListener(eventName, handle);
	}

	/// 
	/// 移除事件监听
	/// 
	/// 事件名
	/// 回调
	public static void RemoveListener(string eventName,EventHandle handle){
		if (eventHandles == null) {
			return;
		}
		if (!eventHandles.ContainsKey(eventName)) return;
		OnListeningRemove(eventName, handle);
		eventHandles[eventName] = (EventHandle)eventHandles[eventName] - handle;
	}
	
	/// 
	/// 移除事件监听
	/// 
	/// 事件名
	/// 回调
	public static void RemoveListener(string eventName,EventHandle handle)
	{
		RemoveListener(eventName, handle);
	}

	/// 
	/// 移除事件监听
	/// 
	/// 事件名
	/// 
	public static void RemoveListener(string eventName,EventHandle handle){
		if (eventHandles == null) {
			return;
		}
		if (!eventHandles.ContainsKey(eventName)) return;
		OnListeningRemove(eventName, handle);
		eventHandles[eventName] = (EventHandle)eventHandles[eventName] - handle;
	}
	
	/// 
	/// 移除事件监听
	/// 
	/// 事件名
	/// 
	public static void RemoveListener(string eventName,EventHandle handle){
		if (eventHandles == null) {
			return;
		}
		if (!eventHandles.ContainsKey(eventName)) return;
		OnListeningRemove(eventName, handle);
		eventHandles[eventName] = (EventHandle)eventHandles[eventName] - handle;
	}
	
	/// 
	/// 移除事件监听
	/// 
	/// 事件名
	/// 
	public static void RemoveListener(string eventName,EventHandle handle){
		if (eventHandles == null) {
			return;
		}
		if (!eventHandles.ContainsKey(eventName)) return;
		OnListeningRemove(eventName, handle);
		eventHandles[eventName] = (EventHandle)eventHandles[eventName] - handle;
	}
	
	/// 
	/// 移除事件
	/// 
	/// 
	public static void RemoveEvent(string eventName)
	{
		Internal_RemoveEvent(eventName, true);
	}
	
	static void Internal_RemoveEvent(string eventName,bool removeFromDic)
	{
		if (eventHandles == null) {
			return;
		}
		if (eventHandles.ContainsKey(eventName))
		{
			var callback = eventHandles[eventName];
			Delegate[] invokeList = callback.GetInvocationList();
			foreach (var invokeItem in invokeList)
			{
				Delegate.Remove(callback, invokeItem);
			}

			if(removeFromDic) eventHandles.Remove(eventName);
		}
	}
	
	static void OnListeningAdd(string eventName, Delegate callback)
	{
		if (eventHandles == null)
			eventHandles = new Dictionary ();
		if (!eventHandles.ContainsKey(eventName))
		{
			eventHandles.Add(eventName, null);
		}
		Delegate d = eventHandles[eventName];
		if (d != null && d.GetType() != callback.GetType())
		{
			throw new Exception(string.Format("尝试添加两种不同类型的委托,委托1为{0},委托2为{1}", d.GetType(), callback.GetType()));
		}
	}

	static void OnListeningRemove(string eventName, Delegate callback)
	{
		if (eventHandles.ContainsKey(eventName))
		{
			Delegate d = eventHandles[eventName];
			if (d!=null && d.GetType() != callback.GetType())
			{
				throw new Exception(string.Format("尝试移除不同类型的事件,事件名{0},已存储的委托类型{1},当前事件委托{2}", eventName, d.GetType(), callback.GetType()));
			}
		}
		else
		{
			throw new Exception(string.Format("没有事件名{0}", eventName));
		}
	}

	/// 
	/// 移除所有事件
	/// 
	public static void RemoveAllEvent()
	{
		if (eventHandles==null)
		{
			return;
		}
		foreach (var keyValuePair in eventHandles)
		{
			Internal_RemoveEvent(keyValuePair.Key, false);
		}
		eventHandles.Clear();
	}
}
 
  

整个类附上,直接按上面的用法就行。完全原创,请珍惜我掉的头发...

你可能感兴趣的:(unity3d,游戏开发踩坑记录,unity小技巧)