ue4 plugin的編譯加載


插件Plugin:

本來應該是指一種純以接口與外界打交道的程序模塊,在同一接口背后可以有多種實現,更換實現完全不影響客戶端代碼(不用重編)。

但是在ue4的世界里,插件似乎不是這個意思,僅僅是一種可以在構建時選擇是否啟用的模塊,在客戶端代碼里充斥着對插件內部函數的調用

只不過這些調用一般要被封裝在簡單的#if WITH_PLUGINXXX之類的宏里

在構建時,若檢測到插件未啟用或不存在,就不會定義相應的宏,於是插件本身不被編譯,調用它的代碼也被清除,各自都相安無事。

 

插件描述符,在ubt里對應類PluginDescriptor,也就是每個插件目錄里的*.uplugin文件

在其中定義了適用的平台、包含的模塊、加載的時機等重要信息,一個插件可以包含多個模塊,每個模塊又可用於不同的目的

如ScriptPlugin這個插件,有3個模塊,一個用於runtime,一個用於editor,還有一個用於unrealheadertool(沒錯,unrealheadertool也支持插件。。可以通過它生成更多的自定義代碼)

{
    "FileVersion" : 3,
    "Version" : 1,
    "VersionName" : "1.0",
    "FriendlyName" : "Script Plugin",
    "Description" : "An example of a script plugin. This can be used as a starting point when creating your own plugin.",
    "Category" : "Examples",
    "CreatedBy" : "Epic Games, Inc.",
    "CreatedByURL" : "http://epicgames.com",
    "DocsURL" : "",
    "MarketplaceURL" : "",
    "SupportURL" : "",
    "EnabledByDefault" : false,
    "CanContainContent" : false,
    "IsBetaVersion" : false,
    "Installed" : false,
    "CanBeUsedWithUnrealHeaderTool" : true,
    
    "Modules" :
    [
        {
            "Name" : "ScriptGeneratorPlugin",
            "Type" : "Program",
            "LoadingPhase" : "PostConfigInit"
        },
        {
            "Name" : "ScriptPlugin",
            "Type" : "Runtime",
            "LoadingPhase" : "PreDefault",
            "BlacklistPlatforms" :
            [
                "Linux"
            ]
        },
        {
            "Name" : "ScriptEditorPlugin",
            "Type" : "Editor",
            "LoadingPhase" : "Default",
            "BlacklistPlatforms" :
            [
                "Linux"
            ]
        }
    ]
}

 

另外,在這里也定義該插件是否默認啟用【PluginDescriptor.bEnabledByDefault】,如啟用的話就會自動包含在任何項目構建中。

而每個項目也可以明確定義了自己需要或屏蔽的插件【ProjectDescriptor.Plugins】,優先級高於前者。

再有就是項目里的每個Target還可以強制指定包含所有插件【TargetRules.bBuildAllPlugins】,優先級又高於前者。比如UE4Editor就強制啟用了所有插件。

 

一旦一個插件決定參與構建,在后續的過程中(包括在運行時),它就跟一般的模塊沒什么區別了。

那插件和模塊到底有什么不同呢?我覺得,就是插件可以方便的配置要不要編進來,而一般模塊的依賴性是固定的,要了模塊A就必須要模塊B,不可能把A配置成可以動態的選擇要不要B,因為如果可以的話,那B其實就是個插件了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM