NetDriverDefinitions

NetDriverDefinitions

#Overview

name: NetDriverDefinitions

The value of this variable can be defined or overridden in .ini config files. 22 .ini config files referencing this setting variable.

It is referenced in 8 C++ source files.

#Summary

#Usage in the C++ source code

The purpose of NetDriverDefinitions is to provide a list of named UNetDriver definitions for the Unreal Engine’s networking system. This variable is crucial for managing different types of network drivers used in the game engine.

NetDriverDefinitions is primarily used by the Engine subsystem, specifically within the networking components. It’s also utilized by plugins such as NetcodeUnitTest and nDisplay, indicating its importance in both core engine functionality and extended features.

The value of this variable is typically set in the engine configuration files. It can be modified programmatically, as seen in the DisplayClusterEditorSettings class where new definitions are added or removed based on cluster replication settings.

This variable interacts closely with other networking-related variables and classes, such as UNetDriver, FNetDriverDefinition, and IpNetDriver. It’s used to define and locate specific network driver configurations.

Developers must be aware that:

  1. Modifying NetDriverDefinitions can have significant impacts on the game’s networking behavior.
  2. Each entry in NetDriverDefinitions represents a specific network driver configuration, including fallback options.
  3. The variable is used in creating and initializing network drivers, so changes here can affect how the game connects and communicates over the network.

Best practices when using this variable include:

  1. Carefully consider the implications before adding or modifying entries.
  2. Ensure that any custom network drivers added to the definitions are properly implemented and compatible with the engine’s networking system.
  3. Use the appropriate methods to modify the definitions, such as through engine configuration files or editor settings, rather than directly manipulating the array in code.
  4. When creating custom network drivers, follow the naming conventions and structure seen in existing definitions.
  5. Be mindful of performance implications when adding multiple network driver definitions, as the engine iterates through this list when creating network drivers.

#Setting Variables

#References In INI files

<Workspace>/Engine/Config/BaseEngine.ini:306, section: [/Script/Engine.Engine]
<Workspace>/Engine/Config/BaseEngine.ini:307, section: [/Script/Engine.Engine]
<Workspace>/Engine/Plugins/Experimental/WebSocketNetworking/Config/BaseWebSocketNetDriver.ini:2, section: [/Script/Engine.GameEngine]
<Workspace>/Engine/Plugins/Experimental/WebSocketNetworking/Config/BaseWebSocketNetDriver.ini:3, section: [/Script/Engine.GameEngine]
<Workspace>/Projects/Lyra/Config/Custom/EOS/DefaultEngine.ini:54, section: [/Script/Engine.Engine]
<Workspace>/Projects/Lyra/Config/Custom/EOS/DefaultEngine.ini:55, section: [/Script/Engine.Engine]
<Workspace>/Projects/Lyra/Config/Custom/EOS/DefaultEngine.ini:56, section: [/Script/Engine.Engine]
<Workspace>/Projects/Lyra/Config/Custom/EOS/DefaultEngine.ini:59, section: [/Script/Engine.GameEngine]
<Workspace>/Projects/Lyra/Config/Custom/EOS/DefaultEngine.ini:60, section: [/Script/Engine.GameEngine]
<Workspace>/Projects/Lyra/Config/Custom/EOS/DefaultEngine.ini:61, section: [/Script/Engine.GameEngine]
<Workspace>/Projects/Lyra/Config/Custom/Steam/DefaultEngine.ini:16, section: [/Script/Engine.Engine]
<Workspace>/Projects/Lyra/Config/Custom/Steam/DefaultEngine.ini:17, section: [/Script/Engine.Engine]
<Workspace>/Projects/Lyra/Config/Custom/Steam/DefaultEngine.ini:18, section: [/Script/Engine.Engine]
<Workspace>/Projects/Lyra/Config/Custom/Steam/DefaultEngine.ini:21, section: [/Script/Engine.GameEngine]
<Workspace>/Projects/Lyra/Config/Custom/Steam/DefaultEngine.ini:22, section: [/Script/Engine.GameEngine]
<Workspace>/Projects/Lyra/Config/Custom/Steam/DefaultEngine.ini:23, section: [/Script/Engine.GameEngine]
<Workspace>/Projects/Lyra/Config/Custom/SteamEOS/DefaultEngine.ini:59, section: [/Script/Engine.Engine]
<Workspace>/Projects/Lyra/Config/Custom/SteamEOS/DefaultEngine.ini:60, section: [/Script/Engine.Engine]
<Workspace>/Projects/Lyra/Config/Custom/SteamEOS/DefaultEngine.ini:61, section: [/Script/Engine.Engine]
<Workspace>/Projects/Lyra/Config/Custom/SteamEOS/DefaultEngine.ini:64, section: [/Script/Engine.GameEngine]
<Workspace>/Projects/Lyra/Config/Custom/SteamEOS/DefaultEngine.ini:65, section: [/Script/Engine.GameEngine]
<Workspace>/Projects/Lyra/Config/Custom/SteamEOS/DefaultEngine.ini:66, section: [/Script/Engine.GameEngine]

#References in C++ code

#Callsites

This variable is referenced in the following C++ source code:

#Loc: <Workspace>/Engine/Plugins/NetcodeUnitTest/NetcodeUnitTest/Source/NetcodeUnitTest/Private/MinimalClient.cpp:757

Scope (from outer to inner):

file
function     void UMinimalClient::CreateNetDriver

