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:

  1. The Blueprint system (UnrealEd module)
  2. The Core Object system (CoreUObject module)
  3. 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:

  1. It’s crucial for maintaining backwards compatibility when renaming or moving classes.
  2. Improper use can lead to redirection loops, which the engine tries to detect and warn about.
  3. It affects asset loading and class resolution throughout the engine.

Best practices when using ClassRedirects include:

  1. Always update ClassRedirects when renaming or moving classes to ensure existing references remain valid.
  2. Be cautious of creating redirection loops, which can cause issues in asset loading and class resolution.
  3. Use it in conjunction with other redirection types (like ObjectRedirects or PackageRedirects) when necessary for comprehensive refactoring.
  4. Regularly review and clean up old redirects that are no longer needed to maintain project cleanliness and reduce overhead.
  5. 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);
			}