插件销售地址:Modular Project | Fab
设计该插件的原因:
在许多现代项目中,设计师总会设计许多功能,开发者在实现这些功能时常常会遇到调用新功能时某些对象要回收,某些对象要保留的情况,若使用关卡流的方式当切换关卡时会将上个关卡的对象全部粗暴销毁,若使用标签标记哪些对象需保留、哪些对象需卸载的方式则会出现过多标签冗余、并且多人协同合并时覆盖标签的情况发生,该插件就是解决上述提到的问题,使功能间的切换粒度更加细化。
这就是模块化项目插件将帮助您的项目控制流程的方面。该系统非常灵活,并可对执行管线自定义定制。也可以很容易地集成到新的和现有的项目中。
以5.1.1引擎版本为例(虚幻4虚幻5各版本都适用)
该插件将对象视为两种类型:模块与依赖模块的对象。
模块类型介绍:可以理解为处理各类回调事件的管理器,如当另一个模块(B模块)被事件调用时会通知该模块(A模块),此时该模块可执行自定义逻辑,如卸载某些对象
模块设置步骤:
第一步:创建Actor(只要是Actor及其子类即可,比如Pawn、Character或GameMode等),取名为Module1
第二步:继承ModuleEventCallableInterface接口
第三步:实现GetModuleName函数,随意设置一个模块名称,我设置为My New Module
第四步:实现ModuleEvent方法
第五步:给该对象添加Module组件
第六步:将Actor拖入场景(若为主角色或GameMode等可忽略该步骤)
第七步:调用刚刚设置的模块(下图为我在关卡蓝图里写的测试调用方法,Invoke Module by Name与Invoke Module by Class功能一致,用哪个都行)
执行效果:
第一次执行
后续执行
上面的执行顺序以及事件触发数量是通过规则处理类扩展的,若有额外需求可自行扩展,扩展示例链接:一个用于将项目模块化管理的插件--ModularProject的规则处理类扩展-CSDN博客
依赖模块的对象类型介绍:可以理解为与模块类型共生(被相同回调事件调用)的关系,如当模块A被事件调用时会在之后立刻通知该模块B
依赖模块的对象设置步骤:
第一步:创建Actor(只要是Actor及其子类即可,比如Character或GameMode),取名为SubModule1
第二步:继承ModuleEventCallableInterface接口
第三步:实现ModuleEvent方法
第四步:需要在模块被调用前加入被调用序列(如希望当模块A被事件调用时该对象也能收到通知,就需要加入模块A的被调用序列),此时我选择在BeginPlay时延迟一会加入(因为需要保证模块类先被生成)
第五步:将Actor拖入场景(若为主角色或GameMode等可忽略该步骤)
执行效果:
第一次执行(会发现每个事件都被调用了两次,主模块先被执行,依赖模块的对象后被执行,由于打印显示原因所以看起来是反的,实际执行顺序是由下至上)
后续执行
若此时再增加个模块Module2(除了名称,其余与Module1一致)
执行效果:
第一次执行(调用Module1,此时会发现结尾有InvokeAll标志的会通知所有模块以及依赖模块的对象,结尾没有InvokeAll标志的仅会通知被调用的模块以及依赖模块的对象)
后续执行
若希望获取所有默认事件名称可以在添加完本插件后点击运行(Play)按钮,然后打开输出日志(Output Log)
插件应用实例:(暂空)