본문 바로가기
Unreal/Manual

Unreal 하드코딩 된 REGISTER_NAME

by Dev_카페인 2024. 3. 15.
반응형

[Unreal/C++] 하드코딩 된 REGISTER_NAME

 

하드코딩된 네트워킹 코드 또는 매크로를 이용하여 일관성을 유지할 수 있습니다.

 

UnrealNames.inl 파일에서 하드코딩된 이름들을 확인할 수 있습니다.

UnrealNames.h 파일에서는 ## 연산자를 확인할 수 있었습니다.

NAME_##name에서 ##는 문자열 결합 연산자이며, name의 값을 문자열로 변환하여 NAME_과 결합합니다. 예를 들어, name이 "DGram"이라면 NAME_DGram이라는 문자열이 됩니다.

#define REGISTER_NAME(num,name) inline constexpr EName NAME_##name = EName::name;

 

FName이 들어가는 곳이라면 NAME_{REGISTER_NAME}으로 사용가능합니다.

 

 

// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once

#include "CoreTypes.h"

struct FNameEntryId;

//
// Macros.
//

// Define a message as an enumeration.
#define REGISTER_NAME(num,name) name = num,
enum class EName : uint32
{
	// Include all the hard-coded names
	#include "UnrealNames.inl"
	// Special constant for the last hard-coded name index
	MaxHardcodedNameIndex,
};
#undef REGISTER_NAME
// Define aliases for the old-style EName enum syntax
#define REGISTER_NAME(num,name) inline constexpr EName NAME_##name = EName::name;
#include "UnrealNames.inl"
#undef REGISTER_NAME

CORE_API const TCHAR* LexToString(EName Ename);

/** Index of highest hardcoded name to be replicated by index by the networking code
 * @warning: changing this number or making any change to the list of hardcoded names with index
 * less than this value breaks network compatibility, which by default checks for the same changelist
 * @note: names with a greater value than this can still be replicated, but they are sent as
 * strings instead of an efficient index
 *
 * @see ShouldReplicateENameAsInteger()
 */
#define MAX_NETWORKED_HARDCODED_NAME 410

UE_DEPRECATED(5.0, "This function is deprecated, please use ShouldReplicateAsInteger(EName Ename, const class FName& Name) instead.")
inline bool ShouldReplicateAsInteger(EName Ename)
{
	return Ename <= EName(MAX_NETWORKED_HARDCODED_NAME);
}

CORE_API bool ShouldReplicateAsInteger(EName Ename, const class FName& Name);
반응형