【QFramework】学习记录03-事件系统

702 阅读1分钟

原教程地址

一、TypeEventSystem

  1. 事件类型是class,方便继承、加参数,缺点是性能稍差
  2. API
TypeEventSystem.Register<GameOverEvent>(OnGameOverEvent);
TypeEventSystem.Send<GameStartEvent>();
// 事件带参数
TypeEventSystem.Send(new GameStartEvent(){Score = 100});
TypeEventSystem.UnRegister<GameStartEvent>(OnGameStartEvent)

二、QEventSystem

  1. 事件类型是枚举,性能好,但是不够简洁,必须要按照头尾相接的方式定义消息。
  2. 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中的事件机制

  1. 底层是QEventSystem,基于MM架构跟UIKit做了优化,并且使用MM架构或UIKit必须用这个
  2. 默认事件分发区域是模块内
//注册
RegisterEvent(UIEventID.xxx.xxx);
//发送
SendEvent(UIEventID.xxx.xxx);
//接收
protected override void ProcessMsg(int eventId, QMsg msg){}
//注销 UIPanel会自动注销事件,不用手动注销
  1. 跨模块发消息
SendMsg(QMsg)

4.消息带参数 传参数建议继承QMsg然后指定消息ID, 通过SendMsg(msg) 来传递参数

原作者建议

  1. 如果还没有使用 UI Kit中的消息机制,并且不打算使用Manager Of Managers架构,笔者建议使用 TypeEventSystem作为消息通信的工具
  2. 如果打算使用Manager Of Managers架构,或者 UI Kit 中的消息机制,那么就用 UI Kit 提供的消息机制就好,具体怎么用会在下一篇进行介绍
  3. 全局的 QEventSystem 与UI Kit、Manager Of Managers 的QEventSystem 不是同一个示例,所以在某些情况下如果用到全局 QEventSystem 那么不要担心与 UI Kit冲突的问题。不过这里要注意一下全局的 QEventSystem 事件是发送不到Manager Of Mananger和UI Kit中的。