본문 바로가기

개인적인 팁

언리얼5 위젯(리소스) c++ 로드 하기 - 3가지

위젯을 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();
		}
	}
}