Class GameDev* SheepAdult

[Unreal Engine 5] TSubclassOf 본문

Unreal Engine

[Unreal Engine 5] TSubclassOf

SheepAdult 2023. 8. 1. 16:46

TSubclassOf는 UClass 유형의 안전성을 보장해 주는 템플릿 클래스이다. 여기서 안전성이란, 사용자가 작업할 때 의도치 않은 클래스를 사용하는 것을 방지해 준다는 말이다. 이 말은 TSubClassOf는 템플릿 클래스이므로 빌드 시점에서 타입 검사가 이루어지기 때문에 런타임 에러의 위험이 없다는 점에서 안전하다는 의미이기도 하다. 

보통 TSubclassOf는 EditAnywhere 등과 같이 에디터에서 직접 넣어주는 용도로 사용한다.

// .h
UPROPERTY(EditAnywhere)
	TSubclassOf<UUserWidget> TestWidgetClass;
   
UPROPERTY()
	class UTestWidget* TestWidget;
    
    
// .cpp
TestWidget = Cast<UTestWidget>(CreateWidget(GetWorld(), TestWidgetClass));

일반적으로 TestWidget을 생성할때 TSubclassOf로 대입된 TestWidgetClass의 클래스를 넣어주는 방식이 사용된다.

그렇다면 여기서 의문은 TestWidgetClass 대신에 TestWidget::StaticClass()를 사용하면 안 되나 하는 의문이 든다. 만약 위젯을 블루프린트로 만들었다면 StaticClass()는 클래스를 불러오는 것이므로 블루프린트는 당연히 사용이 안될 것이다. 모든 작업을 slate 등 C++로 작성했다 하더라도 한 가지 클래스만 지정해서 사용하게 되므로 유연성을 잃을 수 있다.

예를 들어, 하나의 TestWidget에서 여러가지 파생 위젯이 만들어져 있다면, TSubclassOf를 통해서는 원하는 위젯 클래스를 런타임에 동적으로 지정해 줄 수 있는데, StaticClass를 사용하면 if문으로 분기를 만들어주는 등의 방식으로 복잡해질 수 있으며 그로 인해 유연성이 떨어질 수 있다는 말이다.

 

결론 : TSubclassOf는 안정성을 보장하며 동적 지정을 통해 유연성을 가진다.