Reflection System

2025. 2. 8. 00:18·Unreal/Core Concepts

언리얼 엔진 리플렉션 시스템

언리얼 엔진 리플렉션 시스템(Unreal Engine Reflection System)은 엔진 및 에디터 함수 기능을 제공하는 다양한 매크로로 클래스를 캡슐화합니다. 언리얼 엔진으로 프로그래밍할 때 표준 C++ 클래스, 함수, 변수를 보유할 수 있습니다. 즉, 언리얼 엔진은 자체적인 리플렉션 시스템과 매크로를 제공하지만, C++의 표준적인 문법과 기능도 그대로 활용할 수 있습니다.

리플렉션(Reflection)이란 프로그램이 실행시간에 자기 자신을 조사하고 동적으로 데이터를 확인하거나 수정할 수 있는 기능을 말합니다. 원래 C++에서는 리플렉션 기능이 없지만, 언리얼 엔진은 자체적인 리플렉션 시스템을 통해 클래스, 구조체, 함수, 멤버 변수, 열거형 등의 정보를 수집하고 이를 질의하거나 조작할 수 있습니다.

이를 통해 블루프린트 통합, 런타임 데이터 접근, 에디터 노출 등이 가능합니다.

  1. 언리얼에서 오브젝트의 베이스 클래스는 `UObject`입니다. 각 클래스는 새 액터 또는 오브젝트에 대한 템플릿을 정의합니다

    언리얼에서 오브젝트의 베이스 클래스는 `UObject`입니다. 모든 언리얼 클래스는 이 `UObect`를 기반으로 하며, 이를 통해 리플렉션 시스템, 직렬화(Serialization), 가비지 컬렉션과 같은 엔진의 핵심기능을 사용할 수 있습니다.
    각 클래스는 새로운 액터 또는 오브젝트에 대한 템플릿을 정의하며, 이를 기반으로 실제 인스턴스를 생성하고 활용합니다.

  2. `TSubclassOf`는 `UClass`타입 안전성을 제공하는 템플릿 클래스입니다. 특정 타입에서 파생되는 클래스를 할당할 때 유용합니다. 예를 들어, 블루프린트에 이 변수를 노출하여 플레이어 캐릭터용으로 스폰되는 무기 클래스를 디자이너가 할당할 수도 있습니다.
  3. 클래스에는 구조체가 포함될 수 있습니다. 구조체란 관련된 멤버 프로퍼티의 정리 및 조작을 도와주는 데이터 구조 입니다. 구조체는 `USTRUCT()`매크로를 사용하여 자체적으로 정의될 수 있습니다.
  4. 언리얼 스마트 포인터 라이브러리는 메모리 할당 및 트래킹의 부담을 완화하기 위해 설계된 C++ 11 스마트 포인터의 커스텀 구현입니다. 이 구현에는 산업 표준 쉐어드 포인터, 위크 포인터, 고유 포인터 및 null을 허용하지 않는 쉐어드 포인터 같은 역할을 하는 쉐어드 래퍼런스가 포함되어 있습니다.
  5. 인터페이스는 다수의 클래스나 서루 다른 클래스에서 구현할 수 있는 추가적인 게임플레이 비헤이비어와 함수를 제공합니다. 플레이어 캐릭터는 월드 내 다양한 액터와 상호작용할 수 있습니다. 각 상호작용은 한 이벤트에 대해 서로 다른 반응을 유발할 수 있습니다.
  6. 메터데이터 지정자는 클래스, 인터페이스, 구조체, 열거형, 함수 또는 프로퍼티가 엔진 및 에디터의 다양한 측면과 상호작용하는 방식을 제어합니다. 각 데이터 구조 또는 멤버 타입에는 자체적인 메타데이터 지정자 목록이 있습니다.
  7. UFUNCTION 및 UPROPERTY 매크로는 UE가 새 클래스, 함수, 변수를 인식하게 합니다. 이러한 매크로는 엔진이 수집하는 가비지입니다. 매크로를 지정할때 언리얼 에디터 내에서 편집하고 표시할 수 있습니다.

