언리얼 엔진 리플렉션 시스템: 런타임 타입 처리 방식
언리얼 엔진은 런타임에 타입 정보를 접근하기 위해 자체 리플렉션 시스템을 사용합니다. 이 시스템은 객체 직렬화, 에디터에서의 속성 표시, C++과 블루프린트 통합, 네트워크 통신 등을 지원합니다. 이 시스템은 Unreal Header Tool을 통한 코드 생성과 두 개의 병렬 타입 계층 구조를 기반으로 구축됩니다.
리플렉션 아키텍처: UHT와 생성된 파일
Unreal Header Tool(UHT)은 C++ 헤더 파일을 스캔하여 UCLASS, UPROPERTY 같은 매크로를 감지하고 타입을 등록하는 코드를 생성합니다. 이 과정에서 두 개의 주요 파일이 생성됩니다:
- .generated.h — 매크로와 전방 선언을 포함합니다.
- .gen.cpp — 수천 줄에 달할 수 있는 타입 등록 코드를 담고 있습니다.
생성된 코드는 속성 이름, 플래그, 메모리 오프셋 등의 메타데이터를 저장합니다. 예를 들어, FAbilityAttribute의 CurrentValue 속성은 STRUCT_OFFSET를 통해 오프셋이 등록되어 엔진이 런타임에 데이터를 직접 접근할 수 있습니다.
두 가지 타입 계층 구조: UObject와 FField
UE5는 성능 최적화를 위해 타입을 설명하는 두 시스템을 사용합니다.
UObject 기반 계층 구조
가비지 컬렉터가 관리하는 이 계층에는 다음이 포함됩니다:
- UClass: C++ 클래스용.
- UFunction: 함수용.
- UScriptStruct: 구조체용.
- UEnum: 열거형용.
FField 기반 계층 구조
UE 4.25에서 오버헤드를 줄이기 위해 도입된 이 계층의 속성은 가비지 컬렉션을 건너뜁니다:
- FField — 기본 클래스.
- FProperty — 개별 속성을 설명, 예: FIntProperty 또는 FFloatProperty.
- 계층 간 연결: UStruct가 FField 속성의 연결 리스트 포인터를 보유합니다.
주요 FField 특징:
- 자식 요소를 연결 리스트로 사용.
- 비트마스크를 통한 빠른 타입 캐스팅을 제공하는 FFieldClass 포함.
- UObject와 FField 포인터를 결합한 FFieldVariant, 하위 비트로 타입 구분.
FProperty 구조: 데이터 접근
FProperty는 메모리 내 속성 처리를 위한 도구를 제공합니다. 핵심 요소:
- Offset_Internal — STRUCT_OFFSET로 계산된 속성의 메모리 오프셋.
- EPropertyFlags — CPF_Edit 같은 플래그로 에디터 동작 등을 제어.
- ContainerPtrToValuePtr 같은 접근 메서드로 직접 읽기/쓰기.
실제 예시:
UAbilityComponent* Comp = ...;
FProperty* HealthProp = Comp->GetClass()->FindPropertyByName(TEXT("HealthAttribute"));
FAbilityAttribute* HealthPtr = HealthProp->ContainerPtrToValuePtr<FAbilityAttribute>(Comp);
float CurrentHealth = HealthPtr->CurrentValue;
리플렉션의 실전 활용
언리얼 엔진 리플렉션 시스템은 핵심 기능을 구동합니다:
- 직렬화 — 파일에서 객체 저장 및 로드.
- 에디터 — Details 패널에서 카테고리와 커스텀 위젯으로 속성 표시.
- 블루프린트 통합 — C++ 속성과 함수를 시각적 스크립팅에 노출.
- 네트워크 복제 — 클라이언트와 서버 간 데이터 동기화.
- 가비지 컬렉션 — 메모리 관리를 위한 객체 소유권 추적.
주요 요약
- 언리얼 엔진 리플렉션은 네이티브 C++ 기능이 아닌 Unreal Header Tool 코드 생성에 의존합니다.
- UObject와 FField 계층 분리로 성능과 메모리 처리가 향상됩니다.
- FProperty의 메모리 오프셋으로 런타임 데이터 접근이 빠릅니다.
- 직렬화, 편집, 네트워킹 등 엔진 핵심 기능을 뒷받침합니다.
- 능력 컴포넌트나 커스텀 에디터 도구 같은 고급 시스템 구축에 리플렉션 마스터가 필수입니다.
— Editorial Team
아직 댓글이 없습니다.