언리얼 엔진에서 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<타입명>(...)을 함께 사용하면 구체 타입으로 안전하게 사용 가능함. 반복 사용되는 특정 위젯의 경우, 구체 타입을 명시해두는 것이 유지보수에 더 유리함.