Blog

ENGINEERING NOTE

[Unreal Engine] 리플렉션 시스템

리플렉션(Reflection)은 프로그램이 실행시간에 자기 자신을 조사하는 기능입니다. 이는 엄청나게 유용한 데다 언리얼 엔진 테크놀로지의 근간을 이루는 것으로, 에디터의 디테일 패널, 시리얼라이제이션, 가비지 콜렉션, 네트워크 리플리케이션, 블루프린트/C++ 커뮤니케

Unreal Engine

리플렉션 시스템이란?

*리플렉션(Reflection)은 프로그램이 실행시간에 자기 자신을 조사하는 기능입니다. 이는 엄청나게 유용한 데다 언리얼 엔진 테크놀로지의 근간을 이루는 것으로, 에디터의 디테일 패널, 시리얼라이제이션, 가비지 콜렉션, 네트워크 리플리케이션, 블루프린트/C++ 커뮤니케이션 등 다수의 시스템에 탑재된 것입니다. 그러나 C++ 는 어떠한 형태의 리플렉션도 지원하지 않아, 언리얼에는 자체적으로 C++ 클래스, 구조체, 함수, 멤버 변수, 열거형 관련 정보를 수집, 질의, 조작하는 별도의 시스템이 구축되어 있습니다. 전형적으로 이러한 리플렉션은 '프로퍼티 시스템'이라고 부르는데, '리플렉션'은 그래픽 용어이기도 하기 때문입니다.*
*리플리케이션 시스템은 옵션입니다. 리플렉션 시스템에 보이도록 했으면 하는 유형이나 프로퍼티에 주석을 달아주면, Unreal Header Tool (UHT)가 그 프로젝트를 컴파일할 때 해당 정보를 수집합니다.*

오브젝트가 리플렉션을 가지게 하려면 C++ 클래스 헤더 파일에 아래와 같이 특수한 include를 추가해야 한다.

보통은 엔진에서 C++ 클래스를 생성 시 자동으로 추가해준다.

text
// MyActor.h

...

#include "MyActor.generated.h"	// 리플렉션 시스템을 사용
								// 헤더에서 선언된 마지막 include여야 컴파일러에서 오류가 나지 않음.

UCLASS() // 리플렉션된 클래스
class UE5Template AMyActor : public AActor
{
	GENERATED_BODY() 
	
    ...
    
public:
	...
    
    UFUNCTION(BluepirntCallable) // 리플렉션된 함수
	void Testfunction();
    
	UPROPERTY(EditAnywhere) // 리플렉션된 변수
	int32 variable;
};

USTRUCT(Atomic, BlueprintType) // 리플렉션된 구조체
	struct FCustomStruct
	{
		GENERATED_BODY()
	};

UENUM()
enum class ECustomEnum // 리플렉션된 열거형 
{
    ....
};

이렇게 리플렉션이 된 오브젝트는 언리얼 엔진에 존재하는 다양한 시스템들에 활용이 가능하도록 해준다.

  • 네트워크 리플리케이션
  • 블루프린트와 C++의 연동
  • 에디터 내부 기능 활용
  • 시리얼라이제이션
  • 가비지 컬렉션 등