在進行本文之前,推薦先閱讀以下官方文檔:
https://wiki.unrealengine.com/An_Introduction_to_UE4_Plugins https://docs.unrealengine.com/latest/INT/Programming/Modules/API/index.html
本文開始:
對於UnrealEngine而言,其實Plugin也是歸於FModuleManager的管理之下。
跟一般Module不同的地方在於其多了${PluginName}.uplugin,
用來描述並管理這個Module的用途,一個簡單的Plugin的結構如下:
其中MyPlugin.uplugin中的檔案內容如下
我們可以看到,在這個MyPlugin之中我建立了3個Module,並在MyPlugin.uplugin之中將『MyPlugin』的Type設為Runtime、『MyDeveloperPlugin』設為Developer、『MyEditorPlugin』設為Editor。
其中Runtime會在任何情況下都會載入、Developer是除了Shipping的build之外都載入、
而Editor如其名,只會在編輯器模式下載入(通常是在做工具時使用)。
而LoadingPhase則是在描述該Module的載入時機點,若沒指明則為Default。如下圖,詳細行為請參考源碼:
Engine/Source/Runtime/Projects/Public/ModuleDescriptor.h。
另外,值得注意的是一個跟Plugin同名的Module是必要的,不然該Plugin將會無法編譯。
(在上面的Case中我們可以看到MyPlugin/Source/下面有一個MyPlugin,再提醒一次,同名Module是必需的。)
在導入完Plugin之後,接著想會要在我們的遊戲中使用。
首先,必須要在我們專案的的Build.cs中加入以下指令,不然會找不到該module的標頭檔:
請注意,在使用任何外部Module之前,必須要先檢查該類別有沒有export給外部的module使用,在unreal engine中,是用以下的宣告型式:
class ${UPPERCASE_MODULE_NAME}_API
下面則為本文中MyPlugin的例子:
class MYPLUGIN_API FMyPlugin : public IModuleInterface class MYDEVELOPERPLUGIN_API FMyDeveloperPlugin : public IModuleInterface class MYEDITORPLUGIN_API FMyEditorPlugin : public IModuleInterface
由於在UnrealEngine中是以folder來區分模組的,
因此${UPPERCASE_MODULE_NAME}其實就是指包含${ModuleName}.Build.cs的Folder名稱。
如下圖,請注意圈起來的地方即為${ModuleName}。
記得,在加入任何code到專案的folder之後,必須要先重新產生專案檔。
先對uproject按右鍵,選取『Generate Visual Studio project files』:
之後就可以在專案中看見並使用:
#include MyPlugin.h; #include MyDeveloperPlugin.h; #include MyEditorPlugin.h; ================================= FMyPlugin::Get().IsAvailable(); #if WITH_EDITOR FMyEditorPlugin::Get().IsAvailable(); #endif //#if WITH_EDITOR #if UE_BUILD_DEVELOPMENT FMyDeveloperPlugin::Get().IsAvailable(); #endif //#if UE_BUILD_DEVELOPMENT
Leave a Reply