Unreal의 Reflection은 프로그램이 실행시간에 자기 자신을 조사하는 기능이다. 이는 엄청나게 유용하고, Unreal Engine 기술의 근간을 이룬다(<- 실제로 언리얼 관계자가 한말!).
UPROPERTY(EditAnywhere, Category = Pawn)
Reflection 시스템은 옵션이다. Reflection 시스템에 등록하기 위해서는 위 코드와 같이 관련 변수나 함수 위에 UENUM()
, UCLASS()
, USTRUCT()
, UFUNCTION()
, UPROPERTY()
와 같은 macro들을 작성해주면, UHT(Unreal Header Tool)
가 그 프로젝트를 컴파일할때 해당 정보를 수집한다.
여기서 “EditAnywhere, Category = Pawn”와 같은 정보를 metadata
라고 하는데, 이런 metadata
들은 에디터와 직접 연동해서 우리가 게임을, 실제 콘텐츠를 제작할 때 활용한다.
모든 변수가 언리얼의 Reflection system에 등록될 필요는 없다. 하지만, reflection된 property가 아닌 것은 해당 reflection에 의존하는 시스템 전부테 보이지 않는다는 점만 주의하자. 참고로, UObject 타입이라고 해서 reflection에 등록되는 것이 아니라 위에서 설명한 macro를 붙여주어야 드디어 reflection system에 등록이 되는 것이다.
Reflection system에 접근하는 방법은 StaticClass()
나 GetClass()
통해 가능하다. Compiletime에는 StaticClass()
, Runtime에는GetClass()
를 사용.
// StaticClass로 접근
#include "MyReflectedObject.h"
// Accessing class information at compile-time
void AccessReflectionAtCompileTime()
{
// Using StaticClass() to get UClass pointer
UClass* Class = UMyReflectedObject::StaticClass();
if (Class)
{
UE_LOG(LogTemp, Log, TEXT("Class Name: %s"), *Class->GetName());
UE_LOG(LogTemp, Log, TEXT("Is Blueprintable: %d"), Class->HasAnyClassFlags(CLASS_Blueprintable));
}
}
StaticClass()
is used at compile-time to get the UClass object representing the class type. This is a static method generated by the Unreal Header Tool (UHT) for all reflected classes.
// GetClass로 접근
#include "MyReflectedObject.h"
// Accessing class information at runtime
void AccessReflectionAtRuntime()
{
// Creating an instance of UMyReflectedObject
UMyReflectedObject* MyObject = NewObject<UMyReflectedObject>();
if (MyObject)
{
// Using GetClass() to get UClass pointer
UClass* Class = MyObject->GetClass();
if (Class)
{
UE_LOG(LogTemp, Log, TEXT("Class Name: %s"), *Class->GetName());
UE_LOG(LogTemp, Log, TEXT("Is Blueprintable: %d"), Class->HasAnyClassFlags(CLASS_Blueprintable));
}
}
}
GetClass()
is used at runtime to get the UClass object of an instance of the class. This method can be used on any UObject instance to get its class type.
언리얼 오브젝트에는 특별한 프로퍼티와 함수를 지정할 수 있다.
UPROPERTY
UFUNCTION
모든 Unreal 오브젝트는 클래스(UClass) 정보와 함께 한다.
클래스를 사용해 자신이 가진 프로퍼티와 함수 정보를 컴파일 타임과 런타임에서 조회할 수 있다.
일반 객체는 new로 동적 할당을 한다면 Unreal 시스템에서는 NewObject()로 동적 할당을 한다.
CDO는 언리얼 객체가 가진 기본 값을 보관하는 template 객체
한 클래스로부터 다수의 물체를 생성해 게임 콘텐츠에 배치할 때 일관성 있게 기본값을 조정하는게 유용.
CDO는 UClass 정보로부터 GerDefaultObject()를 통해 접근 가능.
CDO의 생성 시점은 엔진이 초기화 되는 시점이다. 즉, CDO가 다 만들어지고 우리가 에디터의 UI를 성공적으로 본다고 생각하면 된다.
tip : header 정보를 변경하거나 생성자 정보를 변경하면 editor를 끄고 컴파일 할 것!
2014년도에 작성된 UE Reflection에 관한 글 [링크]