Unity框架学习_EventManager 简单的事件管理 轻松实现全局的事件系统
1、博文介绍
2、内容
(1)声明委托
(2)定义成员方法
(3)完善方法
(4)使用演示
3、推送
4、结语
本篇博主实现了一个简单的事件系统,可以很轻松的实现全局事件的注册和调用,本来博主想要实现一个无论是任何参数或者任何返回值的方法,都可以直接通过方法名注册好自动去解析的一个事件系统,奈何能力有限最后想破头也没写出来,只能做到现在这个样子。
public delegate void EventMgr(params object[] param);
这里根据需要,我们声明一个委托,因为参数可能是不固定的数量,所有这里用了params修饰符,来表示不定数量的参数。
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);//调用
}
在这里我们写一个接口来定义一下我们需要用到的方法
///
/// 存储注册好的事件
///
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值调用事件,可以传入不定数量的参数
//被调用方法
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");
工程源码:https://github.com/KingSun5/Study_EventManager
实现方式很简单,博主后续还会不断地去补充和完善,若是觉得博主的文章写的不错,不妨关注一下博主,点赞一下博文,另博主能力有限,若文中有出现什么错误的地方,欢迎各位评论指摘。
QQ交流群:806091680(Chinar)
该群为CSDN博主Chinar所创,推荐一下!我也在群里!
本文属于原创文章,转载请著名作者出处并置顶!!!!