Notifications
Article
Unity3d框架篇(1):管理器与发现式逻辑注册
Updated 7 days ago
501
8
BDFramework一个高效的开发工作流,绝对不是几个库一凑那种~
本系列基于:BDFramework 、Unity3D 2018.4.0
BDFramework:一个简单、强大、高效的开发工作流。
框架地址:
码云: https://gitee.com/yimengfan/BDFramework.Core
gayhub :https://github.com/yimengfan/BDFramework.Core
欢迎赏星。
第九艺术 、第十艺术讨论群 : 763141410
本章内容:
  • 发现式逻辑的注入
  • 管理器的流程
  • 基于BD管理器的扩展,实际项目中的应用:技能管理器,buff管理器,技能事件管理器等。。。

0x001.问题的提出

很多有一定经验的程序员,肯定都写过一堆的管理器:窗口管理器、数据管理器、人物管理器...等等,通常的写法是这样的:
假设已经有两个类:UIManager和UIBase
var ui = new UIBase(); ui.init(); UIManager.Inst.Register(ui);
然后,一个项目中百十来个管理器、每个管理器百十来个被管理者也很正常,这样看看代码是不是很笨重,而且管理维护起来也很麻烦…
更大的问题在于耦合,以上代码总有一个类(甚至于是具体业务自己)和管理器与具体实例耦合,而事实上:作为具体业务,实际上是没必要知道管理器的存在..

0x010.BDFramework的解决方案

BDFramework 给出一个方案:发现式逻辑注入,
只需要被管理者写上指定标签,则会被自动注入到管理器中。
主要工具两个:Attribute和一个ManagerBase
首先我们看看管理器的核心代码:

这里只给出CheckType的代码块,其他地方省略。
首先我们来解释下泛型,T和V。
T:是继承者管理器需要传进的类型,主要作用是生成管理器的单例。
V:是被管理者所用的类标签。
主要流程:
  • 1.BD框架启动会拿到当前assembly里面所有的Type,
  • 2.查出所有管理器: 即继承了MgrBase的类
  • 3.实例化MgrBase,将当前程序集中所有类型,传入每个CheckType中
  • 4.对应的管理器会检查V类型标签的Type,自动拿到Type信息
  • 5.对应管理器具体自己实现,如:拿到了窗口的Type,可以根据窗口的具体标签实例化窗口 等..

下面看看具体实现:

1.UIManager:
2.具体UI窗口

3.管理器注册流程,主要代码,以下代码在BDLauncherBridge内:

实际项目中我们使用管理器的实现:



0x011.结束语

这里我们解决了最大的问题是:业务和管理器解耦。
很多同学怀疑,这样的效率。我这样稍微解释下:
  • 1.这个操作,是紧接着application启动时候做的,也就是游戏启动阶段
  • 2.实际上遍历type没想象中那么慢,其实很快的
  • 3.关于反射,个人不建议在具体业务中用,框架层可以些许用一点,减少工作量。
自此,从管理器开始,慢慢讲bd框架。
!!!别忘了,给star下!!!
奶泡泡.(B道友)
主要苦力程序员 - Programmer
2
Comments
主要苦力程序员
Koake类似服务器开发的服务发现吧
这个只能算逻辑发现。。。跟服务器发现差的有点远
0
主要苦力程序员
fangye100这个和zenject是不是类似的依赖注入 启动前框架检查所有代码里的inject标记 预生成好各种manager实体
差不多的意思,类似spring那种 各个标签然后搜集
0
K
Koake
7 days ago
类似服务器开发的服务发现吧
0
K
Koake
7 days ago
emm
0
f
fangye100
7 days ago
这个和zenject是不是类似的依赖注入 启动前框架检查所有代码里的inject标记 预生成好各种manager实体
0