ClassRedirects
ClassRedirects
#Overview
name: ClassRedirects
The value of this variable can be defined or overridden in .ini config files. 576
.ini config files referencing this setting variable.
It is referenced in 5
C++ source files.
#Summary
#Usage in the C++ source code
The purpose of ClassRedirects is to manage class redirections within Unreal Engine 5. It is primarily used for handling class name changes and maintaining backwards compatibility when classes are renamed or moved.
This setting variable is utilized by multiple Unreal Engine subsystems and modules, including:
- The Blueprint system (UnrealEd module)
- The Core Object system (CoreUObject module)
- The World Partition system (Engine module)
The value of this variable is typically set in configuration files and is populated during engine initialization. In the CoreRedirects system, it’s added to the ConfigKeyMap with the key “ClassRedirects” and associated with the ECoreRedirectFlags::Type_Class flag.
ClassRedirects interacts with other redirection variables such as ObjectRedirects, StructRedirects, EnumRedirects, FunctionRedirects, PropertyRedirects, and PackageRedirects. These variables work together to provide a comprehensive redirection system for various UObject types.
Developers must be aware of the following when using this variable:
- It’s crucial for maintaining backwards compatibility when renaming or moving classes.
- Improper use can lead to redirection loops, which the engine tries to detect and warn about.
- It affects asset loading and class resolution throughout the engine.
Best practices when using ClassRedirects include:
- Always update ClassRedirects when renaming or moving classes to ensure existing references remain valid.
- Be cautious of creating redirection loops, which can cause issues in asset loading and class resolution.
- Use it in conjunction with other redirection types (like ObjectRedirects or PackageRedirects) when necessary for comprehensive refactoring.
- Regularly review and clean up old redirects that are no longer needed to maintain project cleanliness and reduce overhead.
- When working with World Partition, be aware of how ClassRedirects affects the class descriptor registry and asset loading.
#Setting Variables
#References In INI files
<Workspace>/Engine/Config/BaseEngine.ini:347, section: [CoreRedirects]
<Workspace>/Engine/Config/BaseEngine.ini:348, section: [CoreRedirects]
<Workspace>/Engine/Config/BaseEngine.ini:349, section: [CoreRedirects]
<Workspace>/Engine/Config/BaseEngine.ini:350, section: [CoreRedirects]
<Workspace>/Engine/Config/BaseEngine.ini:407, section: [CoreRedirects]
<Workspace>/Engine/Config/BaseEngine.ini:408, section: [CoreRedirects]
<Workspace>/Engine/Config/BaseEngine.ini:409, section: [CoreRedirects]
<Workspace>/Engine/Config/BaseEngine.ini:410, section: [CoreRedirects]
<Workspace>/Engine/Config/BaseEngine.ini:432, section: [CoreRedirects]
<Workspace>/Engine/Config/BaseEngine.ini:433, section: [CoreRedirects]
<Workspace>/Engine/Config/BaseEngine.ini:434, section: [CoreRedirects]
<Workspace>/Engine/Config/BaseEngine.ini:455, section: [CoreRedirects]
<Workspace>/Engine/Config/BaseEngine.ini:456, section: [CoreRedirects]
<Workspace>/Engine/Config/BaseEngine.ini:467, section: [CoreRedirects]
<Workspace>/Engine/Config/BaseEngine.ini:468, section: [CoreRedirects]
<Workspace>/Engine/Config/BaseEngine.ini:469, section: [CoreRedirects]
<Workspace>/Engine/Config/BaseEngine.ini:470, section: [CoreRedirects]
<Workspace>/Engine/Config/BaseEngine.ini:471, section: [CoreRedirects]
<Workspace>/Engine/Config/BaseEngine.ini:472, section: [CoreRedirects]
<Workspace>/Engine/Config/BaseEngine.ini:473, section: [CoreRedirects]
<Workspace>/Engine/Config/BaseEngine.ini:474, section: [CoreRedirects]
<Workspace>/Engine/Config/BaseEngine.ini:475, section: [CoreRedirects]
<Workspace>/Engine/Config/BaseEngine.ini:529, section: [CoreRedirects]
<Workspace>/Engine/Config/BaseEngine.ini:549, section: [CoreRedirects]
<Workspace>/Engine/Config/BaseEngine.ini:550, section: [CoreRedirects]
<Workspace>/Engine/Config/BaseEngine.ini:575, section: [CoreRedirects]
<Workspace>/Engine/Config/BaseEngine.ini:576, section: [CoreRedirects]
<Workspace>/Engine/Config/BaseEngine.ini:580, section: [CoreRedirects]
<Workspace>/Engine/Config/BaseEngine.ini:593, section: [CoreRedirects]
<Workspace>/Engine/Config/BaseEngine.ini:602, section: [CoreRedirects]
<Workspace>/Engine/Config/BaseEngine.ini:603, section: [CoreRedirects]
... omitting 546 locations ...
#References in C++ code
#Callsites
This variable is referenced in the following C++ source code:
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Private/Kismet2/ReloadUtilities.cpp:119
Scope (from outer to inner):
file
namespace UE::Reload::Private
function FReloadClassReinstancer::FReloadClassReinstancer
Source code excerpt:
SetupNewClassReinstancing(InNewClass, InOldClass);
TMap<UObject*, UObject*> ClassRedirects;
ClassRedirects.Add(InOldClass, InNewClass);
for (TObjectIterator<UBlueprint> BlueprintIt; BlueprintIt; ++BlueprintIt)
{
constexpr EArchiveReplaceObjectFlags ReplaceObjectArchFlags = (EArchiveReplaceObjectFlags::IgnoreOuterRef | EArchiveReplaceObjectFlags::IgnoreArchetypeRef);
FArchiveReplaceObjectRef<UObject> ReplaceObjectArch(*BlueprintIt, ClassRedirects, ReplaceObjectArchFlags);
}
}
else
{
RecreateCDOAndSetupOldClassReinstancing(InOldClass);
}
#Loc: <Workspace>/Engine/Source/Runtime/CoreUObject/Private/UObject/CoreRedirects.cpp:573
Scope (from outer to inner):
file
function void FCoreRedirects::Initialize
Source code excerpt:
// Setup map
ConfigKeyMap.Add(TEXT("ObjectRedirects"), ECoreRedirectFlags::Type_Object);
ConfigKeyMap.Add(TEXT("ClassRedirects"), ECoreRedirectFlags::Type_Class);
ConfigKeyMap.Add(TEXT("StructRedirects"), ECoreRedirectFlags::Type_Struct);
ConfigKeyMap.Add(TEXT("EnumRedirects"), ECoreRedirectFlags::Type_Enum);
ConfigKeyMap.Add(TEXT("FunctionRedirects"), ECoreRedirectFlags::Type_Function);
ConfigKeyMap.Add(TEXT("PropertyRedirects"), ECoreRedirectFlags::Type_Property);
ConfigKeyMap.Add(TEXT("PackageRedirects"), ECoreRedirectFlags::Type_Package);
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/WorldPartition/WorldPartitionClassDescRegistry.cpp:253
Scope (from outer to inner):
file
function void FWorldPartitionClassDescRegistry::PrefetchClassDescs
lambda-function
Source code excerpt:
check(AssetData.IsValid());
TSet<FTopLevelAssetPath> ClassRedirects;
while (AssetData.IsRedirector())
{
// Folow the redirector to the destination object
FString DestinationObjectPath;
if (!AssetData.GetTagValue(TEXT("DestinationObject"), DestinationObjectPath))
{
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/WorldPartition/WorldPartitionClassDescRegistry.cpp:278
Scope (from outer to inner):
file
function void FWorldPartitionClassDescRegistry::PrefetchClassDescs
lambda-function
Source code excerpt:
bool bRedirectAlreadyRegistered;
ClassRedirects.Add(FTopLevelAssetPath(AssetData.ToSoftObjectPath().ToString()), &bRedirectAlreadyRegistered);
if (bRedirectAlreadyRegistered)
{
const FString ClassRedirectsLoop = FString::JoinBy(ClassRedirects, TEXT("\n"), [](const FTopLevelAssetPath& RedirectPath) { return FString::Printf(TEXT(" -> %s"), *RedirectPath.ToString()); })
+ FString::Printf(TEXT("\n -> %s"), *FTopLevelAssetPath(AssetData.ToSoftObjectPath().ToString()).ToString());
UE_LOG(LogWorldPartition, Warning, TEXT("Redirector loop detected for '%s' from '%s':\n%s"), *AssetData.ToSoftObjectPath().ToString(), *AssetClassPath.ToString(), *ClassRedirectsLoop);
AssetData = FAssetData();
break;
}
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/WorldPartition/WorldPartitionClassDescRegistry.cpp:297
Scope (from outer to inner):
file
function void FWorldPartitionClassDescRegistry::PrefetchClassDescs
lambda-function
Source code excerpt:
{
// Register redirects
for (const FTopLevelAssetPath& ClassRedirect : ClassRedirects)
{
const FTopLevelAssetPath SourceClassPath(GetAssetDataClassNameForBlueprint(ClassRedirect.ToString()));
const FTopLevelAssetPath RedirectedClassPath(GetAssetDataClassName(AssetData));
RedirectClassMap.Add(SourceClassPath, RedirectedClassPath);
}