게임 개발/Unreal Engine 기본

[UE4] 리플렉션

지노윈 2022. 2. 8. 16:33
반응형

리플렉션


언리얼 엔진의 리플렉션 기능에 대해 예제 코드로 알아 봅시다.

 

먼저 언리얼 오브젝트 클래스를 만듭니다.

UCLASS()
class TESTPROJECT_API UMyObject : public UObject
{
	GENERATED_BODY()

private:
	UPROPERTY()
	int IntValue = 10;

	UPROPERTY()
	FString StrValue = "Str";
};

UMyObject를 생성하고 리플렉션 기능을 확인 할 수 있는 코드를 생성합니다.

UCLASS()
class TESTPROJECT_API ATestProjectGameModeBase : public AGameModeBase
{
	GENERATED_BODY()

public:
	ATestProjectGameModeBase();
	virtual void StartPlay() override;

private:
	class UMyObject* MyObject;
};
ATestProjectGameModeBase::ATestProjectGameModeBase()
{
    MyObject = CreateDefaultSubobject<UMyObject>(TEXT("MyObject"));
}

void ATestProjectGameModeBase::StartPlay()
{
	Super::StartPlay();

    UClass* Class = MyObject->GetClass();
    // 아래 코드도 동일한 클래스를 얻습니다.
    // UClass* Class = UMyObject::StaticClass();

    for (TFieldIterator<FProperty> FieldIterator(Class); FieldIterator; ++FieldIterator)
    {
        // UMyObject 클래스의 필드 이름과 타입 이름을 출력합니다.
        UE_LOG(TestProject, Warning, TEXT("Field : %s, Type : %s"), *FieldIterator->GetName(), *FieldIterator->GetClass()->GetName());

        FStrProperty* StrProp = FindFProperty<FStrProperty>(Class, *FieldIterator->GetName());
        if (StrProp)
        {
            // FString 필드인 경우 그 값을 출력합니다.
            UE_LOG(TestProject, Warning, TEXT("Value = %s"), *StrProp->GetPropertyValue_InContainer(MyObject));
        }
    }
}

코드의 주석을 살펴 보면 그 동작을 쉽게 이해 할 수 있을 것입니다.

리플렉션 기능을 이용하려면 함수는 UFUNCTION매크로를, 변수는 UPROPERTY 매크로를 지정해주어야 합니다.

 

다음은 언리얼 엔진 Output Log창에 출력된 결과입니다.