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
http://www.lxweimin.com/p/36706303943a
https://zhuanlan.zhihu.com/p/49558324