插件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其實就是個插件了。