个人开发测试

  • 关于
  • 历史项目
  • 游戏开发
    • 一些轮子
    • Unity
    • UnReal
    • Godot
    • 常用框架
  • 游戏设计
    • 游戏品类研究
    • 游戏心理学
    • 游戏杂谈
  • 计算机科学
    • 算法、数据结构
    • 图形学
    • 网络
    • 计算机语言
  • 留言板
  • 推荐
游戏开发/个人感悟/一些废话
  1. 首页
  2. 游戏开发
  3. Unity
  4. 正文

【YFramework】【EventSys】基于Unity的轻量全局事件系统

2022年3月26日 1790点热度 0人点赞 0条评论

最近在造轮子,事件系统的核心目的是为了降低模块间耦合,事件驱动可以更好的解耦和组织代码。本方案主要基于C#的委托实现,典型的观察者模式的应用。

技术选型:

C#的委托与事件

  • C#的委托类型可以关联多种拥有相同形参签名的函数,并且可以使用Invoke方法顺序调用,设计上可以用作回调。
  • C#的event是一种限制的委托类型,额外帮助委托实现了ADD和Remove方法,设计上留作被观察者的接口,供外部方法监听。且event只能在方法外部声明,且只能由被观察者触发,虽然保证了操作安全,但是降低了自由度。

因为我希望可以实现对于具体事件的监听与回调,且支持单播和组播,并且不限制何种身份发送信息,使用委托作为底层十分合适。

Unity的SendMessage与MessagingSystem

  • Unity提供了一系列的消息机制,诸如SendMessage,这个东西我从始至终都完全没有用过,内部完全基于反射的实现性能属实堪忧,所以这个东西设计上应该就是给初学者快速上手的,没打算商用。
  • 还有就是UnityEventSystem,这个是unity对于SendMessage的优化,好消息是已经不在使用反射查找函数和对象了。而是向上无限搜索GameObject查找继承了IEventSystemHandler接口的类并调用其内部实现。底层也是由委托实现的,解决了上者的性能问题,且能规范代码编写。功能完善但是没有直接处理委托更为直接。

方案确定

思路:基于委托实现,根据ID指定事件名称,新建字典存储ID与委托的KV表,在全局单例中实现事件的注册与解绑以及调用。

且为了适应各自类型参数,原本打算使用不定长object作为传参,后再进行类型转换,但是会带来额外的装箱拆箱消耗,于是改为用泛型实现,并重载对应方法。最多提供了传两个泛型参的能力。

每个事件设计为单向广播,如需回调,则另开新事件进行广播。

标签: YFramework
最后更新:2022年5月26日

可以吃的妙脆角

平平无奇的游戏开发者

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

归档
  • 2024 年 2 月
  • 2023 年 9 月
  • 2023 年 8 月
  • 2023 年 7 月
  • 2023 年 1 月
  • 2022 年 11 月
  • 2022 年 9 月
  • 2022 年 6 月
  • 2022 年 5 月
  • 2022 年 4 月
  • 2022 年 3 月
  • 2022 年 2 月
  • 2022 年 1 月
  • 2021 年 4 月
  • 2020 年 11 月
  • 2020 年 9 月
  • 2020 年 8 月
  • 2020 年 7 月
  • 2020 年 4 月
分类
  • CSharp
  • Lua
  • NAS
  • Unity
  • 一些轮子
  • 历史项目
  • 尚未分类
  • 常用框架
  • 杂
  • 游戏品类研究
  • 游戏开发
  • 游戏杂谈
  • 游戏设计
  • 计算机科学
已阻挡的垃圾评论
3条垃圾评论已被Akismet阻挡

COPYRIGHT © 2022 XuYue. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

京ICP备2022001429号-1