본문 바로가기
프로그래밍 공부/Unreal Engine 4

[Unreal Engine 일반] 언리얼 프로퍼티(Property) 시스템(리플렉션, reflection)

by 섬댕이 2023. 5. 11.

 

리플렉션(reflection)

리플렉션은 실행시간(runtime)에 어떠한 객체가 자기 자신을 조사하는 기능으로, 표준 C++에서 객체의 다형 정보(dynamic_cast 연산자), 객체의 데이터형 식별(typeid 연산자), typeinfo 클래스 정보로써 나타나는 실행시간 데이터형 정보(runtime type information, RTTI)보다 더 포괄적인 개념으로, 런타임에서 객체의 정보 및 구조를 관리하거나 수정할 수 있도록 하는 기능들까지 포함하는 개념이다.

 

 

게임(엔진) 프로그래밍에 있어서 리플렉션 기능은 왜 필요할까?

 

 

리플렉션 기능이 게임 프로그래밍(특히 엔진 프로그래밍)에서 필수적인 이유는, 컴파일 타임에 만들어지는 객체의 정보 이외에도 런타임에서 객체의 정보들이 새로 추가되거나 수정될 수 있고(게임 에디터에서의 편집 등), 엔진에 기본적으로 포함되지 않는 모듈이 런타임에서 동적 링크(dynamic link library, DLL) 될 수 있기 때문이다. 이러한 부분들은 컴파일 타임에 확인할 수 없는 정보들이기 때문에 엔진이 이를 관리하기 위해서는 런타임에서 객체를 조사할 수 있는 기능이 필요하다(참고 링크)

 

[참고] 리플렉션은 그래픽 용어로써 '반사(反射)' 의 의미도 가지고 있어, 언리얼 엔진에서는 혼동을 피하기 위해 프로그래밍 용어로써 나타낼 때 '프로퍼티 시스템' 이라고 부르기도 한다.

 

 

언리얼 엔진에서는 리플렉션 되는 열거형, 클래스, 구조체, 함수 및 프로퍼티들이 아래와 같은 기능을 자동적으로 가지게 된다는 특징이 있다.

 

  • 에디터 상에 표시될 수 있다.
  • 자동적으로 직렬화(serialization) 된다.
  • 블루프린트/C++ 커뮤니케이션(연동)이 가능해진다.
  • 가비지 컬렉터가 인식할 수 있다(가비지 컬렉터가 레퍼런스를 확인할 수 없는 객체는 제거될 수 있다).
  • 네트워크 리플리케이션(replication) 기능을 사용할 수 있다.

 


 

언리얼 리플렉션(프로퍼티 시스템) 기능의 사용 방법

표준 C++에는 리플렉션 기능이 구현되어있지 않지만, 언리얼 엔진에는 C++ 클래스(UCLASS), 구조체(USTRUCT), 함수(UFUNCTION), 멤버 변수(UPROPERTY), 열거형(UENUM)의 정보를 다룰 수 있는 별도의 시스템이 구축되어있다.

 

우선, 리플렉션 기능을 사용하기 위해서는 헤더 부분에 해당 파일이 '리플렉션이 있는 유형' 이라는 마킹을 해주어야 하는데 이는 파일 상단에 특수한 헤더(generated.h, 아래 참고)를 include 함으로써 이루어진다. 리플렉션이 있는 유형은 이 특수한 헤더를 통해 언리얼 헤더 툴(Unreal header tool, UHT)에 해당 파일을 고려해야 한다는 것과 시스템 구현에 필요하다는 것을 알려준다.

 

 

#include "FileName.generated.h"

  * 중요) 파일 내에 선언되는 모든 멤버들에 대해 리플렉션 기능을 사용 가능하도록 하려면 generated.h 헤더는

              반드시 모든 헤더 중에서 마지막 순서로 include 되어야 한다.

 

 

상기의 특수한 헤더를 include 하면 그 파일 내에서 UENUM(), UCLASS(), USTRUCT(), UFUNCTION(), UPROPERTY() 매크로를 사용하여 열거형, 클래스, 구조체, 함수 및 프로퍼티들에 대한 리플렉션 기능을 사용할 수 있다. 이 매크로 각각은 유형 및 멤버 선언 전에 위치하며, 추가적인 지정자(specifier) 키워드를 담을 수 있다. 

 

또한, 리플렉션 되는 클래스나 구조체에는 GENERATED_UCLASS_BODY() 또는 GENERATED_USTRUCT_BODY() 매크로가 반드시 포함되어야 한다(에디터를 통해 생성하면 C++ 코드 상에 자동으로 추가된다). 이 매크로들은 클래스 본문에 추가적인 함수나 typedef 를 주입하는 역할 등을 수행한다.

 

[정리] 언리얼 엔진은 에디터의 디테일 패널, 자동 직렬화(serialization), 가비지 컬렉션(garbage collection), 네트워크 리플리케이션(replication), 블루프린트/C++ 커뮤니케이션 등과 같은 핵심 기능을 가지고 있고, 이를 수행하기 위해 리플렉션 기능이 사용된다.

 

 


 

* 해당 카테고리의 글은 Unreal Engine 개발사인 Epic Games 사의 Official Site에 있는 Unreal Engine Documentation의 내용에 기반하여 추가적으로 구글링 등을 통해 얻은 정보를 개인적으로 요약/정리해 본 글입니다. 만약 잘못 정리된 내용이 있다면, 댓글이나 이메일로 공유해주시면 수정하도록 하겠습니다.

댓글