轉載註明出處
UE4如何組織模塊?
ue4的模塊組織是一個相對複雜的工作,這邊博文會依照部分源代碼進行講解。
UE4中文件組織模塊的主要描述文件有以下幾種:
1.插件描述文件,Json,以.uplugin結尾
2.項目描述文件,Json,以.uproject結尾
關於這兩個文件有兩項需要說一下
加載模塊的適用場景(Type)
namespace EHostType
{
enum Type
{
除了獨立程序以外的所有目標
Runtime,
除了獨立程序和運行命令行模式的Editor
RuntimeNoCommandlet,
所有的目標都加載
RuntimeAndProgram,
只在被cook過的遊戲加載
CookedOnly,
只在development的運行時或者editor構建,不在shipping模式下構建
Developer,
在只有Editor啓動的時候加載
Editor,
只有在editor啓動時加載,但是一定不是在命令行模式下的editor
EditorNoCommandlet,
只在獨立小程序中加載
Program,
除了專用客戶端以外的其他所有目標
ServerOnly,
除了專用服務器以外的其他所有目標
ClientOnly,
注,如果你增加了一個新值,一定要確保ToString函數也改一下
Max
};
這個模塊在哪個階段被加載?(LoadingPhase)
namespace ELoadingPhase
{
enum Type
{
儘早的被加載,換句話說,uplugin文件可以從pak文件加載(也可以在安裝了PlatformFile後加載,以防pak文件不被使用),用於讀取文件(壓縮格式等)所需的插件
EarliestPossible,
在引擎被完全初始化之前,在配置文件系統被初始化以後馬上調用,只在用於在底層攔截其它進程的消息用自己的方式處理使用。
PostConfigInit,
加載前coreUObject設置手動加載屏幕,用於我們的補丁系統
PreEarlyLoadingScreen,
在引擎完全初始化之前加載,因爲模塊需要在觸發之前掛接到加載屏幕
PreLoadingScreen,
在默認階段之前
PreDefault,
在引擎初始化之前,在遊戲模塊被加載之後
Default,
在默認階段之後
PostDefault,
在引擎被初始化之後
PostEngineInit,
不自動加載該模塊
None,
注,如果你增加了一個新值,一定要確保ToString函數也改一下
Max
};
3.build.cs,Target文件
說到這裏,可能會不理解爲什麼設立這麼多場景,在這裏就要提到UE4的本身模塊結構劃分:
UE4劃分爲以下5個模塊:
Developer主要是跨平臺工具,Merge和一些底層的工具。
Editor主要是編輯器相關的代碼
Programs主要是獨立於引擎,但大多數又依賴引擎的工具,UBT就在這裏
ThirdParty第三方庫或者插件
RunTime是主要的Gameplay等等和遊戲相關的代碼了。
- 如何在項目中添加一個插件:
1.在build.cs中添加公共依賴
2.在uproject中添加plugin
- UE4中如何新建模塊?
注意目錄結構:
目前source只有這三個,現在添加一個新模塊
新模塊裏面必須有這三個文件
在此處一定要注意,只有主模塊依賴副模塊,其他模塊不能依賴主模塊,小心形成相互依賴
在target.cs中加入你的模塊。注意需要重新構造字符串。
原來:
現在:Add只能增加一個,用Addrange
最後在uproject中添加模塊
最後在主模塊的build.cs中加入模塊
以下一段參考UE4官方文檔:如果你的遊戲模塊涉及UObject,需要進行以下配置
由於新的遊戲性模塊包含 UObject 代碼,所以需進行一些必要的配置。
- 需要在 DefaultEngine.ini 文件中的幾個地方添加該模塊:
[UnrealEd.EditorEngine] 部分的 EditPackages 數組:
[UnrealEd.EditorEngine]
+EditPackages=<ModuleName>
[Launch] 部分:
[Launch]
Module=<ModuleName>
[/Script/Engine.UObjectPackages] 部分的 NativePackages 數組:
[/Script/Engine.UObjectPackages]
+NativePackages=<ModuleName>
來自 <https://docs.unrealengine.com/zh-CN/Programming/Modules/Gameplay/index.html>
如何實現自定義模塊模板:
注意此處要有兩個必須實現的方法
詳解:
IMPLEMENT_PRIMARY_GAME_MODULE 是什麼呢?
這個宏實現的是什麼呢?
應該把以下這幾個宏放到一起去說。
IMPLEMENT_MODULE
IMPLEMENT_GAME_MODULE
其實是實現常規模塊的模塊實現樣板。
在具體使用的時候,你的C++模塊必須使用這些宏定義。
這個宏用來把模塊的主類暴露給引擎剩下的部分,具體該怎麼解釋呢:
1.InitializeModule函數才能被引擎找到。
2.這個宏會讓模塊從靜態連接轉化爲動態鏈接。
下圖爲源碼:
那個在使用這三個類有什麼場景呢?
IMPLEMENT_PRIMARY_GAME_MODULE 主要的遊戲模塊,最少有1個,部分源碼如下,和IMPLEMENT_GAME_MODULE的區別不大,但是 monolithic mode下是不一樣的!!
IMPLEMENT_MODULE 一般不包含遊戲代碼的模塊
IMPLEMENT_GAME_MODULE 包含遊戲代碼的模塊
下方這兩個宏其實是一毛一樣的哈,就是爲了做個區分
第二個參數是模塊名稱
第一個參數是一個模塊接口
從這裏看其實FDefaultModuleImpl和FDefaultGameModuleImpl就是對IModuleInterface極其簡單的封裝。