原教程地址
一、TypeEventSystem
- 事件类型是class,方便继承、加参数,缺点是性能稍差
- API
TypeEventSystem.Register<GameOverEvent>(OnGameOverEvent);
TypeEventSystem.Send<GameStartEvent>();
// 事件带参数
TypeEventSystem.Send(new GameStartEvent(){Score = 100});
TypeEventSystem.UnRegister<GameStartEvent>(OnGameStartEvent)
二、QEventSystem
- 事件类型是枚举,性能好,但是不够简洁,必须要按照头尾相接的方式定义消息。
- API
QEventSystem.RegisterEvent(TestEvent.TestOne, OnEvent);
QEventSystem.SendEvent(TestEvent.TestOne, "Hello World!");
QEventSystem.UnRegisterEvent(TestEvent.TestOne, OnEvent);
//key是时间 obj是事件参数
void OnEvent(int key, params object[] obj){}
三、UI Kit中的事件机制
- 底层是QEventSystem,基于MM架构跟UIKit做了优化,并且使用MM架构或UIKit必须用这个
- 默认事件分发区域是模块内
//注册
RegisterEvent(UIEventID.xxx.xxx);
//发送
SendEvent(UIEventID.xxx.xxx);
//接收
protected override void ProcessMsg(int eventId, QMsg msg){}
//注销 UIPanel会自动注销事件,不用手动注销
- 跨模块发消息
SendMsg(QMsg)
4.消息带参数 传参数建议继承QMsg然后指定消息ID, 通过SendMsg(msg) 来传递参数
原作者建议
- 如果还没有使用 UI Kit中的消息机制,并且不打算使用Manager Of Managers架构,笔者建议使用 TypeEventSystem作为消息通信的工具
- 如果打算使用Manager Of Managers架构,或者 UI Kit 中的消息机制,那么就用 UI Kit 提供的消息机制就好,具体怎么用会在下一篇进行介绍
- 全局的 QEventSystem 与UI Kit、Manager Of Managers 的QEventSystem 不是同一个示例,所以在某些情况下如果用到全局 QEventSystem 那么不要担心与 UI Kit冲突的问题。不过这里要注意一下全局的 QEventSystem 事件是发送不到Manager Of Mananger和UI Kit中的。