六、事件管理中心

事件管理中心(观察者设计模式),这个模块能很大程度的减少代码的耦合度,减小代码之间的复杂性,是个非常重要的管理中心。

个人理解是,事件管理中心就是个广播站,他可以增加事件监听,然后当触发时,广播通知给所有监听的方法。如:玩家升级,需要通知给个人信息面板,主界面的玩家信息显示更新等级等等,同时通知给所有监听了这个“玩家升级”这个事件的地方。

  • 框架基础
    EventCenter 事件中心,当前扩展使用,4个参数类型的方法监听,主要分为增加事件监听AddEventListener、触发事件EventTrigger、移除事件监听RemoveEventListener
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;

public class EventCenter : SingletonBase<EventCenter>
{
    //字典中,key对应着事件的名字,
    //value对应的是监听这个事件对应的委托方法集
    private Dictionary<string, IEventFunc> dict_allEvent_zero = new Dictionary<string, IEventFunc>();
    private Dictionary<string, IEventFunc> dict_allEvent_one = new Dictionary<string, IEventFunc>();
    private Dictionary<string, IEventFunc> dict_allEvent_two = new Dictionary<string, IEventFunc>();
    private Dictionary<string, IEventFunc> dict_allEvent_three = new Dictionary<string, IEventFunc>();
    private Dictionary<string, IEventFunc> dict_allEvent_four = new Dictionary<string, IEventFunc>();

    //添加事件监听
    //第一个参数:事件的名字
    //第二个参数:处理事件的方法
    public void AddEventListener(string sName, UnityAction fun_temp) 
    {
        //有没有对应的事件监听
        //有的情况
        if (dict_allEvent_zero.ContainsKey(sName))
        {
            (dict_allEvent_zero[sName] as EventFuncList_Zero).AddEventFun(fun_temp);
        }
        //没有的情况
        else 
        {
            dict_allEvent_zero.Add(sName, new EventFuncList_Zero(fun_temp));
        }
    }

    //添加事件监听
    //第一个参数:事件的名字
    //第二个参数:处理事件的方法
    public void AddEventListener<T>(string sName, UnityAction<T> fun_temp) 
    {
        //有没有对应的事件监听
        //有的情况
        if (dict_allEvent_one.ContainsKey(sName))
        {
            (dict_allEvent_one[sName] as EventFuncList_One<T>).AddEventFun(fun_temp);
        }
        //没有的情况
        else 
        {
            dict_allEvent_one.Add(sName, new EventFuncList_One<T>(fun_temp));
        }
    }

        //添加事件监听
    //第一个参数:事件的名字
    //第二个参数:处理事件的方法
    public void AddEventListener<T0, T1>(string sName, UnityAction<T0, T1> fun_temp) 
    {
        //有没有对应的事件监听
        //有的情况
        if (dict_allEvent_two.ContainsKey(sName))
        {
            (dict_allEvent_two[sName] as EventFuncList_Two<T0, T1>).AddEventFun(fun_temp);
        }
        //没有的情况
        else 
        {
            dict_allEvent_two.Add(sName, new EventFuncList_Two<T0, T1>(fun_temp));
        }
    }

    //添加事件监听
    //第一个参数:事件的名字
    //第二个参数:处理事件的方法
    public void AddEventListener<T0, T1, T2>(string sName, UnityAction<T0, T1, T2> fun_temp) 
    {
        //有没有对应的事件监听
        //有的情况
        if (dict_allEvent_three.ContainsKey(sName))
        {
            (dict_allEvent_three[sName] as EventFuncList_Three<T0, T1, T2>).AddEventFun(fun_temp);
        }
        //没有的情况
        else 
        {
            dict_allEvent_three.Add(sName, new EventFuncList_Three<T0, T1, T2>(fun_temp));
        }
    }

    //添加事件监听
    //第一个参数:事件的名字
    //第二个参数:处理事件的方法
    public void AddEventListener<T0, T1, T2, T3>(string sName, UnityAction<T0, T1, T2, T3> fun_temp) 
    {
        //有没有对应的事件监听
        //有的情况
        if (dict_allEvent_four.ContainsKey(sName))
        {
            (dict_allEvent_four[sName] as EventFuncList_Four<T0, T1, T2, T3>).AddEventFun(fun_temp);
        }
        //没有的情况
        else 
        {
            dict_allEvent_four.Add(sName, new EventFuncList_Four<T0, T1, T2, T3>(fun_temp));
        }
    }

    /// <summary>
    /// 通过事件名字进行事件触发
    /// </summary>
    /// <param name="sName"></param>
    public void EventTrigger(string sName) 
    {
        //有没有对应的事件监听
        //有的情况(有人关心这个事件)
        if (dict_allEvent_zero.ContainsKey(sName))
        {
            //调用委托(依次执行委托中的方法)
            (dict_allEvent_zero[sName] as EventFuncList_Zero).Trigger();
        }
    }

