홈으로 돌아가기

Unreal Engine의 리플렉션: 타입 시스템 작동 방식

이 기사는 Unreal Header Tool을 통한 코드 생성, UObject 및 FField 계층 아키텍처, 런타임 타입 액세스를 위한 실용적 적용을 포함하여 Unreal Engine 리플렉션 시스템을 설명합니다. 이 자료는 UE5에서 C++ 및 Blueprint으로 작업하는 개발자를 대상으로 합니다.

Unreal Engine의 리플렉션: 개발자를 위한 내부 구조
Advertisement 728x90

언리얼 엔진 리플렉션 시스템: 런타임 타입 처리 방식

언리얼 엔진은 런타임에 타입 정보를 접근하기 위해 자체 리플렉션 시스템을 사용합니다. 이 시스템은 객체 직렬화, 에디터에서의 속성 표시, C++과 블루프린트 통합, 네트워크 통신 등을 지원합니다. 이 시스템은 Unreal Header Tool을 통한 코드 생성과 두 개의 병렬 타입 계층 구조를 기반으로 구축됩니다.

리플렉션 아키텍처: UHT와 생성된 파일

Unreal Header Tool(UHT)은 C++ 헤더 파일을 스캔하여 UCLASS, UPROPERTY 같은 매크로를 감지하고 타입을 등록하는 코드를 생성합니다. 이 과정에서 두 개의 주요 파일이 생성됩니다:

  • .generated.h — 매크로와 전방 선언을 포함합니다.
  • .gen.cpp — 수천 줄에 달할 수 있는 타입 등록 코드를 담고 있습니다.

생성된 코드는 속성 이름, 플래그, 메모리 오프셋 등의 메타데이터를 저장합니다. 예를 들어, FAbilityAttribute의 CurrentValue 속성은 STRUCT_OFFSET를 통해 오프셋이 등록되어 엔진이 런타임에 데이터를 직접 접근할 수 있습니다.

Google AdInline article slot

두 가지 타입 계층 구조: UObject와 FField

UE5는 성능 최적화를 위해 타입을 설명하는 두 시스템을 사용합니다.

UObject 기반 계층 구조

가비지 컬렉터가 관리하는 이 계층에는 다음이 포함됩니다:

  • UClass: C++ 클래스용.
  • UFunction: 함수용.
  • UScriptStruct: 구조체용.
  • UEnum: 열거형용.

FField 기반 계층 구조

UE 4.25에서 오버헤드를 줄이기 위해 도입된 이 계층의 속성은 가비지 컬렉션을 건너뜁니다:

Google AdInline article slot
  • FField — 기본 클래스.
  • FProperty — 개별 속성을 설명, 예: FIntProperty 또는 FFloatProperty.
  • 계층 간 연결: UStruct가 FField 속성의 연결 리스트 포인터를 보유합니다.

주요 FField 특징:

  • 자식 요소를 연결 리스트로 사용.
  • 비트마스크를 통한 빠른 타입 캐스팅을 제공하는 FFieldClass 포함.
  • UObject와 FField 포인터를 결합한 FFieldVariant, 하위 비트로 타입 구분.

FProperty 구조: 데이터 접근

FProperty는 메모리 내 속성 처리를 위한 도구를 제공합니다. 핵심 요소:

  • Offset_Internal — STRUCT_OFFSET로 계산된 속성의 메모리 오프셋.
  • EPropertyFlags — CPF_Edit 같은 플래그로 에디터 동작 등을 제어.
  • ContainerPtrToValuePtr 같은 접근 메서드로 직접 읽기/쓰기.

실제 예시:

Google AdInline article slot
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

Advertisement 728x90

다음 읽기