UE4模塊系統詳解

轉載註明出處

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 代碼,所以需進行一些必要的配置。

  1. 需要在 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極其簡單的封裝。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章