Source code excerpt:

		FName UnitDefName = *(FString(TEXT("UnitTestNetDriver_")) + DriverClassName.Mid(ClassLoc+1));

		for (int32 i=0; i<GameEngine->NetDriverDefinitions.Num(); i++)
		{
			if (GameEngine->NetDriverDefinitions[i].DefName == UnitDefName)
			{
				bFoundDef = true;
				break;
			}
		}

#Loc: <Workspace>/Engine/Plugins/NetcodeUnitTest/NetcodeUnitTest/Source/NetcodeUnitTest/Private/MinimalClient.cpp:777

Scope (from outer to inner):

file
function     void UMinimalClient::CreateNetDriver

Source code excerpt:

			NewDriverEntry.DriverClassNameFallback = NewDriverEntry.DriverClassName;

			GameEngine->NetDriverDefinitions.Add(NewDriverEntry);
		}


		FName NewDriverName = *FString::Printf(TEXT("UnitTestNetDriver_%i"), UnitTestNetDriverCount++);

		// Now create a reference to the driver

#Loc: <Workspace>/Engine/Plugins/Runtime/nDisplay/Source/DisplayClusterEditor/Private/Settings/DisplayClusterEditorSettings.cpp:93

Scope (from outer to inner):

file
function     void UDisplayClusterEditorSettings::PostEditChangeProperty

Source code excerpt:

			if (bClusterReplicationEnabled)
			{
				FJsonSerializableArray NetDriverDefinitions;
				NetDriverDefinitions.Add(TEXT("(DefName=GameNetDriver,DriverClassName=/Script/DisplayClusterReplication.DisplayClusterNetDriver,DriverClassNameFallback=/Script/OnlineSubsystemUtils.IpNetDriver)"));
				NetDriverDefinitions.Add(TEXT("(DefName=DemoNetDriver,DriverClassName=/Script/Engine.DemoNetDriver,DriverClassNameFallback=/Script/Engine.DemoNetDriver)"));

				GConfig->SetArray(TEXT("/Script/Engine.GameEngine"), TEXT("+NetDriverDefinitions"), NetDriverDefinitions, DefaultEnginePath);
				GConfig->SetString(TEXT("/Script/DisplayClusterReplication.DisplayClusterNetDriver"), TEXT("NetConnectionClassName"), TEXT("DisplayClusterReplication.DisplayClusterNetConnection"), DefaultEnginePath);
			}
			else
			{
				GConfig->RemoveKey(TEXT("/Script/Engine.GameEngine"), TEXT("!NetDriverDefinitions"), DefaultEnginePath);
				GConfig->RemoveKey(TEXT("/Script/Engine.GameEngine"), TEXT("+NetDriverDefinitions"), DefaultEnginePath);

#Loc: <Workspace>/Engine/Source/Runtime/Engine/Classes/Engine/Engine.h:3094

Scope (from outer to inner):

file
class        class UEngine : public UObject , public FExec

Source code excerpt:

	/** A list of named UNetDriver definitions */
	UPROPERTY(Config, transient)
	TArray<FNetDriverDefinition> NetDriverDefinitions;

	/** A list of Iris NetDriverConfigs */
	UPROPERTY(Config, transient)
	TArray<FIrisNetDriverConfig> IrisNetDriverConfigs;
	
	/** A configurable list of actors that are automatically spawned upon server startup (just prior to InitGame) */

#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/NetDriver.cpp:446

Scope (from outer to inner):

file
namespace    UE::Net

Source code excerpt:

			if (GEngine != nullptr)
			{
				for (const FNetDriverDefinition& CurDef : GEngine->NetDriverDefinitions)
				{
					if (CurDef.DefName != NAME_DemoNetDriver)
					{
						GRequiredEncryptionNetDriverDefNames.Add(CurDef.DefName);
					}
				}

#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/NetDriver.cpp:6063

Scope (from outer to inner):

file
function     void UNetDriver::SetNetDriverDefinition

Source code excerpt:

	NetDriverDefinition = NewNetDriverDefinition;

	if (const FNetDriverDefinition* DriverDef = GEngine->NetDriverDefinitions.FindByPredicate([this](const FNetDriverDefinition& Def) { return (Def.DefName == NetDriverDefinition); }))
	{
		MaxChannelsOverride = DriverDef->MaxChannelsOverride;
	}

	InitPacketSimulationSettings();
}

#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/UnrealEngine.cpp:13877

Scope (from outer to inner):

file
namespace    UE::Private
function     UNetDriver* CreateNetDriver_Local

Source code excerpt:

					OverrideFallback = CurEntryParms[2];
				}
				else if (FNetDriverDefinition* FallbackDef = Engine->NetDriverDefinitions.FindByPredicate(FindTargetDefPred))
				{
					OverrideFallback = FallbackDef->DriverClassNameFallback.ToString();
				}
				else
				{
					OverrideFallback = TEXT("/Script/OnlineSubsystemUtils.IpNetDriver");

#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/UnrealEngine.cpp:13919

Scope (from outer to inner):

file
namespace    UE::Private
function     UNetDriver* CreateNetDriver_Local

Source code excerpt:

#endif
		{
			Definition = Engine->NetDriverDefinitions.FindByPredicate(FindNetDriverDefPred);
		}

		if (Definition != nullptr)
		{
			UClass* NetDriverClass = StaticLoadClass(UNetDriver::StaticClass(), nullptr, *Definition->DriverClassName.ToString(), nullptr,
				LOAD_Quiet);