언리얼 엔진 리플렉션 시스템
언리얼 엔진 리플렉션 시스템(Unreal Engine Reflection System)은 엔진 및 에디터 함수 기능을 제공하는 다양한 매크로로 클래스를 캡슐화합니다. 언리얼 엔진으로 프로그래밍할 때 표준 C++ 클래스, 함수, 변수를 보유할 수 있습니다. 즉, 언리얼 엔진은 자체적인 리플렉션 시스템과 매크로를 제공하지만, C++의 표준적인 문법과 기능도 그대로 활용할 수 있습니다.
리플렉션(Reflection)이란 프로그램이 실행시간에 자기 자신을 조사하고 동적으로 데이터를 확인하거나 수정할 수 있는 기능을 말합니다. 원래 C++에서는 리플렉션 기능이 없지만, 언리얼 엔진은 자체적인 리플렉션 시스템을 통해 클래스, 구조체, 함수, 멤버 변수, 열거형 등의 정보를 수집하고 이를 질의하거나 조작할 수 있습니다.
이를 통해 블루프린트 통합, 런타임 데이터 접근, 에디터 노출 등이 가능합니다.
- 언리얼에서 오브젝트의 베이스 클래스는 `UObject`입니다. 각 클래스는 새 액터 또는 오브젝트에 대한 템플릿을 정의합니다
언리얼에서 오브젝트의 베이스 클래스는 `UObject`입니다. 모든 언리얼 클래스는 이 `UObect`를 기반으로 하며, 이를 통해 리플렉션 시스템, 직렬화(Serialization), 가비지 컬렉션과 같은 엔진의 핵심기능을 사용할 수 있습니다.
각 클래스는 새로운 액터 또는 오브젝트에 대한 템플릿을 정의하며, 이를 기반으로 실제 인스턴스를 생성하고 활용합니다. - `TSubclassOf`는 `UClass`타입 안전성을 제공하는 템플릿 클래스입니다. 특정 타입에서 파생되는 클래스를 할당할 때 유용합니다. 예를 들어, 블루프린트에 이 변수를 노출하여 플레이어 캐릭터용으로 스폰되는 무기 클래스를 디자이너가 할당할 수도 있습니다.
- 클래스에는 구조체가 포함될 수 있습니다. 구조체란 관련된 멤버 프로퍼티의 정리 및 조작을 도와주는 데이터 구조 입니다. 구조체는 `USTRUCT()`매크로를 사용하여 자체적으로 정의될 수 있습니다.
- 언리얼 스마트 포인터 라이브러리는 메모리 할당 및 트래킹의 부담을 완화하기 위해 설계된 C++ 11 스마트 포인터의 커스텀 구현입니다. 이 구현에는 산업 표준 쉐어드 포인터, 위크 포인터, 고유 포인터 및 null을 허용하지 않는 쉐어드 포인터 같은 역할을 하는 쉐어드 래퍼런스가 포함되어 있습니다.
- 인터페이스는 다수의 클래스나 서루 다른 클래스에서 구현할 수 있는 추가적인 게임플레이 비헤이비어와 함수를 제공합니다. 플레이어 캐릭터는 월드 내 다양한 액터와 상호작용할 수 있습니다. 각 상호작용은 한 이벤트에 대해 서로 다른 반응을 유발할 수 있습니다.
- 메터데이터 지정자는 클래스, 인터페이스, 구조체, 열거형, 함수 또는 프로퍼티가 엔진 및 에디터의 다양한 측면과 상호작용하는 방식을 제어합니다. 각 데이터 구조 또는 멤버 타입에는 자체적인 메타데이터 지정자 목록이 있습니다.
- 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"으로 표시.
리플렉션 시스템의 내부 동작
- 컴파일 시 데이터 수집: UHT가 UCLASS, UPROPERTY 등을 감지하고 메타데이터를 생성합니다.
- 코드 생성: .generated.h 파일에 리플렉션 데이터를 처리하기 위한 코드가 자동 생성됩니다.
- 런타임 활용: 생성된 메타데이터를 통해 런타임 중 속성 접근, 직렬화, 네트워크 복제 등이 가능합니다.
리플렉션 시스템의 한계와 대안
- 리플렉션은 강력하지만, 성능이 중요한 경우에는 신중히 사용해야 합니다.
- 불필요한 리플렉션 매크로 사용을 피하고, 필요한 곳에서만 제한적으로 사용하는 것이 좋습니다.
- 성능이 중요한 경우, 직접적인 데이터 접근 또는 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 |