Unity 事件统一管理
2016-09-02 16:08
513 查看
using System; using System.Collections; using System.Collections.Generic; public class DispatchEvent : IDispatchEvent { Dictionary<string, List<Action<MyEvent>>> eventDic = new Dictionary<string, List<Action<MyEvent>>>(); public static DispatchEvent Instance { get { if (instance == null) { instance = new DispatchEvent(); } return instance; } } private static DispatchEvent instance; public void AddEventListener(string type, Action<MyEvent> addEvent) { if (HasEventListener(type,addEvent) == false ) { return; } if (eventDic.ContainsKey(type) == false ) { eventDic.Add(type,new List<Action<MyEvent>>()); } eventDic[type].Add(addEvent); } public bool HasEventListener(string type, Action<MyEvent> hasEvent) { if (eventDic.ContainsKey(type) == true ) { return false; } return true; } public void RemoveEventListener(string type, Action<MyEvent> removeEvent) { if (HasEventListener(type, removeEvent) == false) { return; } eventDic[type].Remove(removeEvent); if (eventDic[type].Count == 0) { eventDic.Remove(type); } } public void dispatchEvent(MyEvent myEvent) { if (eventDic.ContainsKey(myEvent.type) == false ) { return; } List<Action<MyEvent>> tempEvent = eventDic[myEvent.type]; for (int i = 0; i < tempEvent.Count; i++) { tempEvent[i](myEvent); } } } public class MyEvent { public string type; public object data; public MyEvent(string type,object data = null) { this.type = type; this.data = data; } } public interface IDispatchEvent { void AddEventListener(string type,Action<MyEvent> addEvent); void RemoveEventListener(string type,Action<MyEvent> removeEvent); bool HasEventListener(string type ,Action<MyEvent> hasEvent); void dispatchEvent(MyEvent myEvent); }
事件类型 [type] 事件 参数[data] 添加事件(AddEventListener) 移除事件(RemoveEventListener )
检查事件(HasEventListener) 抛掷事件(dispatchEvent) 所有事件容器(eventDic)
测试:
public class App : MonoBehaviour { public void Awake() { DispatchEvent.Instance.AddEventListener(TestDispatchEvent.testDispatchEvent, TestEvent); } void Start() { DispatchEvent.Instance.dispatchEvent(new TestDispatchEvent(TestDispatchEvent.testDispatchEvent)); } void TestEvent(MyEvent myEvent) { Debug.Log("TestEvent"); } } public class TestDispatchEvent:MyEvent { // 事件类型 public static string testDispatchEvent = "testDispatchEvent"; public TestDispatchEvent(string type, object data = null) : base(type, data) { } }
DispatchEvent.Instance.AddEventListener(TestDispatchEvent.testDispatchEvent, TestEvent);
哎呀:添加一个事件要这么多代码 ,太麻烦,把它结合到单例里面
添加前:
public class Singleton : Iinstance where T:Iinstance,new()
添加后
public class Singleton : DispatchEvent, Iinstance where T:Iinstance,new() {}
调用直接 this.AddEventListener(); this.dispatchEvent();this.RemoveEventListener();
相关文章推荐
- 【Unity技巧】统一管理回调函数——观察者模式
- 【Unity技巧】统一管理回调函数——观察者模式
- ASP.NET 页面基类设计—防止2次提交和事件统一管理
- 【Unity】Unity事件管理,可有效管理动画事件
- Unity 脚本之间的消息传递,事件管理
- 【Unity】中如何统一管理回调函数(利用观察者模式)
- 【Unity技巧】统一管理回调函数——观察者模式
- 统一管理Unity里面的Update
- Unity实现支持泛型的事件管理以减少使用object作为参数带来的频繁装拆箱
- Unity项目中文字的统一管理
- 防止2次提交和事件统一管理【转】
- 处理事件的方式:两种类的覆盖处理(自己管理,覆盖专用事件函数;自己统一管理,覆盖QWidget::Event通用函数),一种对象的处理(父控件统一管理,即安装过滤器),两种全局处理(QCoreApplication安装过滤器;覆盖notify方法)
- Unity之路(二):输入事件管理Input
- Unity视频插件AVPro Video的事件管理
- 项目统一开发管理解决方案思路[项目组成员同时做很多项目的解决思路探讨]
- [ITIL学习笔记]之事件管理(2) 推荐
- [ITIL学习笔记]之事件管理(1)
- 信息安全事件管理
- 20070926日下午工作流与ITILQQ群 事件管理 讨论聊天记录
- 关于UCM(统一变更管理)的体会[二]---整合