    /// <summary>
    /// 通过事件名字进行事件触发
    /// </summary>
    /// <param name="sName"></param>
    public void EventTrigger<T>(string sName, T obj_temp) 
    {
        //有没有对应的事件监听
        //有的情况(有人关心这个事件)
        if (dict_allEvent_one.ContainsKey(sName))
        {
            //调用委托(依次执行委托中的方法)
            (dict_allEvent_one[sName] as EventFuncList_One<T>).Trigger(obj_temp);
        }
    }

    /// <summary>
    /// 通过事件名字进行事件触发
    /// </summary>
    /// <param name="sName"></param>
    public void EventTrigger<T0, T1>(string sName, T0 obj_temp1, T1 obj_temp2) 
    {
        //有没有对应的事件监听
        //有的情况(有人关心这个事件)
        if (dict_allEvent_two.ContainsKey(sName))
        {
            //调用委托(依次执行委托中的方法)
            (dict_allEvent_two[sName] as EventFuncList_Two<T0, T1>).Trigger(obj_temp1, obj_temp2);
        }
    }

    /// <summary>
    /// 通过事件名字进行事件触发
    /// </summary>
    /// <param name="sName"></param>
    public void EventTrigger<T0, T1, T2>(string sName, T0 obj_temp1, T1 obj_temp2, T2 obj_temp3) 
    {
        //有没有对应的事件监听
        //有的情况(有人关心这个事件)
        if (dict_allEvent_three.ContainsKey(sName))
        {
            //调用委托(依次执行委托中的方法)
            (dict_allEvent_three[sName] as EventFuncList_Three<T0, T1, T2>).Trigger(obj_temp1, obj_temp2, obj_temp3);
        }
    }

    /// <summary>
    /// 通过事件名字进行事件触发
    /// </summary>
    /// <param name="sName"></param>
    public void EventTrigger<T0, T1, T2, T3>(string sName, T0 obj_temp1, T1 obj_temp2, T2 obj_temp3, T3 obj_temp4) 
    {
        //有没有对应的事件监听
        //有的情况(有人关心这个事件)
        if (dict_allEvent_four.ContainsKey(sName))
        {
            //调用委托(依次执行委托中的方法)
            (dict_allEvent_four[sName] as EventFuncList_Four<T0, T1, T2, T3>).Trigger(obj_temp1, obj_temp2, obj_temp3, obj_temp4);
        }
    }

    /// <summary>
    /// 移除对应的事件监听
    /// </summary>
    /// <param name="sName"></param>
    /// <param name="fun_temp"></param>
    public void RemoveEventListener(string sName, UnityAction fun_temp) 
    {
        if (dict_allEvent_zero.ContainsKey(sName))
        {
            //移除这个委托
            (dict_allEvent_zero[sName] as EventFuncList_Zero).RemoveEventFun(fun_temp);
        }
    }

    /// <summary>
    /// 移除对应的事件监听
    /// </summary>
    /// <param name="sName"></param>
    /// <param name="fun_temp"></param>
    public void RemoveEventListener<T>(string sName, UnityAction<T> fun_temp) 
    {
        if (dict_allEvent_one.ContainsKey(sName))
        {
            //移除这个委托
            (dict_allEvent_one[sName] as EventFuncList_One<T>).RemoveEventFun(fun_temp);
        }
    }

        /// <summary>
    /// 移除对应的事件监听
    /// </summary>
    /// <param name="sName"></param>
    /// <param name="fun_temp"></param>
    public void RemoveEventListener<T0, T1>(string sName, UnityAction<T0, T1> fun_temp) 
    {
        if (dict_allEvent_two.ContainsKey(sName))
        {
            //移除这个委托
            (dict_allEvent_two[sName] as EventFuncList_Two<T0, T1>).RemoveEventFun(fun_temp);
        }
    }

        /// <summary>
    /// 移除对应的事件监听
    /// </summary>
    /// <param name="sName"></param>
    /// <param name="fun_temp"></param>
    public void RemoveEventListener<T0, T1, T2>(string sName, UnityAction<T0, T1, T2> fun_temp) 
    {
        if (dict_allEvent_three.ContainsKey(sName))
        {
            //移除这个委托
            (dict_allEvent_three[sName] as EventFuncList_Three<T0, T1, T2>).RemoveEventFun(fun_temp);
        }
    }

    /// <summary>
    /// 移除对应的事件监听
    /// </summary>
    /// <param name="sName"></param>
    /// <param name="fun_temp"></param>
    public void RemoveEventListener<T0, T1, T2, T3>(string sName, UnityAction<T0, T1, T2, T3> fun_temp) 
    {
        if (dict_allEvent_four.ContainsKey(sName))
        {
            //移除这个委托
            (dict_allEvent_four[sName] as EventFuncList_Four<T0, T1, T2, T3>).RemoveEventFun(fun_temp);
        }
    }

    /// <summary>
    /// 清空所有事件监听(主要用在切换场景时)
    /// </summary>
    public void Clear() 
    {
        dict_allEvent_zero.Clear();
        dict_allEvent_one.Clear();
        dict_allEvent_two.Clear();
        dict_allEvent_three.Clear();
        dict_allEvent_four.Clear();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值