언리얼 엔진에서
TSubclassOf
를 활용하여 위젯을 생성할 때, 생성 함수인 CreateWidget
에 타입을 명시했는지 여부에 따라 사용 방식이 다르게 적용됨.1. 문제 또는 개념
언리얼 C++에서 UI 위젯을 동적으로 생성할 때
TSubclassOf<class UUserWidget>
와 TSubclassOf<class UPlayerHPWidget>
의 사용 방식이 다르게 나타남. 이 차이는 CreateWidget
호출 시 명확하게 드러남.2. 코드 비교
- 공통 타입 사용 (UUserWidget):
@property(EditAnywhere) TSubclassOf<class UUserWidget> CrossHairUIFactory;
CrossHairUI = CreateWidget(GetWorld(), CrossHairUIFactory);
CrossHairUI->AddToViewport(0);
- 구체 타입 명시 (UPlayerHPWidget):
@property(EditAnywhere, BlueprintReadWrite) TSubclassOf<class UPlayerHPWidget> HPWidgetFactory;
HPWidget = CreateWidget(GetWorld(), HPWidgetFactory);
HPWidget->AddToViewport(0);
3. 핵심 차이점
- UUserWidget 기반: 공통 기반 클래스이므로 생성된 객체는
UUserWidget*
타입으로 반환됨. 위젯 타입이 다양할 수 있어 캐스팅이 필요할 수 있음. - UPlayerHPWidget 명시: 템플릿 인자로 타입을 직접 지정했기 때문에 생성된 객체는
UPlayerHPWidget*
로 바로 반환되며 별도 캐스팅이 필요 없음.
4. 팁 및 주의사항
CreateWidget
의 템플릿 인자를 명시하지 않으면 반환 타입은UUserWidget*
이 되어 하위 기능 접근 시 캐스팅 필요함.- 템플릿을 명시하면 바로 타입 안전하게 사용할 수 있어 코드 가독성과 안정성 증가함.
TSubclassOf
로 생성 가능한 클래스는 반드시UUserWidget
을 상속받아야 하며, 블루프린트에서 생성할 수 있는 클래스여야 함.
5. 요약
TSubclassOf<UUserWidget>
처럼 공통 타입으로 설정하면 위젯 생성 후 캐스팅이 필요할 수 있지만, CreateWidget<타입명>(...)
을 함께 사용하면 구체 타입으로 안전하게 사용 가능함. 반복 사용되는 특정 위젯의 경우, 구체 타입을 명시해두는 것이 유지보수에 더 유리함.