mypro334 发表于 2021-12-14 18:16

虚幻4笔记-插件创建、相关配置文件和加载启动源码分析

先记录一下UE4插件一些基础知识。

1、插件创建面板简单介绍
在编辑按钮下,选择插件按钮,会弹出下面弹框,里面就是UE4支持的插件类型。


这里记录下三个比较有用的插件用途:
Blank-原始的插件,只提供最基础的目录与文件创建,可以是任何内容插件。
Content Ony-只能在Content目录的插件,通常是给美术资源之类做的插件。
Blueprint Library-蓝图库,如其名,就是一些比较独立蓝图库,封装好给不同游戏用,比如A星寻路算法之类。
Editor Toolbar Button-创建一个在编辑器上面的按钮插件,创建在如下图位置。


Editor Standalone Window-独立窗体,创建一个独立界面的编辑器,通常和Slate搭配使用。
Editor Mode-创建一个在下面位置的插件


2、创建Editor Standalone Window插件
点选Editor Standalone Windo后,输入相应的插件名字、作者名字和描述,点Create Plugin,然后UE4就会自动完成创建。


3、插件的启用
勾选Enabled就可以了,需要重启,变动才会生效。


等重启完成后,就可以点击刚刚创建的按钮,测试功能。


4、插件相关文件- *.uplugin


如图所见,是一个json格式,其中定义了很多编辑器相关的内容,包括插件名字、描述版本号等,其中比较关键的是Modules定义。
"Type"-----插件类型
"Developer", 表示只在开发加载,真正打包不会加载
"Editor",表示只会在Editor模式下加载
所有枚举如下图:
enum Type
{
Runtime,
RuntimeNoCommandlet,
RuntimeAndProgram,
CookedOnly,
Developer,
Editor,
EditorNoCommandlet,
Program, //!< Program-only plugin type
ServerOnly,
ClientOnly,
// NOTE: If you add a new value, make sure to update the ToString() method below!
Max
};
"LoadingPhase"-----插件加载阶段
"Default" 这个是默认的加载阶段
模块会在不同阶段加载,这以为着有先后关系,如果加载插件发现依赖插件还没有加载,可以把加载阶段延后,根据实际情况处理。
enum Type
{
/** Loaded before the engine is fully initialized, immediately after the config system has been initialized. Necessary only for very low-level hooks */
PostConfigInit,
/** Loaded before the engine is fully initialized for modules that need to hook into the loading screen before it triggers */
PreLoadingScreen,
/** Right before the default phase */
PreDefault,
/** Loaded at the default loading point during startup (during engine init, after game modules are loaded.) */
Default,
/** Right after the default phase */
PostDefault,
/** After the engine has been initialized */
PostEngineInit,
/** Do not automatically load this module */
None,
// NOTE: If you add a new value, make sure to update the ToString() method below!
Max
};
5、插件加载时间点
Launch.cpp下有GuardedMain引擎的主入口方法


其中有FEngineLoop的PreIni和Init方法。




在PreInit方法中
可以找到加载PreLoadingScreen的地方


接着还可以找到




这里就是UE4启动后加载模块的地方。
总的来说,就是UE4引擎通过Launch.cpp的Main函数启动后,启动Loop,然后再在Loop里面对模块的加载顺序进行控制。
6、插件相关文件-*.Build.cs
这个文件通常用于编辑插件对模块的引用。


PublicDependencyModuleNames 第三方依赖可以访问
PrivateDependencyModuleNames 第三方依赖不可访问
插件假如需要引用到引擎的其他模块,需要手动添加一下依赖,良好习惯通常都是尽量Private。



7、工程文件- *. uproject
在这里通常是配置插件是否启用



文件过于简单,就不叙述了。通常在编辑器上启动或者关闭插件后,这里的参数会对应修改,也可以手动修改,但需要重启编辑器才能起效。
8、插件默认生成文件的启动流程
void *::StartupModule()
void *::ShutdownModule()
还是接上上面的加载阶段,在加载方法LoadModulesForPhase 里面,通过LoadModuleWithFailureReason来加载了模块。


接着可以看到


这里基本就介绍了默认插件的启用方法是在哪里调用了。
9、封装不需要源码的插件


bUsePrecompiled表示不需要编译,用已经编译好的插件来加载,删除CPP后,可以直接复制到其他工程使用。

Doris232 发表于 2021-12-14 18:18

好文章 mark
页: [1]
查看完整版本: 虚幻4笔记-插件创建、相关配置文件和加载启动源码分析