mypro334 发表于 2022-8-26 08:04

在UHT添加自定义的插件支持

前言

本文是基于4.24,主要是在UHT里添加插件,这样UHT在执行时,我们就可以拿到他的反射代码,比如检查UFunction参数的数量,检查Server函数等操作
在UHT里启用一个插件需要两个模块,为什么会有两个模块,这个应该是UE4里设计规则,两个模块相当于一个是编辑器时,用于生产代码,另一个是运行时,用于执行代码。两个通过GetGeneratedCodeModuleName 建立联系。所以,在检查一个UHT的插件是否启用时,会同时检查对的应的Runtime模块是否启用。而Runtime模块目前看是需要有反射代码才能被识别,不知道是否还有其它方式。
添加编译步骤

因为UHT也是符合Program形式的程序,也是使用的是Build.bat脚本来构建的,正常情况下使用PrivateDependencyModuleNames.add() 就行。但是要使用项目侧的模块的话,就需要在构建参数中带有Project路径 ,否则只能使用引擎侧的模块。而我们在编译代码时,会自动编译UHT,并且 默认是使用不带Project参数,所以只能考虑在引擎侧添加模块(除非把这一块逻辑也修改掉)
第二步是需要保证在运行时可以加载,可以强行修改UHT代码来加载模块(直接调用Load模块就行),
也可以通过插件的配置功能来启用(这样不用修改引擎)。如果以配置来启用的话,需要新建一个插件,插件内引用到两个模块,如下结构
Plugin:
- Module1
- Module2因为UHT在运行时,是带有project参数的,所以可以在项目侧的Project文件中开关这个插件的功能,同时UHT只会处理GEngineLoop**.PreInit(*ShortCmdLine)**的调用。只会加载到:
ProjectManager.LoadModulesForProject(ELoadingPhase::EarliestPossible)
PluginManager.LoadModulesForEnabledPlugins(ELoadingPhase::EarliestPossible)

ProjectManager.LoadModulesForProject(ELoadingPhase::PostConfigInit)
PluginManager.LoadModulesForEnabledPlugins(ELoadingPhase::PostConfigInit)模块的启动属性就只有两种选择,一般默认选择第二种。

IScriptGeneratorPluginInterface 类型是脚本插件的基类,需要实现以下几个函数
函数作用GetGeneratedCodeModuleName如上所述,用于获取关联SupportsTarget在模块是否启用中,用于判断是否可以支持对应平台,一般是TargetNameShouldExportClassesForModule在每一个模块内导出时,用于判断是否支持导出类Initialize负责初始化,参数ExportClass导出一个具体类FinishExport最后导出结束时会调用到,这里可以写文件保存一些数据GetGeneratorName生成器模块的名字GetExternalDependencies输出依赖?那么在初始化时,调用 Initialize 函数,并把Runtime模块的根目录传入,以方便编辑器插件使用。如果导出某一个模块是支持的,则会调用ExportClass ,最后导出完后调用FinishExport
剩下就可以阅读这两个函数实现相关功能,目前引擎侧支持一个Lua相关的,但是实际上应该可以做出更多好用好玩的功能。
页: [1]
查看完整版本: 在UHT添加自定义的插件支持