消息派发对项目中各个功能模块的解耦非常有帮助,免去模块间复杂的调用.
但unity自带的消息函数SendMessage效率一直都不高,所以基本上项目中都很少用它,而是自己写一套消息派发.
消息派发原理简单:订阅发布模式.
各模块需要注意哪些消息就订阅哪些消息[比如我定了报纸,而我邻居定了牛奶]
消息派发者会保存对应的订阅者信息[这个消息派发企业业务很广泛,既有报纸也有牛奶]
业务逻辑中需要触发该消息时,消息派发者就会检索我的订阅信息看看有没有模块订阅了该消息,有那么触发这个模块的处理函数[派出快递员,敲你大门,把报纸牛奶给你]
实现方式大致有2种:
1.
->写消息派发类,该类作为单例确保全局调用,它包含 订阅函数 取消订阅函数 和 派发函数 . 以及存储订阅信息的数据结构:Dictionary<string,List<IMsgHandler>>
->写一个接口类, 如 IMsgHandler , 它声明 订阅者模块处理消息的函数格式. 如: public bool OnMsgHandler(string msgName,param object[] args);
->订阅者继承接口类,订阅消息并重写IMsgHandler接口实现自己的业务逻辑 .
2.
->写消息派发类,该类作为单例确保全局调用,它包含 订阅函数 取消订阅函数 和 派发函数 . 以及存储订阅信息的数据结构Dictionary<string,UnityAction<T>>
->订阅者继承接口类,注册订阅消息函数,实现自己的业务逻辑 .
这两种方式的区别在于第一种存储的是对象 ,另一种存储的是函数引用.
存储对象:派发时 遍历字典中订阅的对象,然后调用消息处理接口函数,所有的逻辑都在一个函数中 比较集中.
存储函数引用:派发时 遍历字典中订阅的函数引用,直接调用该引用, 调用相对分散但方便
下面贴代码:
第一种:<