공식 문서를 읽어보면 UClass::StaticClass는 "return a object representing this class at runtime"이라고 합니다.
즉 런타임에 클래스를 나타내는 UClass 객체를 반환 한다고 되어 있습니다.
그럼 UClass객체는 뭔지부터 살펴보기 전에 언리얼을 '프로퍼티 시스템' 혹은 '리플렉션'에 대해서 먼저알아 보도록 하겠습니다.
리플렉션(Reflection)이란?
프로그램 실행시간에 자기 자신을 조사하는 기능입니다. C++에서는 해당 기능을 지원하지 않기 때문에 언리얼에서 자체적으로 만든 시스템입니다. 프로퍼티 시스템이라고도 불립니다.
해당 기능은 언리얼 에디터의 디테일 패널, 직렬화, GC, Network Reflication, 블루프린트/C++ 커뮤니케이션 등 다수의 시스템에 탑재되는 것입니다.
이런 리플리케이션 시스템은 옵션이고, 리플렉션 시스템에 보이도록 하고싶은 유형이 있다면 Property에 주석을 달아두면 UHT가 프로젝트를 컴파일 할 때 정보를 수집합니다.
#include "StrategyTypes.h"
#include "StrategyChar.generated.h"
UCLASS(Abstract)
class AStrategyChar : public ACharacter, public IStrategyTeamInterface
{
GENERATED_UCLASS_BODY()
UPROPERTY(EditAnywhere, Category=Pawn)
int32 ResourcesToGather;
UFUNCTION(BlueprintCallable, Category=Attachment)
void SetWeaponAttachment(class UStrategyAttachment* Weapon);
UFUNCTION(BlueprintCallable, Category=Attachment)
bool IsWeaponAttached();
protected:
UPROPERTY(EditDefaultsOnly, Category=Pawn)
UAnimMontage* MeleeAnim;
UPROPERTY()
UStrategyAttachment* ArmorSlot;
uint8 MyTeamNum;
[이하 코드 생략]
};
UCLASS()메크로를 사용해서 리플렉션 되었음을 알리고 이 메크로는 클래스 내부의 GENERATED_BODY()와 짝을 이룹니다. GENERATED_BODY() 메크로는 리플렉션된 클래스나 구조체에 필수적인데, 클래스 본문에 추가적인 함수나 typedef를 주입해주는 역할을 맡습니다.
CDO?
위같은 과정을 거쳐서 언리얼 오브젝트마다 UClass가 생성된다면 실행초기의 런타임 과정에서는 언리얼 오브젝트마다 UClass의 인스턴스와 함께 언리얼 오브젝트 인스턴스가 생기는데 이것을 CDO라고 합니다.
언리얼에서는 언리얼 오브젝트를 생성할 때마다 초기화를 시키지 않고 해당 CDO에서 복사를 하는 방식으로 최적화를 하고 있습니다.
하나의 언리얼 오브젝트가 만들어지기 위해서는 컴파일 전에 UHT에 의해 헤더 파일을 분석하는 과정이 선행되며 이 과정이 완료되면 Intermediate 폴더에 언리얼 오브젝트의 정보를 담은 메타 데이터 파일이 생성됩니다.(리플렉션)
실제로 해당 폴더에 들어가서 보면은 .generated.h 파일이 생성되어 있는것을 볼 수 있습니다.
제가 공부하고 있는 프로젝트의 LyraCloneExperienceDefinition.h라는 파일의 UCLASS <-> GENERTAED_BODY매크로를 UHT가 분석하여 리플렉션 하여 관련 메타 데이터를 이곳에 저장해 두었겠네용...(아마도?)
StaticClass는 컴파일 타임에 UHT가 분석하여 생성된 UClass타입의 정보(UHT가 분석한 메타 데이터)를 얻어오는 것입니다.
정리하자면
- 리플렉션은 런타임에 자기 자신을 조사(들여다 보게 해주는?)기능을 제공한다.(GC, Blueprint와 호환 등등)
- 언리얼에서는 리플렉션을 위해 .generated.h 파일을 생성한다.(UCLASS, GENERATED_BODY 등과 같은 규칙이 있다)
- .generated.h파일에는 해당 클래스의 타입과 관련된 메타 데이터들이 저장되어 있다.
- StaticClass는 UHT가 분석하여 만든 메타 데이터를 통해 적절한 UClass객체를 반환한다.
참고 자료
https://cafe.naver.com/unrealenginekr/13885
https://www.unrealengine.com/ko/blog/unreal-property-system-reflection
Returns [Ulss]
(APRu위처럼
ntime\CoreUObject\UObject\UC위처럼ass) object representing this class at runtime
Returns a [UClass](API\Runtime\CoreUObject\UObject\UClass) object representing this class at runtime
Returns a [UClass](API\Runtime\CoreUObject\UObject\UClass) object representing this class at runtim
Returns a [UClass](API\Runtime\CoreUObject\UObject\UClass) object representing this class at runtime
Returns a [UClass](API\Runtime\CoreUObject\UObject\UClass) object representing this class at runtime"
'UE5' 카테고리의 다른 글
[UE] ArcheType (0) | 2023.12.31 |
---|---|
[UE] GetOuter() (0) | 2023.12.24 |
[UE] Unreal5 Live Coding쓰면 지양??해야 하는 이유 (+빌드) (0) | 2023.05.02 |
[UE] Unreal5 TObjectPtr<>, TSubclassOf<> 에 대해 (0) | 2023.04.20 |
[UE] Unreal Engine 빌드과정과 BP에서 C++ 로의 변환 (2) | 2023.04.14 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!