最近在造轮子,事件系统的核心目的是为了降低模块间耦合,事件驱动可以更好的解耦和组织代码。本方案主要基于C#的委托实现,典型的观察者模式的应用。
技术选型:
C#的委托与事件
- C#的委托类型可以关联多种拥有相同形参签名的函数,并且可以使用Invoke方法顺序调用,设计上可以用作回调。
- C#的event是一种限制的委托类型,额外帮助委托实现了ADD和Remove方法,设计上留作被观察者的接口,供外部方法监听。且event只能在方法外部声明,且只能由被观察者触发,虽然保证了操作安全,但是降低了自由度。
因为我希望可以实现对于具体事件的监听与回调,且支持单播和组播,并且不限制何种身份发送信息,使用委托作为底层十分合适。
Unity的SendMessage与MessagingSystem
- Unity提供了一系列的消息机制,诸如SendMessage,这个东西我从始至终都完全没有用过,内部完全基于反射的实现性能属实堪忧,所以这个东西设计上应该就是给初学者快速上手的,没打算商用。
- 还有就是UnityEventSystem,这个是unity对于SendMessage的优化,好消息是已经不在使用反射查找函数和对象了。而是向上无限搜索GameObject查找继承了IEventSystemHandler接口的类并调用其内部实现。底层也是由委托实现的,解决了上者的性能问题,且能规范代码编写。功能完善但是没有直接处理委托更为直接。
方案确定
思路:基于委托实现,根据ID指定事件名称,新建字典存储ID与委托的KV表,在全局单例中实现事件的注册与解绑以及调用。
且为了适应各自类型参数,原本打算使用不定长object作为传参,后再进行类型转换,但是会带来额外的装箱拆箱消耗,于是改为用泛型实现,并重载对应方法。最多提供了传两个泛型参的能力。
每个事件设计为单向广播,如需回调,则另开新事件进行广播。
文章评论