[UnrealEngine4] Plugin System學習筆記

posted in: 未分類 | 0

在進行本文之前,推薦先閱讀以下官方文檔:

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

 

dorgon

dorgon

職業:LV3遊戲軟體工程師 為了追尋小時候玩遊戲的感動,而一頭栽入遊戲業界。 本來以撰寫遊戲劇本為主要志向,但回過神來才發現已經踏入程序猿的不歸路。 專長為client端跨平台遊戲開發架構與自動建置流程,主要使用引擎為cocos2d-x與UnrealEngine4。

More Posts - Website

Follow Me:
FacebookLinkedIn

有什麼想法嗎?請發表你的看法