本文参考:https://blog.csdn.net/z625309640/article/details/80547877
代码在文末,直接复制到你的工程中,就可以使用
目录
因为这个简单的事件管理器在我完成某项作业时帮了我很大的忙,所以特地记录下;
该事件系统是基于UnityEvent实现的,在应对小型工程时还是游刃有余的,可以说是解耦利器,如果你是unity初学者的话,可以试一试这个事件系统。原博客只给出了代码,我这边就稍微扩展一下
一、UnityEvent
UnityEvent有三个公共方法,官网截图如下:
分别是:
将监听函数添加UnityEvent;
触发调用已注册的监听函数(回调函数)
删除监听
在代码量较少的情况下,直接使用是没有什么问题,但是一旦代码数量变大,工程中的模块变多,就会显得很混乱,这个时候就有必要对其进行封装
二、本事件系统主要原理
这个事件系统主要通过一个字典将抽象的事件和具体的回调函数联系在一起,我们可以这样定义这个字典:
private Dictionary<Enum, UnityEvent> eventDictionary = new Dictionary<Enum, UnityEvent>();
对于字典的值:如果UnityEvent想要带有参数,可以在上面代码的基础上,将UnityEvent改为UnityEvent<T>,由于事先不知道传的参数类型,可以直接定义为object类型,即UnityEvent<Object>;
或者还想加入其他的一些操作,可以创建一个新类,继承至UnityEvent,可以将上面的代码改为:
private class EventMode:UnityEvent<object>
{
}
private Dictionary<Enum, EventMode> m_eventDictionary = new Dictionary<Enum, EventMode>();
对于字典的键:定义为System.Enum,它是一个抽象类,在c#中,所有的枚举类都继承自它。因此,可以在一个文件中专门定义不同操作的枚举类,在本文后面的实例演示中,就可看到用这个抽象类做字典的键的好处,最终可以实现枚举类中的某一个值与其对应的事件进行绑定,并存放在字典中,这样的功能;
三、单例模式
在正式通过代码实现这个事件系统时,我们还要考虑,对于这个事件系统,我们是不是只希望在整个游戏中只有一个实例,并持久化的存在,如果是的话,我们可以使用单例模式:
/// <summary>
/// 单例模式
/// </summary>
private static LiteEventManager instance;
public static LiteEventManager Instance
{
get
{
if(instance == null)
{