위젯을 C++에서 사용하기 위해서 UMG 모듈을 추가해야 한다.
링크에러가 발생한다면 100% 해당 원인이다.
보인 프로젝트명 MyGame.Build.cs 에 가서 꼭 UMG 모듈을 추가해주자
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "UMG" });
1. TSoftObjectPtr 사용 하기
- 에셋에대한 경로만 저장하고, 실제 사용시 에셋을 로드하는 방식.
- 애셋이 실제로 필요할 때까지 로드되지 않습니다. 이를 통해 초기 로드 시간을 단축하고 메모리 사용을 최적화할 수 있다.
#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"
#include "MyGameClass.h"
UPROPERTY(EditAnywhere, Category = "UI")
TSoftObjectPtr<UUserWidget> MyWidgetClass;
void AMyGameClass::LoadMyWidget()
{
if (MyWidgetClass.IsValid())
{
// 동기적으로 로드
UUserWidget* MyWidget = CreateWidget<UUserWidget>(GetWorld(), MyWidgetClass.LoadSynchronous());
if (MyWidget)
{
// 위젯을 화면에 추가
MyWidget->AddToViewport();
}
}
}
2. TSubclassOf 사용하기
- 클래스 타입의 참조를 나타낸다.
- TSubclassOf는 컴파일 시점에 타입이 결정되므로, 관련 클래스는 빌드 시 포함되고, 게임 실행 시 메모리에 로드됩니다.
#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"
#include "MyGameClass.h"
UPROPERTY(EditAnywhere, Category = "UI")
TSubclassOf<UUserWidget> MyWidgetClass;
void AMyGameClass::CreateAndShowWidget()
{
if (MyWidgetClass != nullptr)
{
// 위젯 인스턴스 생성
UUserWidget* MyWidget = CreateWidget<UUserWidget>(GetWorld(), MyWidgetClass);
if (MyWidget != nullptr)
{
// 생성된 위젯을 뷰포트에 추가
MyWidget->AddToViewport();
}
}
}
3. 위젯 리소스 경로로 로드하기
- 에셋을 경로를 가지고로드하기 (사실상 권장하지 않음) / 언리얼 기능을 적극 사용하자.
void AMyGameClass::LoadMyWidget()
{
FString FilePath = TEXT("/Game/Widget/MyWidget.MyWidget_C");
UClass* MyWidgetClass = StaticLoadClass(UUserWidget::StaticClass(), nullptr, *FilePath);
if(MyWidgetClass != nullptr)
{
UUserWidget* pUserWidget = CreateWidget<UUserWidget>(GetWorld(), MyWidgetClass);
if (pUserWidget->IsValidLowLevel())
{
pUserWidget->AddToViewport();
}
}
}'개인적인 팁' 카테고리의 다른 글
| 기본 게임모듈에 StartupModule 등 모듈 함수 등록하기 (0) | 2025.01.02 |
|---|---|
| IInputProcessor : 입력처리 추가 구현시 사용 (0) | 2025.01.02 |
| 언리얼5 특정폴더 Asset 목록 가져오기 (0) | 2024.01.07 |
| 언리얼5 변경된 Input(EnhancedInput) 사용법 c++(2) (0) | 2023.12.31 |
| 언리얼5 변경된 Input(EnhancedInput) 사용법 c++(1) (0) | 2023.12.31 |