UClass와 Reflection

1000·2020년 12월 4일
0

언리얼 기초 공부

목록 보기
7/16
post-custom-banner

1. UClass

UClass 정보는 컴파일타임이든 런타임이든 원할 때 아무 때나 가져올 수 있습니다.
컴파일타임에서는 언리얼 오브젝트 선언에 있는 StaticClass를 사용하고,
런타임에서는 언리얼 오브젝트 인스턴스에서 GetClass()함수를 사용해 가져올 수 있습니다.
참고로 우리는 StaticClass함수를 선언한 적이 없지만 이 함수는 언리얼 헤더툴에 의해 자동으로 생성됩니다.

아래는 이를 사용해 본 코드입니다. 두 포인터의 값은 동일한 UClass 객체를 가리킵니다.

UClass* ClassInfo1 = WebConnection->GetClass();
UClass* ClassInfo2 = UWebConnection::StaticClass();

2. Reflection

UClass에는 언리얼 오브젝트의 타입 정보를 검색하고 함수를 호출하거나 속성에 값을 설정하는 리플렉션 기능이 있습니다. 다만 이를 위해서는 언리얼 오브젝트 클래스의 멤버 변수에는 UPROPERTY 매크로를 멤버 함수에는 UFUNCTION 매크로를 지정해주어야 합니다.

UClass에 등록된 속성과 함수들은 TFieldIterator에 의해 모두 검색이 가능합니다. UProperty 타입을 사용하면 속성 값만 검색하는 것이 가능하며, 런타임에서 특정 인스턴스에 할당된 속성 값을 가져올 수 있습니다.

for (TFieldIterator<UProperty> It(ClassInfo1); It; ++It)
{

	UE_LOG(Warning, TEXT("Field : %s, Type : %s"), *It->GetName(), *It->GetClass()->GetName());
        UStrProperty* StrProp = FindField<UStrProperty>(ClassInfo1, *It->GetName());
        if (StrProp)
        {
            AB_LOG(Warning, TEXT("Value = %s"), *StrProp->GetPropertyValue_InContainer(WebConnection));
        }

}

함수 목록은 TFieldIterator의 UFuntion을 사용할 수 있으며, 아니면 아래 코드와 같이 NativeFunctionLookupTable 배열을 사용해 현재 클래스에 어떤 C++ 함수가 있는지 파악할 수 있습니다. 함수의 이름만 알면 FindFunctionByName 함수를 사용해 언리얼 함수 객체 UFunction을 얻어올 수 있으며 이를 사용해 특정 인스턴스 내 함수 호출이 가능합니다. 아래는 리플렉션 기능으로 함수를 호출한 예시입니다.

for (const auto& Entry : ClassInfo1->NativeFunctionLookupTable)
{
        AB_LOG(Warning, TEXT("Function = %s"), *Entry.Name.ToString());
        UFunction* Func1 = ClassInfo1->FindFunctionByName(Entry.Name);
        if (Func1->ParmsSize == 0)
        {
            WebConnection->ProcessEvent(Func1, NULL);
        }
}

정리하면, 언리얼 오브젝트 클래스에서 UPROPERTY와 UFUNCTION 매크로로 지정된 멤버 변수와 멤버 함수는 모두 검색이 가능합니다. 그리고 이들 필드의 타입 정보와 이름만 알고 있으면 특정 인스턴스 내 값을 변경하거나 함수를 호출하는 것이 가능합니다.

profile
Game Programming
post-custom-banner

0개의 댓글