APawn* ULyraCloneEquipmentInstance::GetTypedPawn(TSubclassOf<APawn> PawnType) const
{
APawn* Result = nullptr;
if (UClass* ActualPawnType = PawnType)
{
if (GetOuter()->IsA(ActualPawnType))
{
Result = Cast<APawn>(GetOuter());
}
}
}
위 코드에서 GetOuter()->IsA(PawnType)을 호출하고 있습니다.
IsA함수는 Returns true if this object is of the specified type.
https://docs.unrealengine.com/4.26/en-US/API/Runtime/CoreUObject/UObject/UObjectBaseUtility/IsA/
GetOuter의 자식으로 만들어진 클래스인지 아닌지를 bool값으로 return하는 함수입니다.
내부 코드를 보면은 UObjectBaseUtility.h에 아래처럼 정의되어 있습니다.
private:
template <typename ClassType>
static FORCEINLINE bool IsChildOfWorkaround(const ClassType* ObjClass, const ClassType* TestCls)
{
return ObjClass->IsChildOf(TestCls);
}
public:
/** Returns true if this object is of the specified type. */
template <typename OtherClassType>
FORCEINLINE bool IsA( OtherClassType SomeBase ) const
{
// We have a cyclic dependency between UObjectBaseUtility and UClass,
// so we use a template to allow inlining of something we haven't yet seen, because it delays compilation until the function is called.
// 'static_assert' that this thing is actually a UClass pointer or convertible to it.
const UClass* SomeBaseClass = SomeBase;
(void)SomeBaseClass;
checkfSlow(SomeBaseClass, TEXT("IsA(NULL) cannot yield meaningful results"));
const UClass* ThisClass = GetClass();
// Stop the compiler doing some unnecessary branching for nullptr checks
UE_ASSUME(SomeBaseClass);
UE_ASSUME(ThisClass);
return IsChildOfWorkaround(ThisClass, SomeBaseClass);
}
먼저, 함수 오버헤드를 막기 위해 강제로 인라인 하겠다는 'FORCEINLINE' 메크로가 보입니다.
짧게 말하면 함수 오버해드를 줄이기 위해 함수 인라인을 '요청'하는 것이 아니라 '강제'한다는 키워드입니다.
다시 이어서 설명하면 매개 변수로 들어온 SomeBase클래스와 GetClass를 통해 런타임 객체의 UClass를 비교하여 ThisClass로 SomeBase클래스가 구현되어 있는지 (자식 클래스인지 아닌지를) 확인하여 bool값으로 결과를 return 하는 것입니다.
(추가적으로 GetClass는 런타임중 실제 객체의 UClass*를 반환하고 StaticClass는 UHT에의해 분석된 컴파일 타임의 UClass*를 반환합니다.)
짧정리 하자면
인자로 들어온 SomeClass와 런타임 UClass*(GetClass())를 비교하여 bool값을 return 한다!입니다.
(C++클래스 상속구조에 대한 개념이 정확히 알고 있어야 이해하기가 빠른듯 합니다...)
https://blog.naver.com/destiny9720/220935635089
'UE5' 카테고리의 다른 글
[UE] Unreal Smart Pointer (0) | 2024.01.23 |
---|---|
[UE] C1189 에러 해결방법 (0) | 2024.01.22 |
[UE] UObject::CreateUObject Delegate 바인딩 언제, 어디서, 왜 쓰는지 (0) | 2024.01.05 |
[UE] UE_INLINE_GENERATED_CPP_BY_NAME + LNK2005 (1) | 2024.01.03 |
[UE] FObjectInitializer (1) | 2024.01.02 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!