리플렉션 설정 방법

리플렉션은 아래와 같은 구문이 있다면 UHT(Unreal HJeader Tool)을 통해 해당 프로젝트가 컴파일될 때 정보를 수집해서 조사하게 됩니다

#include "ClassName.generated.h"

 

위와 같은 헤더를 추가하게 된다면 다음 매크로를 사용할 수 있습니다.

  • USTRUCT() : 구조체를 리플렉션에 노출.
  • UCLASS() : 클래스를 리플렉션에 노출.
  • UFUNCTION() : 함수를 리플렉션에 노출.
  • UENUM() : 열거형을 리플렉션에 노출.
  • UPROPERTY() : 변수를 리플렉션에 노출.

메타데이터 지정자 활용

메타데이터 지정자는 클래스, 함수, 변수, 구조체가 에디터 및 엔진에서 동작하는 방식을 제어합니다.

예: 메타데이터 활용

UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Example", meta = (ClampMin = "0.0", ClampMax = "100.0"))
float Health;

UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Example", meta = (DisplayName = "Custom Name"))
int32 Score;
  • `ClampMin`,`ClampMax`: 값을 제한하여 0.0~100.0 범위만 허용
  • `DisplayName`: 에디터에서 "Custom Name"으로 표시.

리플렉션 시스템의 내부 동작

  1. 컴파일 시 데이터 수집: UHT가 UCLASS, UPROPERTY 등을 감지하고 메타데이터를 생성합니다.
  2. 코드 생성: .generated.h 파일에 리플렉션 데이터를 처리하기 위한 코드가 자동 생성됩니다.
  3. 런타임 활용: 생성된 메타데이터를 통해 런타임 중 속성 접근, 직렬화, 네트워크 복제 등이 가능합니다.

리플렉션 시스템의 한계와 대안

  • 리플렉션은 강력하지만, 성능이 중요한 경우에는 신중히 사용해야 합니다.
  • 불필요한 리플렉션 매크로 사용을 피하고, 필요한 곳에서만 제한적으로 사용하는 것이 좋습니다.
  • 성능이 중요한 경우, 직접적인 데이터 접근 또는 FName, FStruct 등을 사용하는 것이 대안이 될 수 있습니다.

정리

언리얼 엔진의 리플렉션 시스템은 엔진의 핵심 요소로, 런타임 데이터 접근, 블루프린트 통합, 에디터 노출 등의 강력한 기능을 제공합니다.
올바르게 사용하면 코드의 확장성과 유연성을 크게 높일 수 있지만, 성능을 고려해 신중하게 활용해야 합니다.

'Unreal > Core Concepts' 카테고리의 다른 글

Interface  (0) 2025.02.07
Actor Lifecycle  (0) 2025.02.04
LEVEL  (0) 2025.01.24
Actor  (0) 2025.01.15
Component  (0) 2025.01.15
'Unreal/Core Concepts' 카테고리의 다른 글
  • Interface
  • Actor Lifecycle
  • LEVEL
  • Actor
Mr.Vulpes
Mr.Vulpes
여우비가 내리는 시간입니다.
  • Mr.Vulpes
    여우비 개발실
    Mr.Vulpes
  • 전체
    오늘
    어제
    • Browse All Categories (31) N
      • Unreal (9)
        • Core Concepts (6)
        • Unreal For C++ (3)
      • C++ Programming (1)
        • C Basic (1)
      • DirectX (1)
      • Math & Physics (3)
        • Vectors (3)
      • Software Engineering (17) N
        • Software Development Princi.. (13) N
        • Design Pattern (3)
  • hELLO· Designed By정상우.v4.10.3
Mr.Vulpes
Reflection System
상단으로

티스토리툴바