Unity框架学习_EventManager,简单的事件管理,轻松实现全局的事件系统

                     Unity框架学习_EventManager 简单的事件管理 轻松实现全局的事件系统


目录

1、博文介绍

2、内容

(1)声明委托

(2)定义成员方法

(3)完善方法

(4)使用演示

3、推送

4、结语


1、博文介绍

       本篇博主实现了一个简单的事件系统,可以很轻松的实现全局事件的注册和调用,本来博主想要实现一个无论是任何参数或者任何返回值的方法,都可以直接通过方法名注册好自动去解析的一个事件系统,奈何能力有限最后想破头也没写出来,只能做到现在这个样子。


2、内容

(1)声明委托

public delegate void EventMgr(params object[] param);

       这里根据需要,我们声明一个委托,因为参数可能是不固定的数量,所有这里用了params修饰符,来表示不定数量的参数。

(2)定义成员方法

public interface IEventMgr
{
    void Register(int key, EventMgr eventMgr);//注册事件

    void UnRegister(int key);//解绑事件

    void ClearAll();//解绑所有事件

    bool IsRegisterName(int key);//key值是否被注册

    bool IsRegisterFunc(EventMgr eventMgr);//eventMgr是否被注册

    void Invoke(int key, params object[] param);//调用
}

在这里我们写一个接口来定义一下我们需要用到的方法

(3)完善方法

    /// 
    /// 存储注册好的事件
    /// 
    protected readonly Dictionary EventListerDict = new Dictionary();

声明字典:这个字典储存了所有我们注册好的事件和事件对应的key值

    /// 
    /// 是否暂停所有的事件
    /// 
    public bool IsPause = false;

声明bool值:IsPause用来暂停所有的事件调用

    public void Register(int key, EventMgr eventMgr)
    {
        if (EventListerDict.ContainsKey(key))
        {
            Debug.LogError("Key:"+key +"已存在!");
        }
        else
        {
            EventListerDict.Add(key,eventMgr);
        }
    }

注册事件:我们将绑定好方法的委托eventMgr和其对应的key添加到字典当中

    public void UnRegister(int key)
    {
        if (EventListerDict!=null&&EventListerDict.ContainsKey(key))
        {
            EventListerDict.Remove(key);
            Debug.Log("移除事件:"+key);
        }
        else
        {
            Debug.LogError("Key:"+key +"不存在!");
        }
    }

解绑事件:将注册好的事件从字典中移除

    public  void ClearAll()
    {
        if (EventListerDict!=null)
        {
            EventListerDict.Clear();
            Debug.Log("清空注册事件!");
        }
    }

清空事件:解绑所有的事件、

   public bool IsRegisterName(int key)
    {
        if (EventListerDict!=null&&EventListerDict.ContainsKey(key))
        {
            EventListerDict.Remove(key);
            Debug.Log("事件:"+key +"已注册!");
            return true;
        }
        Debug.Log("事件:"+key +"未注册!");
        return false;
    }

判断key值是否注册过:判断key值是否已注册,返回bool值

    public bool IsRegisterFunc(EventMgr eventMgr)
    {
        if (EventListerDict!=null&&EventListerDict.ContainsValue(eventMgr))
        {
            Debug.Log("事件已注册!");
            return true;
        }
        Debug.Log("事件未注册!");
        return false;
    }

判断方法是否注册过:判断eventMgr是否注册过,返回bool值

    public void Invoke(int key,params object[] param)
    {
        if (!IsPause)
        {
            if (EventListerDict.ContainsKey(key))
            {
                EventListerDict[key].Invoke(param);
            }
            else
            {
                Debug.LogError("事件:"+key +"未注册!");
            }
        }
        else
        {
            Debug.LogError("所有事件已暂停!"); 
        }
    }

调用事件:通过Key值调用事件,可以传入不定数量的参数

(4)使用演示

    //被调用方法
    public void TestFunc(params object[] param)
    {
	for (int i = 0; i < param.Length; i++)
	{
	    print(param[i]);
	}
    }
    
    //注册事件 key值为1
    EventManager.Instance.Register(1,TestFunc);

    //调用key为1的事件 传入参数 1 和 “abc”
    EventManager.Instance.Invoke(1,1,"abc");

3、推送

工程源码:https://github.com/KingSun5/Study_EventManager


4、结语

       实现方式很简单,博主后续还会不断地去补充和完善,若是觉得博主的文章写的不错,不妨关注一下博主,点赞一下博文,另博主能力有限,若文中有出现什么错误的地方,欢迎各位评论指摘。

       QQ交流群:806091680(Chinar)

       该群为CSDN博主Chinar所创,推荐一下!我也在群里!

       本文属于原创文章,转载请著名作者出处并置顶!!!!

你可能感兴趣的:(框架学习)