UE中的插件,重点在.Build.cs文件和.uplugin文件,如果在这两者中,再分主次的话,那我选.Build.cs文件,即为这篇文章画一个侧重点。
在Unreal中,插件是开发者可在编辑器中逐项目启用或禁用的代码和数据集合。
插件可添加运行时,gameplay功能,修改内置引擎功能或添加新功能,新建文件类型,及使用新菜单、工具栏命令和子模式扩展编辑器的功能。使用插件可拓展许多现有Unreal子系统。
1. 插件编辑器与插件文件
- Unreal插件编辑器界面中的插件对应了UE4安装目录下的Plugins文件下的插件。
2. 插件目录
Binaries:编译后的dll文件存放位置
Content:游戏资源Asset文件存放位置
Intermediate:编译的中间文件存放位置
Resources:一般为图标的存放位置
Source:代码存放位置
.uplugin:插件模块配置文件,JSON格式
.Build.cs:每个.Build.cs文件声明派生自ModuleRules基类的类,并设置属性控制器从构造函数进行编译的方式。由虚幻编译工具编译,并被构造来确定整体编译环境。使用C#语法。
(1) 插件描述文件 .uplugin
插件描述文件.uplugin,此文件可在插件编辑器中进行修改。
{
"FileVersion": 3,
"Version": 1,
"VersionName": "1.0",
"FriendlyName": "PluginName",
"Description": "",
"Category": "Other",
"CreatedBy": "",
"CreatedByURL": "",
"DocsURL": "",
"MarketplaceURL": "",
"SupportURL": "",
"CanContainContent": false,
"IsBetaVersion": false,
"Installed": false,
"Modules": [
{
"Name": "PluginName",
"Type": "Editor",
"LoadingPhase": "Default"
}
],
"Plugins": [
{
"Name": "AssetManagerEditor",
"Enabled": true
}
]
}
- Category:类目名即在插件编辑器中所属的类目
模块描述符Modules
必须有Name和Type字段。
- Name:是插件模块的唯一命名,将随着插件而加载。在运行时,插件的Binaries文件夹中需存在正确的插件二进制文件,并带有指定模块命名。
- Type:是模块的类型,决定了该插件适合于那种类型的应用程序加载。有效的几项是:Runtime、RuntimeNoCommandlet、Developer、Editor;其中Runtime 的模块在无论何时都会被加载,哪怕是在最终发行的游戏版本中也会。Developer 的模块只会在 Development 运行时或者编辑器版本中才会被加载,并不在在最终发行版本中加载。Editor 模块只会随着 Editor 的启动被加载。插件也可以使用几种不同类型的组合来达到所需要的目的。
- LoadingPhase:控制插件在引擎启动的何时被加载。
LoadingPhase 参考文章
https://docs.unrealengine.com/en-US/API/Runtime/Projects/ELoadingPhase__Type/index.html
- WhitelistPlatforms:开放的平台
- BlacklistPlatforms:关闭的平台
插件描述符Modules
此插件依赖于另一个插件,所以在插件描述符Modules中的LoadingPhase的属性,如果和另一个插件是依赖关系,则应该编译此插件之前就编译了依赖的那个插件。
(2) 插件编译配置文件 .Build.cs 描述模块编译方法
①示例代码
using UnrealBuildTool;
public class PluginName : ModuleRules
{
public PluginName(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;
PublicIncludePaths.AddRange(
new string[] {
// ... add public include paths required here ...
}
);
PrivateIncludePaths.AddRange(
new string[] {
// ... add other private include paths required here ...
}
);
PublicDependencyModuleNames.AddRange(
new string[]
{
"Core",
// ... add other public dependencies that you statically link with here ...
}
);
PrivateDependencyModuleNames.AddRange(
new string[]
{
"CoreUObject",
"Engine",
"Slate",
"SlateCore",
// ... add private dependencies that you statically link with here ...
}
);
DynamicallyLoadedModuleNames.AddRange(
new string[]
{
// ... add any modules that your module loads dynamically here ...
}
);
}
}
②.Build.cs与VS的关系
该插件模块编译配置,与配置VS中的项目属性类似,包含进了依赖库等 。例如 第三方库lib的引用
③各代码块描述
路径Private:
路径Public:
****若此模块依赖某个模块,则就引入哪个模块,则表示此模块.Build.cs同级目录下的Public文件夹下的头文件可引用,若欲引用的头文件其上一级还有文件夹,应该在#include 显式 写出*****
模块Private:C包含B,B包含A, C是否需要重新包含A。 是
模块Public: 否
模块Dynamically:
④头文件包含
注意:依赖进某个某个模块,表示,跟此模块.Build.cs文件同级目录下的Public文件夹下的.h可包含进,但是如果欲包含的头文件,上一级还有文件夹,但是这个文件夹不是Public文件,包含进头文件的时候,就需要显式写出文件夹名字。还有,一定要注意 是Public文件夹,因为只有在此文件夹下才可以自动检测到。
⑤模块名_API 宏
模块名_API与Public / Private 文件夹之间的关系
⑥错误展示
(3) 插件头文件 .h
插件的头文件中,一般只有一个类,而且以F开头,Module结尾。比如:FPluginNameModule。
还有两个函数
virtual void StartupModule() override;//插件加载
virtual void ShutdownModule() override;//插件卸载
错误经验:
(1)当创建“编辑器工具栏按钮”的插件,编辑代码结束后,需重新打开编辑器才可生效。
3. 使用引擎插件
直接包含插件头文件是不行的。打开插件的Build.cs文件,在DependencyModuleNames中,填入使用的插件名称。
PublicDependencyModuleNames.AddRange(new string[] { "Core",
"CoreUObject",
"Engine",
"InputCore",
"FacialAnimation",
});
4. 新建插件
5. 如何使在源码目录下新建的插件 生效
(1)运行UE4在Editor模式下启用插件
(2)插件启动先后顺序和依赖关系有直接关系
6. 个人心得
插件(模块集合形成)--->多个模块(.Build.cs)--->多个文件夹(一个文件夹对应一个.Build.cs)
在.Build.cs文件,进行依赖声明工作,以包含所需头文件。
参考文章
https://gameinstitute.qq.com/community/detail/121747
https://docs.unrealengine.com/zh-CN/Programming/Plugins/index.html
https://blog.csdn.net/jxyb2012/article/details/88839224
https://www.jianshu.com/p/36706303943a
https://zhuanlan.zhihu.com/p/49558324