EnabledPlugins
EnabledPlugins
#Overview
name: EnabledPlugins
The value of this variable can be defined or overridden in .ini config files. 1
.ini config file referencing this setting variable.
It is referenced in 35
C++ source files.
#Summary
#Usage in the C++ source code
The purpose of EnabledPlugins is to manage and track the list of plugins that are currently enabled in an Unreal Engine project. This variable is crucial for various subsystems and modules within the engine to determine which plugins are active and should be loaded or considered during different operations.
Several Unreal Engine subsystems and modules rely on this setting variable, including:
- Asset Registry
- Plugin Manager
- Game Features Subsystem
- Cook On The Fly Server
- Crash Reporting System
- Blueprint System
The value of this variable is typically set by the Plugin Manager during the engine’s initialization process. It’s populated based on various sources such as command-line arguments, project settings, and engine configuration files.
EnabledPlugins often interacts with other variables like DisabledPlugins, ConfiguredPluginNames, and AllPlugins. These variables work together to manage the plugin ecosystem within the engine.
Developers should be aware of the following when using this variable:
- Modifying the list of enabled plugins at runtime can have significant impacts on the engine’s behavior.
- Some plugins may have dependencies on others, which the Plugin Manager handles automatically.
- Enabling or disabling certain plugins may affect performance, available features, or even project compatibility.
Best practices when using this variable include:
- Avoid directly modifying the EnabledPlugins list; instead, use the proper Plugin Manager APIs to enable or disable plugins.
- When developing new systems that need to be aware of active plugins, query the Plugin Manager rather than accessing EnabledPlugins directly.
- Be cautious when enabling plugins via command-line arguments, as this can override project settings and potentially cause conflicts.
- Always test thoroughly after changing the enabled plugins list, as it can have wide-ranging effects on the project.
#Setting Variables
#References In INI files
Location: <Workspace>/Engine/Config/IOS/BaseIOSEngine.ini:90, section: [Plugins]
- INI Section:
Plugins
- Raw value:
Crashlytics
- Is Array:
True
#References in C++ code
#Callsites
This variable is referenced in the following C++ source code:
#Loc: <Workspace>/Engine/Plugins/Editor/AssetReferenceRestrictions/Source/AssetReferenceRestrictions/Private/AssetReferencingDomains.cpp:243
Scope (from outer to inner):
file
function void FDomainDatabase::RebuildFromScratch
Source code excerpt:
// Create the domains for plugins that contain content
DomainsDefinedByPlugins.Reset();
TArray<TSharedRef<IPlugin>> EnabledPlugins = IPluginManager::Get().GetEnabledPlugins();
for (const TSharedRef<IPlugin>& Plugin : EnabledPlugins)
{
// Temporary until NoGameFeatureContent is removed. Don't add dependencies for GFPs that have no content
// other than the GameFeatureData
bool bNoGameFeatureContent = false;
Plugin->GetDescriptorJson()->TryGetBoolField(TEXT("NoGameFeatureContent"), bNoGameFeatureContent);
#Loc: <Workspace>/Engine/Plugins/Editor/PluginBrowser/Source/PluginBrowser/Private/SPluginTile.cpp:592
Scope (from outer to inner):
file
function void SPluginTile::OnEnablePluginCheckboxChanged
Source code excerpt:
{
// Get all the plugins we know about
TArray<TSharedRef<IPlugin>> EnabledPlugins = IPluginManager::Get().GetEnabledPlugins();
// Build a map of plugin by name
TMap<FString, IPlugin*> NameToPlugin;
for (TSharedRef<IPlugin>& EnabledPlugin : EnabledPlugins)
{
NameToPlugin.FindOrAdd(EnabledPlugin->GetName()) = &(EnabledPlugin.Get());
}
// Find all the plugins which are dependent on this plugin
TArray<FString> DependentPluginNames;
for (TSharedRef<IPlugin>& EnabledPlugin : EnabledPlugins)
{
FString EnabledPluginName = EnabledPlugin->GetName();
TSet<FString> Dependencies;
FindPluginDependencies(EnabledPluginName, Dependencies, NameToPlugin);
#Loc: <Workspace>/Engine/Plugins/Runtime/GameFeatures/Source/GameFeatures/Private/GameFeaturesSubsystem.cpp:1919
Scope (from outer to inner):
file
function void UGameFeaturesSubsystem::LoadBuiltInGameFeaturePlugins
Source code excerpt:
FBuiltInPluginLoadTimeTracker PluginLoadTimeTracker;
TArray<TSharedRef<IPlugin>> EnabledPlugins = IPluginManager::Get().GetEnabledPlugins();
LoadContext->Results.Reserve(EnabledPlugins.Num());
for (const TSharedRef<IPlugin>& Plugin : EnabledPlugins)
{
LoadContext->Results.Add(Plugin->GetName(), MakeError("Pending"));
}
const int32 NumPluginsToLoad = EnabledPlugins.Num();
UE_LOG(LogGameFeatures, Log, TEXT("Loading %i builtins"), NumPluginsToLoad);
// Sort the plugins so we can more accurately track how long it takes to load rather than have inconsistent dependency timings.
TArray<TSharedRef<IPlugin>> Dependencies;
auto GetPluginDependencies =
[&Dependencies](TSharedRef<IPlugin> CurrentPlugin)
#Loc: <Workspace>/Engine/Plugins/Runtime/GameFeatures/Source/GameFeatures/Private/GameFeaturesSubsystem.cpp:1951
Scope (from outer to inner):
file
function void UGameFeaturesSubsystem::LoadBuiltInGameFeaturePlugins
Source code excerpt:
return Dependencies;
};
Algo::TopologicalSort(EnabledPlugins, GetPluginDependencies);
for (const TSharedRef<IPlugin>& Plugin : EnabledPlugins)
{
FBuiltInPluginLoadTimeTrackerScope TrackerScope(PluginLoadTimeTracker, Plugin);
LoadBuiltInGameFeaturePlugin(Plugin, AdditionalFilter, FGameFeaturePluginLoadComplete::CreateLambda([LoadContext, Plugin](const UE::GameFeatures::FResult& Result)
{
LoadContext->Results.Add(Plugin->GetName(), Result);
++LoadContext->NumPluginsLoaded;
#Loc: <Workspace>/Engine/Plugins/Runtime/GameFeatures/Source/GameFeatures/Public/GameFeaturesSubsystemSettings.h:26
Scope (from outer to inner):
file
class class UGameFeaturesSubsystemSettings : public UDeveloperSettings
Source code excerpt:
/** List of plugins that are forcibly enabled (e.g., via a hotfix) */
UPROPERTY(config, EditAnywhere, Category = GameFeatures)
TArray<FString> EnabledPlugins;
/** List of plugins that are forcibly disabled (e.g., via a hotfix) */
UPROPERTY(config, EditAnywhere, Category=GameFeatures)
TArray<FString> DisabledPlugins;
/** List of metadata (additional keys) to try parsing from the .uplugin to provide to FGameFeaturePluginDetails */
#Loc: <Workspace>/Engine/Plugins/Tests/PythonAutomationTest/Source/PythonAutomationTest/Private/PythonAutomationTest.cpp:156
Scope (from outer to inner):
file
function void FPythonAutomationTest::GetTests
Source code excerpt:
// Find all files under each plugin dir under /Content/Python
TArray<TSharedRef<IPlugin>> EnabledPlugins = IPluginManager::Get().GetEnabledPlugins();
for (const TSharedRef<IPlugin>& Plugin : EnabledPlugins)
{
const FString PluginContentDir = FPaths::Combine(
FPaths::ConvertRelativePathToFull(Plugin->GetContentDir()),
TEXT("Python"));
SearchForPythonTests(Plugin->GetName(), PluginContentDir, OutBeautifiedNames, OutTestCommands);
#Loc: <Workspace>/Engine/Source/Developer/AssetTools/Private/AssetTools.cpp:4807
Scope (from outer to inner):
file
function void UAssetToolsImpl::PerformMigratePackages
Source code excerpt:
// Fetch the enabled plugins and their mount points
TMap<FName, EPluginLoadedFrom> EnabledPluginToLoadedFrom;
TArray<TSharedRef<IPlugin>> EnabledPlugins = IPluginManager::Get().GetEnabledPluginsWithContent();
for (const TSharedRef<IPlugin>& EnabledPlugin : EnabledPlugins)
{
EnabledPluginToLoadedFrom.Add(FName(EnabledPlugin->GetMountedAssetPath()), EnabledPlugin->GetLoadedFrom());
}
// Find assets in non-Project Plugins
TSet<FName> ShouldMigratePackage;
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Private/CookOnTheFlyServer.cpp:9876
Scope (from outer to inner):
file
function void UCookOnTheFlyServer::WriteCookMetadata
Source code excerpt:
// so we just always write the entire set.
//
TArray<TSharedRef<IPlugin>> EnabledPlugins = IPluginManager::Get().GetEnabledPlugins();
// NOTE: We can't use IsEnabledForPlugin because it has an issue with the AllowTargets list where preventing a plugin on
// a target at the uproject level doesn't get overridden by a dependent plugins' reference. This manifests as packages
// on disk during stage existing but the plugin isn't in the cook manifest. I wasn't able to find a way to fix this
// with the current plugin system, so we include all enabled plugins.
constexpr int32 AdditionalPseudoPlugins = 2; // /Engine and /Game.
if (IntFitsIn<uint16>(EnabledPlugins.Num() + AdditionalPseudoPlugins) == false)
{
UE_LOG(LogCook, Warning, TEXT("Number of plugins exceeds 64k, unable to write cook metadata file (count = %d)"), EnabledPlugins.Num() + AdditionalPseudoPlugins);
}
else
{
TArray<UE::Cook::FCookMetadataPluginEntry> PluginsToAdd;
TMap<FString, uint16> IndexForPlugin;
TArray<uint16> PluginChildArray;
PluginsToAdd.AddDefaulted(EnabledPlugins.Num());
uint16 AddIndex = 0;
for (TSharedRef<IPlugin>& EnabledPlugin : EnabledPlugins)
{
UE::Cook::FCookMetadataPluginEntry& NewEntry = PluginsToAdd[AddIndex];
NewEntry.Name = EnabledPlugin->GetName();
IndexForPlugin.Add(NewEntry.Name, AddIndex);
AddIndex++;
}
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Private/CookOnTheFlyServer.cpp:9960
Scope (from outer to inner):
file
function void UCookOnTheFlyServer::WriteCookMetadata
Source code excerpt:
// Construct the dependency list.
TArray<uint16> RootPlugins;
for (TSharedRef<IPlugin>& EnabledPlugin : EnabledPlugins)
{
uint16 SelfIndex = IndexForPlugin[EnabledPlugin->GetName()];
UE::Cook::FCookMetadataPluginEntry& Entry = PluginsToAdd[SelfIndex];
Entry.Type = UE::Cook::ECookMetadataPluginType::Normal;
// We detect if this would overflow below and cancel the write - so while this could store
#Loc: <Workspace>/Engine/Source/Runtime/AssetRegistry/Private/AssetRegistry.cpp:1139
Scope (from outer to inner):
file
namespace UE::AssetRegistry
function void FAssetRegistryImpl::InitRedirectors
Source code excerpt:
}
TArray<TSharedRef<IPlugin>> EnabledPlugins = IPluginManager::Get().GetEnabledPlugins();
for (const TSharedRef<IPlugin>& Plugin : EnabledPlugins)
{
FString PluginConfigFilename = FString::Printf(TEXT("%s%s/%s.ini"), *FPaths::GeneratedConfigDir(), ANSI_TO_TCHAR(FPlatformProperties::PlatformName()), *Plugin->GetName() );
bool bShouldRemap = false;
if ( !GConfig->GetBool(TEXT("PluginSettings"), TEXT("RemapPluginContentToGame"), bShouldRemap, PluginConfigFilename) )
#Loc: <Workspace>/Engine/Source/Runtime/Core/Internal/GenericPlatform/GenericPlatformCrashContextEx.h:33
Scope: file
Source code excerpt:
CORE_API void CopyGPUBreadcrumbsToSharedCrashContext(FSharedCrashContextEx& InOutSharedContext);
CORE_API void InitializeFromCrashContextEx(const FSessionContext& Context, const TCHAR* EnabledPlugins, const TCHAR* EngineData, const TCHAR* GameData, const FGPUBreadcrumbsSharedContext* GPUBreadcrumbs);
#Loc: <Workspace>/Engine/Source/Runtime/Core/Public/GenericPlatform/GenericPlatformCrashContext.h:392
Scope: file
Source code excerpt:
/** Initialized crash context, using a crash context (e.g. shared from another process). */
CORE_API static void InitializeFromContext(const FSessionContext& Context, const TCHAR* EnabledPlugins, const TCHAR* EngineData, const TCHAR* GameData);
/** Get the current cached session context */
CORE_API static const FSessionContext& GetCachedSessionContext();
/** Gets the current standardized game name for use in a Crash Reporter report. */
CORE_API static FString GetGameName();
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/PluginBlueprintLibrary.cpp:34
Scope (from outer to inner):
file
function TArray<FString> UPluginBlueprintLibrary::GetEnabledPluginNames
Source code excerpt:
TArray<FString> UPluginBlueprintLibrary::GetEnabledPluginNames()
{
const TArray<TSharedRef<IPlugin>> EnabledPlugins =
IPluginManager::Get().GetEnabledPlugins();
TArray<FString> PluginNames;
PluginNames.Reserve(EnabledPlugins.Num());
for (const TSharedRef<IPlugin>& Plugin : EnabledPlugins)
{
PluginNames.Add(Plugin->GetName());
}
return PluginNames;
}
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/UnrealEngine.cpp:1961
Scope (from outer to inner):
file
function void UEngine::Init
Source code excerpt:
if(!FEngineBuildSettings::IsInternalBuild())
{
TArray<TSharedRef<IPlugin>> EnabledPlugins = IPluginManager::Get().GetEnabledPlugins();
for (auto Plugin : EnabledPlugins)
{
const FPluginDescriptor& Desc = Plugin->GetDescriptor();
// encode a minimal plugin description for the crash reporter
FString DescStr;
TSharedRef< TJsonWriter<> > WriterRef = TJsonWriterFactory<>::Create(&DescStr);
#Loc: <Workspace>/Engine/Source/Runtime/Projects/Private/PluginManager.cpp:1399
Scope (from outer to inner):
file
function bool FPluginManager::ConfigureEnabledPlugins
Source code excerpt:
// Set of all the plugins which have been enabled
TMap<FString, FPlugin*> EnabledPlugins;
// Keep a set of all the plugin names that have been configured. We read configuration data from different places, but only configure a plugin from the first place that it's referenced.
TSet<FString> ConfiguredPluginNames;
// Keep the list of newly available localization targets
TArray<FString> AdditionalLocResPaths;
#Loc: <Workspace>/Engine/Source/Runtime/Projects/Private/PluginManager.cpp:1558
Scope (from outer to inner):
file
function bool FPluginManager::ConfigureEnabledPlugins
Source code excerpt:
if (!ConfiguredPluginNames.Contains(EnablePluginName) && !ExceptPlugins.Contains(EnablePluginName) && (!bExceptRestrictedPlugins || !IsRestrictedPlugin(EnablePluginName)))
{
if (!ConfigureEnabledPluginForCurrentTarget(FPluginReferenceDescriptor(EnablePluginName, true), EnabledPlugins,
bAllPluginsEnabledViaCommandLine ? TEXTVIEW("Commandline EnableAllPlugins") : TEXTVIEW("CommandLine EnablePlugins="), AllowedOptionalDependencies))
{
if (bAllPluginsEnabledViaCommandLine)
{
// Plugins may legitimately fail to enable when running with -EnableAllPlugins, but this shouldn't be considered a fatal error
continue;
#Loc: <Workspace>/Engine/Source/Runtime/Projects/Private/PluginManager.cpp:1580
Scope (from outer to inner):
file
function bool FPluginManager::ConfigureEnabledPlugins
Source code excerpt:
if (!ConfiguredPluginNames.Contains(DisablePluginName))
{
if (!ConfigureEnabledPluginForCurrentTarget(FPluginReferenceDescriptor(DisablePluginName, false), EnabledPlugins,
TEXTVIEW("CommandLine DisablePlugins="), AllowedOptionalDependencies))
{
return false;
}
ConfiguredPluginNames.Add(DisablePluginName);
}
#Loc: <Workspace>/Engine/Source/Runtime/Projects/Private/PluginManager.cpp:1596
Scope (from outer to inner):
file
function bool FPluginManager::ConfigureEnabledPlugins
lambda-function
Source code excerpt:
#if READ_TARGET_ENABLED_PLUGINS_FROM_RECEIPT
// Configure the plugins that were enabled or disabled from the target file using the target receipt file
auto ConfigurePluginsFromFirstMatchingTargetFile = [this, &FindFirstMatchingTargetFile, &ConfiguredPluginNames, &EnabledPlugins, &AllowedOptionalDependencies](const TCHAR* BaseDir, bool& bOutError) -> bool
{
const FString ReceiptWildcard = FTargetReceipt::GetDefaultPath(BaseDir, TEXT("*"), FPlatformProcess::GetBinariesSubdirectory(), FApp::GetBuildConfiguration(), nullptr);
FString SourceDescription = FString::Printf(TEXT("Receipt files %s"), *ReceiptWildcard);
TUniquePtr<FTargetReceipt> Receipt = FindFirstMatchingTargetFile(ReceiptWildcard);
if (Receipt.IsValid())
#Loc: <Workspace>/Engine/Source/Runtime/Projects/Private/PluginManager.cpp:1610
Scope (from outer to inner):
file
lambda-function
Source code excerpt:
if (!ConfiguredPluginNames.Contains(PluginName))
{
if (!ConfigureEnabledPluginForCurrentTarget(FPluginReferenceDescriptor(PluginName, bEnabled), EnabledPlugins,
SourceDescription, AllowedOptionalDependencies))
{
bOutError = true;
break;
}
ConfiguredPluginNames.Add(PluginName);
#Loc: <Workspace>/Engine/Source/Runtime/Projects/Private/PluginManager.cpp:1648
Scope (from outer to inner):
file
function bool FPluginManager::ConfigureEnabledPlugins
Source code excerpt:
if (!ConfiguredPluginNames.Contains(TargetEnabledPlugin))
{
if (!ConfigureEnabledPluginForCurrentTarget(FPluginReferenceDescriptor(TargetEnabledPlugin, true), EnabledPlugins,
TEXTVIEW("UBT_TARGET_ENABLED_PLUGINS"), AllowedOptionalDependencies))
{
return false;
}
ConfiguredPluginNames.Add(TargetEnabledPlugin);
}
#Loc: <Workspace>/Engine/Source/Runtime/Projects/Private/PluginManager.cpp:1666
Scope (from outer to inner):
file
function bool FPluginManager::ConfigureEnabledPlugins
Source code excerpt:
if (!ConfiguredPluginNames.Contains(TargetDisabledPlugin))
{
if (!ConfigureEnabledPluginForCurrentTarget(FPluginReferenceDescriptor(TargetDisabledPlugin, false), EnabledPlugins,
TEXTVIEW("UBT_TARGET_ENABLED_PLUGINS"), AllowedOptionalDependencies))
{
return false;
}
ConfiguredPluginNames.Add(TargetDisabledPlugin);
}
#Loc: <Workspace>/Engine/Source/Runtime/Projects/Private/PluginManager.cpp:1678
Scope (from outer to inner):
file
function bool FPluginManager::ConfigureEnabledPlugins
lambda-function
Source code excerpt:
auto ProcessPluginConfigurations =
[&ConfiguredPluginNames, &EnabledPlugins, &AllowedOptionalDependencies, this]
(const TArray<FPluginReferenceDescriptor>& PluginReferences, FStringView SourceDescription)->bool
{
for (const FPluginReferenceDescriptor& PluginReference : PluginReferences)
{
if (!ConfiguredPluginNames.Contains(PluginReference.Name))
{
if (!ConfigureEnabledPluginForCurrentTarget(PluginReference, EnabledPlugins, SourceDescription, AllowedOptionalDependencies))
{
return false;
}
ConfiguredPluginNames.Add(PluginReference.Name);
}
}
#Loc: <Workspace>/Engine/Source/Runtime/Projects/Private/PluginManager.cpp:1726
Scope (from outer to inner):
file
function bool FPluginManager::ConfigureEnabledPlugins
Source code excerpt:
{
if (!ConfigureEnabledPluginForCurrentTarget(FPluginReferenceDescriptor(PluginName, true),
EnabledPlugins, SourceDescription, AllowedOptionalDependencies))
{
return false;
}
ConfiguredPluginNames.Add(PluginName);
}
}
#Loc: <Workspace>/Engine/Source/Runtime/Projects/Private/PluginManager.cpp:1737
Scope (from outer to inner):
file
function bool FPluginManager::ConfigureEnabledPlugins
lambda-function
Source code excerpt:
#if IS_PROGRAM
auto EnableProgramPlugin = [this, &ConfiguredPluginNames, &EnabledPlugins, &AllowedOptionalDependencies](const TCHAR* ConfigEntry, bool bOptionalPlugin) mutable
{
TArray<FString> ProgramPluginNames;
GConfig->GetArray(TEXT("Plugins"), ConfigEntry, ProgramPluginNames, GEngineIni);
FString SourceDescription = FString::Printf(TEXT("Engine.ini:[%s]:ProgramEnabledPlugins"), ConfigEntry);
for (const FString& PluginName : ProgramPluginNames)
#Loc: <Workspace>/Engine/Source/Runtime/Projects/Private/PluginManager.cpp:1750
Scope (from outer to inner):
file
function bool FPluginManager::ConfigureEnabledPlugins
lambda-function
Source code excerpt:
PluginReference.bOptional = bOptionalPlugin;
if (!ConfigureEnabledPluginForCurrentTarget(PluginReference,
EnabledPlugins, SourceDescription, AllowedOptionalDependencies))
{
return false;
}
ConfiguredPluginNames.Add(PluginName);
}
}
#Loc: <Workspace>/Engine/Source/Runtime/Projects/Private/PluginManager.cpp:1805
Scope (from outer to inner):
file
function bool FPluginManager::ConfigureEnabledPlugins
Source code excerpt:
#endif
for (TPair<FString, FPlugin*>& Pair : EnabledPlugins)
{
FPlugin& Plugin = *Pair.Value;
#if !IS_MONOLITHIC
// Mount the binaries directory, and check the modules are valid
if (Plugin.Descriptor.Modules.Num() > 0)
#Loc: <Workspace>/Engine/Source/Runtime/Projects/Private/PluginManager.cpp:1865
Scope (from outer to inner):
file
function bool FPluginManager::ConfigureEnabledPlugins
Source code excerpt:
// look for the existing plugin
FPlugin* FoundPlugin = EnabledPlugins.FindRef(PluginName);
if (FoundPlugin != nullptr)
{
PluginsWithPakFile.AddUnique(TSharedRef<IPlugin>(FoundPlugin));
// and finally mount the plugin's pak
FCoreDelegates::MountPak.Execute(PakPath, 0);
}
#Loc: <Workspace>/Engine/Source/Runtime/Projects/Private/PluginManager.cpp:2176
Scope (from outer to inner):
file
function bool FPluginManager::GetCodePluginsForProject
Source code excerpt:
// Map of all enabled plugins
TMap<FString, FPlugin*> EnabledPlugins;
// Keep a set of all the plugin names that have been configured. We read configuration data from different places, but only configure a plugin from the first place that it's referenced.
TSet<FString> ConfiguredPluginNames;
// Find all the plugin references in the project file
bool bAllowEnginePluginsEnabledByDefault = true;
#Loc: <Workspace>/Engine/Source/Runtime/Projects/Private/PluginManager.cpp:2194
Scope (from outer to inner):
file
function bool FPluginManager::GetCodePluginsForProject
Source code excerpt:
{
if (!ConfigureEnabledPluginForTarget(PluginReference, ProjectDescriptor, FString(), Platform,
Configuration, TargetType, bLoadPluginsForTargetPlatforms, AllPlugins, EnabledPlugins,
AllowedOptionalDependencies, OutResultInfo))
{
return false;
}
ConfiguredPluginNames.Add(PluginReference.Name);
}
#Loc: <Workspace>/Engine/Source/Runtime/Projects/Private/PluginManager.cpp:2211
Scope (from outer to inner):
file
function bool FPluginManager::GetCodePluginsForProject
Source code excerpt:
if (!ConfigureEnabledPluginForTarget(FPluginReferenceDescriptor(PluginPair.Key, true), ProjectDescriptor,
FString(), Platform, Configuration, TargetType, bLoadPluginsForTargetPlatforms, AllPlugins,
EnabledPlugins, AllowedOptionalDependencies, OutResultInfo))
{
return false;
}
ConfiguredPluginNames.Add(PluginPair.Key);
}
}
#Loc: <Workspace>/Engine/Source/Runtime/Projects/Private/PluginManager.cpp:2222
Scope (from outer to inner):
file
function bool FPluginManager::GetCodePluginsForProject
Source code excerpt:
bool bBuildDeveloperTools = (TargetType == EBuildTargetType::Editor || TargetType == EBuildTargetType::Program || (Configuration != EBuildConfiguration::Test && Configuration != EBuildConfiguration::Shipping));
bool bRequiresCookedData = (TargetType != EBuildTargetType::Editor);
for (const TPair<FString, FPlugin*>& Pair : EnabledPlugins)
{
for (const FModuleDescriptor& Module : Pair.Value->GetDescriptor().Modules)
{
if (Module.IsCompiledInConfiguration(Platform, Configuration, FString(), TargetType, bBuildDeveloperTools, bRequiresCookedData))
{
CodePluginNames.Add(Pair.Key);
#Loc: <Workspace>/Engine/Source/Runtime/Projects/Private/PluginManager.cpp:2238
Scope (from outer to inner):
file
function bool FPluginManager::ConfigureEnabledPluginForCurrentTarget
Source code excerpt:
bool FPluginManager::ConfigureEnabledPluginForCurrentTarget(const FPluginReferenceDescriptor& FirstReference,
TMap<FString, FPlugin*>& EnabledPlugins, FStringView SourceOfPluginRequest, const TSet<FString>& AllowedOptionalDependencies)
{
SCOPED_BOOT_TIMING("ConfigureEnabledPluginForCurrentTarget");
FConfigurePluginResultInfo ResultInfo;
if (ConfigureEnabledPluginForTarget(FirstReference, IProjectManager::Get().GetCurrentProject(), UE_APP_NAME,
FPlatformMisc::GetUBTPlatform(), FApp::GetBuildConfiguration(), FApp::GetBuildTargetType(),
(bool)LOAD_PLUGINS_FOR_TARGET_PLATFORMS, AllPlugins, EnabledPlugins, AllowedOptionalDependencies, ResultInfo))
{
return true;
}
#if !IS_MONOLITHIC
// If we're in unattended mode, don't open any windows
#Loc: <Workspace>/Engine/Source/Runtime/Projects/Private/PluginManager.cpp:2406
Scope (from outer to inner):
file
function bool FPluginManager::ConfigureEnabledPluginForTarget
Source code excerpt:
const FProjectDescriptor* ProjectDescriptor, const FString& TargetName, const FString& Platform,
EBuildConfiguration Configuration, EBuildTargetType TargetType, bool bLoadPluginsForTargetPlatforms,
FDiscoveredPluginMap& AllPlugins, TMap<FString, FPlugin*>& EnabledPlugins,
const TSet<FString>& AllowedOptionalDependencies,
FConfigurePluginResultInfo& OutResultInfo)
{
if (EnabledPlugins.Contains(FirstReference.Name))
{
// Already enabled. Just verify the version
if (FirstReference.RequestedVersion.IsSet())
{
UE_CLOG(
(*EnabledPlugins.Find(FirstReference.Name))->GetDescriptor().Version != FirstReference.RequestedVersion.GetValue(),
LogPluginManager, Error,
TEXT("Requested explicit version (v%d) of plugin '%s', but a different version (v%d) was already enabled by another source."),
FirstReference.RequestedVersion.GetValue(), *FirstReference.Name,
(*EnabledPlugins.Find(FirstReference.Name))->GetDescriptor().Version
);
}
return true;
}
// Set of plugin names we've added to the queue for processing, and the plugin that referenced
#Loc: <Workspace>/Engine/Source/Runtime/Projects/Private/PluginManager.cpp:2617
Scope (from outer to inner):
file
function bool FPluginManager::ConfigureEnabledPluginForTarget
Source code excerpt:
#endif
if (!EnabledPlugins.Contains(NextReference.Name) && bIsNewlySeen)
{
NewPluginQueue.Add(&NextReference);
}
}
// Add the plugin
EnabledPlugins.Add(Plugin.GetName(), &Plugin);
}
return true;
}
bool FPluginManager::PromptToDownloadPlugin(const FString& PluginName, const FString& MarketplaceURL)
{
#Loc: <Workspace>/Engine/Source/Runtime/Projects/Private/PluginManager.h:247
Scope (from outer to inner):
file
class class FPluginManager final : public IPluginManager
Source code excerpt:
/** Adds a single enabled plugin, and all its dependencies. If AllowedOptionalDependencies is not empty, only enable optional dependencies that are listed */
bool ConfigureEnabledPluginForCurrentTarget(const FPluginReferenceDescriptor& FirstReference,
TMap<FString, FPlugin*>& EnabledPlugins, FStringView SourceOfPluginRequest, const TSet<FString>& AllowedOptionalDependencies);
/** Adds a single enabled plugin and all its dependencies. If AllowedOptionalDependencies is not empty, only enable optional dependencies that are listed */
static bool ConfigureEnabledPluginForTarget(const FPluginReferenceDescriptor& FirstReference, const FProjectDescriptor* ProjectDescriptor, const FString& TargetName, const FString& Platform, EBuildConfiguration Configuration, EBuildTargetType TargetType, bool bLoadPluginsForTargetPlatforms, FDiscoveredPluginMap& AllPlugins, TMap<FString, FPlugin*>& EnabledPlugins, const TSet<FString>& AllowedOptionalDependencies, FConfigurePluginResultInfo& OutResultInfo);
/** Prompts the user to download a missing plugin from the given URL */
static bool PromptToDownloadPlugin(const FString& PluginName, const FString& MarketplaceURL);
/** Prompts the user to disable a plugin */
static bool PromptToDisableSealedPlugin(const FString& PluginName, const FString& SealedPluginName);