UE4中創建自定義模塊

UE4中創建自定義模塊

來自專欄 UE4雜貨鋪

在UE4中,有一個非常重要的概念:模塊(有時或者說大多數時候會被成為「Plugin」,但其實個人感覺模塊更合適)。模塊是一些功能相關類的集合,在讀完本片文章之後你可以繼續閱讀關於UE4中多模塊組織的更多知識,請參考官方文檔。

參考文章(英語好的朋友可以直接跳轉,但是原文章使用4.15版本製作,新版本需要進一步修改,可參見本文的後半部分)

注意:前半部分是按照4.15版本,如果您使用的是後續更新的版本(如4.19及以上)請看完,裡面有一些需要注意的地方。

一、4.15版本的步驟(4.19通用,但是需要進一步操作)

想要創建一個自定義模塊,需要一下幾步:

1)修改.uproject文件添加自定義模塊

2)創建自定義模塊相關的文件和文件夾,如.Build.cs、Public和Private文件夾

3)創建模塊類

  • 修改.uproject文件添加自定義模塊

找到工程的.uproject文件右擊使用文本編輯器打開,此處推薦使用VSCode,無論格式還是自動補全都支持比較好。

默認情況下只有工程自帶的模塊,我們需要在大括弧下面添加逗號,之後用另外一個大括弧包含我們自定義的模塊。這裡我添加了一個Runtime的模塊,名稱為MantraModule,下面截圖是完整版的.uproject文件。

接下來我們會創建模塊相關的文件。

  • 創建自定義模塊相關的文件和文件夾

定位到工程目錄,在Source文件夾下創建一個新文件夾,名稱於我們的模塊名保持一致,此處我們命名為MantraModule。(如果你創建的是藍圖的模板,那麼沒有Source文件夾,可以藉助File>New C++ Class,等系統編譯完成之後會自動添加Source文件夾)文件夾內部添加如下文件:

  • 添加一個名稱為Public的文件夾(用於存儲.h文件)
  • 添加一個名稱為Private的文件夾(用於存儲.cpp文件)
  • 添加一個cs文件,命名方式有一定的規則:YourModuleName.Build.cs,此處我們的文件名為MantraModule.Build.cs。

詳情見下圖

打開.cs文件並添加如下代碼:

using UnrealBuildTool;public class MantraModule : ModuleRules{ public MantraModule(ReadOnlyTargetRules Target) : base(Target) { //Public module names that this module uses. //In case you would like to add various classes that youre going to use in your game //you should add the core,coreuobject and engine dependencies. //Dont forget to add your projects name as a dependency (GDBlogPost in my case) PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "EmptyModule" }); //The path for the header files PublicIncludePaths.AddRange(new string[] { "MantraModule/Public" }); //The path for the source files PrivateIncludePaths.AddRange(new string[] { "MantraModule/Private" }); }}

注意:需要根據你的模塊名和工程名進行適當的修改。

  • 創建模塊類

最後一步操作是需要創建一個模塊類(類名和模塊名一摸一樣,此處為MantraModule.h和MantraModule.cpp)用來處理模塊的載入(StartupModule)和卸載(ShutdownModule),主要是藉助一個介面IModuleInterface。

下面是我們完整的.h文件,將之保存在我們之前創建的Public文件夾中。

#pragma once#include "ModuleManager.h"DECLARE_LOG_CATEGORY_EXTERN(MantraModule, All, All);class FMantraModule : public IModuleInterface{public: /* This will get called when the editor loads the module */ virtual void StartupModule() override; /* This will get called when the editor unloads the module */ virtual void ShutdownModule() override;};

接下來創建對應的.cpp文件,並保存到Private文件夾中

#include "MantraModule.h"DEFINE_LOG_CATEGORY(MantraModule);#define LOCTEXT_NAMESPACE "FMantraModule"void FMantraModule::StartupModule(){ UE_LOG(MantraModule, Warning, TEXT("Mantra module has started!"));}void FMantraModule::ShutdownModule(){ UE_LOG(MantraModule, Warning, TEXT("Mantra module has shut down"));}#undef LOCTEXT_NAMESPACEIMPLEMENT_MODULE(FMantraModule, MantraModule)

此處我們實現了.h文件中聲明的兩個方法,並且自定義了一個Log Category,並在載入和下載模塊時列印一條輸出語句,主要用於測試,你也可以在這兩個方法中自定義載入和卸載模塊需要執行的操作。

做完上面這些操作之後,找到.uproject文件,右鍵執行Generate Visual Studio Project Files。之後可以正常的打開工程。工程載入完畢可以在Output Log(Window>Developer Tools>Output Log)中找到我們在StartupModule中的列印輸出。

對於ShutdownModule中的輸出,我們只能關閉工程(模塊默認是關閉工程之後才卸載)才能查看。找到ProjectName/Saved/Logs中最後一個Log文件,可以查看輸出。同時還可以看到其他模塊的卸載,如EmptyModule、RuntimePhysicsXCooking和OculusEditor等等。

整體上的層級結構如下圖所示

所有的一切貌似很OK,但是很不幸,如果你使用的是新版本,如4.19。想死的心都有啦。各種編譯失敗,各種打不開。如果是這樣,那麼請繼續往下看。

二、UE4新版本中需要做的操作

對於UE4新版本,我們還需要進一步操作,否則編譯失敗。

找到ProjectName.Target.cs和ProjectNameEditor.Target.cs(此處我們的名稱分別為EmptyModule.Target.cs和EmptyModuleEditor.Target.cs),這兩個文件主要控制我們需要載入的模塊,在其中的ExtraModuleName中添加我們自定義的模塊,具體操作見下面的代碼

EmptyModule.Target.cs

using UnrealBuildTool;using System.Collections.Generic;public class EmptyModuleTarget : TargetRules{ public EmptyModuleTarget(TargetInfo Target) : base(Target) { Type = TargetType.Game; ExtraModuleNames.AddRange( new string[] { "EmptyModule", "MantraModule" } ); }}

EmptyModuleEditor.Target.cs

using UnrealBuildTool;using System.Collections.Generic;public class EmptyModuleEditorTarget : TargetRules{ public EmptyModuleEditorTarget(TargetInfo Target) : base(Target) { Type = TargetType.Editor; ExtraModuleNames.AddRange( new string[] { "EmptyModule", "MantraModule" } ); }}

修改完這些之後,在重新生成工程文件,然後就應該看到我們執行的結果啦。

這是我們手動創建一個自定義模塊需要的步驟,後面我們會為大家講解如何使用Plugin Manager自動創建這些文件。

歡迎大家加群討論:虛幻社區 524418526


推薦閱讀:

TAG:虛幻4遊戲引擎 | 遊戲引擎 |