Unity事件管理类,用于不同对象之间传递消息
2017-03-11 14:19
204 查看
这个类在写完后,测试的过程中遇到过异常(界面类已经销毁,但回调还能执行的BUG!)。
当然后面修复了,就是“if“后面一串“||”。
这个类可以再扩展一点,不使用字符串做键值。
using System;
using System.Collections.Generic;
// Editor: 760736077@qq.com
public delegate void UIEventFun(object param);
public class UIEventManager : Singleton<UIEventManager> {
Dictionary<string, List<UIEventFun>> dic = new Dictionary<string, List<UIEventFun>>();
public void Register(string key, UIEventFun fun)
{
if(dic.ContainsKey(key))
{
dic[key].Add(fun);
}
else
{
List<UIEventFun> lstFun = new List<UIEventFun>();
lstFun.Add(fun);
dic[key] = lstFun;
}
}
public void UnRegister(string key, UIEventFun fun)
{
if(dic.ContainsKey(key))
{
dic[key].Remove(fun);
if (dic[key].Count == 0)
{
dic.Remove(key);
}
}
}
public void Dispatch(string key, object param)
{
try
{
if (dic.ContainsKey(key))
{
for (int i = dic[key].Count - 1; i >= 0; --i)
{
if (dic[key][i] == null || dic[key][i].Target == null || ((dic[key][i].Target is UnityEngine.Object) && dic[key][i].Target.Equals(null)))
{
dic[key].RemoveAt(i);
continue;
}
dic[key][i](param);
}
}
}
catch (Exception e)
{
uLog.LogError(uLog.uException, "Event Error: " + e.ToString());
}
}
}
当然后面修复了,就是“if“后面一串“||”。
这个类可以再扩展一点,不使用字符串做键值。
using System;
using System.Collections.Generic;
// Editor: 760736077@qq.com
public delegate void UIEventFun(object param);
public class UIEventManager : Singleton<UIEventManager> {
Dictionary<string, List<UIEventFun>> dic = new Dictionary<string, List<UIEventFun>>();
public void Register(string key, UIEventFun fun)
{
if(dic.ContainsKey(key))
{
dic[key].Add(fun);
}
else
{
List<UIEventFun> lstFun = new List<UIEventFun>();
lstFun.Add(fun);
dic[key] = lstFun;
}
}
public void UnRegister(string key, UIEventFun fun)
{
if(dic.ContainsKey(key))
{
dic[key].Remove(fun);
if (dic[key].Count == 0)
{
dic.Remove(key);
}
}
}
public void Dispatch(string key, object param)
{
try
{
if (dic.ContainsKey(key))
{
for (int i = dic[key].Count - 1; i >= 0; --i)
{
if (dic[key][i] == null || dic[key][i].Target == null || ((dic[key][i].Target is UnityEngine.Object) && dic[key][i].Target.Equals(null)))
{
dic[key].RemoveAt(i);
continue;
}
dic[key][i](param);
}
}
}
catch (Exception e)
{
uLog.LogError(uLog.uException, "Event Error: " + e.ToString());
}
}
}
相关文章推荐
- Unity 脚本之间的消息传递,事件管理
- Android中级教程(三)之不同Activity之间的数据传递---Bundle对象的使用!
- 在不同对话框之间进行简单的消息传递
- liferay6.2通过事件机制实现不同portlet之间数据传递
- UNITY3D对象之间实现消息通信管理[源码转载自unity wiki]
- Android判断网络状态是否断开+Android完全关闭应用程序+ 本文讲述了Android中不同Activity之间的数据传递 — Bundle对象的实现(-)+Android中Bundle的使用示例
- Android中不同Activity之间传递自定义对象的参数问题的解决
- Android中级教程(三)之不同Activity之间的数据传递---Bundle对象的使用!
- C#窗体之间传递消息和事件
- Bundle对象实现不同Activity之间数据传递
- [js]如何在js方法中传递事件对象并且在各个浏览器之间兼容
- 委托与事件的简单应用(不同控件之间的控制及参数传递,C# VB)
- 不同Activity之间的数据传递--Bundle对象的实现
- cocos2dx EventListenerCustom类控制事件的分发 处理不同层之间的事件传递以及自定义用户数据
- Ex3.10 不同Activity之间的数据传递——Bundle对象的实现
- Android中级教程(三)之不同Activity之间的数据传递---Bundle对象的使用!
- 不同Activity之间传递数据--Bundle对象和startActivityForResult方法的实现
- MFC在不同的类窗体之间传递消息
- Android消息机制之实现两个不同线程之间相互传递数据相互调用
- java线程间通信[实现不同线程之间的消息传递(通信),生产者和消费者模型]