반응형
리플렉션
언리얼 엔진의 리플렉션 기능에 대해 예제 코드로 알아 봅시다.
먼저 언리얼 오브젝트 클래스를 만듭니다.
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창에 출력된 결과입니다.
'게임 개발 > Unreal Engine 기본' 카테고리의 다른 글
[UE4] 스마트포인터 - TSharedPtr, TWeakPtr, TUniquePtr (0) | 2022.02.09 |
---|---|
[UE4] 문자열 변환 - FName, FText, String (2) | 2022.02.09 |
[UE4] 문자열 다루기 - FName, FText, String (0) | 2022.02.09 |
[UE4] CDO (Class Default Object) (1) | 2022.02.06 |
[UE4] 언리얼 오브젝트(UObject) (0) | 2022.02.06 |