Unity3D研究之在Unity中使用事件/委托机制(event/delegate)进行GameObject之间的通信引入中间层
来源:互联网 发布:安恒数据库审计 编辑:程序博客网 时间:2024/04/30 22:31
一对多的观察者模式机制有什么缺点?
如果你对如何在Unity中使用事件/委托机制还不太了解,建议您查看我的前一篇文章:在Unity中使用事件/委托机制(event/delegate)进行GameObject之间的通信
在前一篇博客里面,我们写到:在Unity中使用事件/委托机制(event/delegate)进行GameObject之间的通信,其中使用了EventHandler这个委托作为通用的事件类型,实现了一对多的观察者模式。但是这样做有什么缺点呢?我们还是举前文所说的小鸟撞上管道为例:
在这里面,小鸟撞倒管道时,小鸟会发送一个 产生碰撞的 消息传送给所有观察者,那么,如果我们新加入一个名为天鹅,它也能在天上飞,那么我们就要在它的类内部实现一个同样功能的产生碰撞的 消息传送给所有观察者,这样就产生了代码重复,软件中解决代码重复的问题一般使用的事引入中间层的办法,所以我仿照Cocos2d-x中的CCNotificationCenter写了一个CCNotificationCenter来存储各种消息并转发来当作中间层。
引入中间层 — NotificationCenter
NotificationCenter基本的设计思路是基于MessageDispatcher模式的,即使用一个字典(Dictionary)来记录各种需要转发的信息,以及这些信息的观察者,然后再恰当的时候进行消息的转发。NotificationCenter还应当提供观察者订阅和取消订阅的方法。
NotificationCenter是基于单件模式的,它在第一次被调用GetInstance方法时被初始化的,使用单件的原因是要让NotificationCenter的生命期比任何一个观察者都长,这样才不会出现NotificationCenter为空的情况。
在下面的代码里,我把INotificationCenter做成抽象类的原因是:希望通过这个继承这个类来创建多个子类,比如可以创建UINotificationCenter,BattleNotificationCenter,TradeNotificationCenter。来进行消息的分组。
下面我把自己的代码分享一下,供大家参考:
对观察者进行抽象化 — 引入Observer
在加入了NotificationCenter之后,我们要面对的下一个问题就是,我们的每一个观察者都需要在自己的Start方法中添加回调函数,在OnDestroy方法中取消回调函数,那么,我们可以把这部分的代码抽象在一个Observer组件中,使用另一个字典记载下所有的该GameObject注册的回调函数,在Observer的OnDestroy方法里面一次全部取消订阅。代码如下:
- Unity3D研究之在Unity中使用事件/委托机制(event/delegate)进行GameObject之间的通信引入中间层
- 【Unity3D技巧】在Unity中使用事件/委托机制(event/delegate)进行GameObject之间的通信 (二) : 引入中间层NotificationCenter
- Unity3D技巧在Unity中使用事件/委托机制(event/delegate)进行GameObject之间的通信
- 在Unity中使用事件/委托机制(event/delegate)进行GameObject之间的通信
- 在Unity中使用事件/委托机制(event/delegate)进行GameObject之
- Unity中使用委托/事件实现GameObject之间的通信
- 事件委托机制实现GameObject之间的通信
- 事件/委托机制(event/delegate)(Unity3D开发之十七)
- Tolua使用笔记六:在lua中操作C#的委托事件与在lua中对Unity的GameObject的操作
- Tolua使用笔记六:在lua中操作C#的委托事件与在lua中对Unity的GameObject的操作
- C#之委托(delegate)与事件(event)
- Unity3D官方VR教学学习笔记之事件event与委托delegate
- 关于C#的delegate(委托)和event(事件)的使用
- C#:委托(delegate)和事件 (event)
- 委托(Delegate) 和 事件(Event)
- unity delegate事件委托
- Unity3D 中使用C# 委托和事件(之二)
- 事件(event)与委托(delegate)
- 破解winrar
- MySQL中文乱码、远程连接、表容量修改、初始密码修改问题解决、Packet Bigger设置
- centos6.3搭建numpy,scipy,matplotlib,OpenCV,mlpy的实录
- 如何搭建tftp服务器?
- java之正则表达式学习
- Unity3D研究之在Unity中使用事件/委托机制(event/delegate)进行GameObject之间的通信引入中间层
- RTSP协议举例
- 剑指offer--面试题44:扑克牌的顺子--用哈希表
- poj 2135 Farm Tour (最小费用最大流模板)
- c++中const用法大全
- 微信十条绑住自媒体:时政公众号或成“炮灰”
- 有关数制转化
- Linux命令全集
- Respond.js让IE6-8支持CSS3 Media Query