언리얼 C++ 프로그래밍

[언리얼 C++] UMG와 UI - Viewport에 위젯 띄우기

언린이 2021. 6. 26. 17:54

1. 모듈 추가

PublicDependencyModuleNames.AddRange(new string[] { 
	"Core", 
    "CoreUObject", 
    "Engine", 
    "InputCore", 
    "UMG"
    });

PrivateDependencyModuleNames.AddRange(new string[] { 
	"Slate", 
    "SlateCore"
    });

언리얼 엔진에서 UMG와 인터페이스를 사용하기 위해서 일단 프로젝트의 Build.cs 파일에서 위에 해당하는 모듈들을 추가해 줘야 합니다.

 

 

2. 위젯 블루프린트 생성

유저 인터페이스 카테고리에서 위젯 블루프린트 클래스를 찾을 수 있습니다.

해당 블루프린트 클래스를 생성하고 더블클릭하면 블루프린트 디자이너 창이 열리며, 여기서 메뉴 레이아웃을 만들 수 있습니다.

 

블루프린트 디자이너 창에서 언리얼 엔진이 제공해주는 여러가지 위젯들을 사용할 수 있습니다.

여러가지 위젯으로 블루프린트를 꾸며준 후 블루프린트의 클래스 세팅에서 C++ 클래스를 부모 클래스로 지정해줍니다.

이번 예제에선 UIMainHUD 클래스를 부모 클래스로 지정해주었습니다.

 

위젯을 배치한 후 위젯의 이름을 설정해줍니다. Is Variable(변수 인지) 탭을 체크하여 블루프린트의 이벤트 그래프에서 해당 위젯을 불러올 수 있습니다.

 

 

3. 생성한 위젯 C++ 클래스에서 사용하기

protected:
	TSubclassOf<UUserWidget> MainHUDWidgetClass;
	UUIMainHUD* MainHUDWidget;

TSubclassOf은 UClass 타입의 안전성을 보장해주는 템플릿 클래스입니다.

TSubclassOf 템플릿 클래스로 생성한 블루프린트 클래스를 받아온 후 부모 클래스로 지정한 C++ 클래스의 객체에 넣어준 후 사용할 것입니다.

 

AMainGameMode::AMainGameMode()
{
	// 블루프린트 클래스를 받아온다
	static ConstructorHelpers::FClassFinder<UUIMainHUD> MainHUDWidgetAsset(TEXT("WidgetBlueprint'/Game/UI/UI_MainHUD.UI_MainHUD_C'"));
	
    // TSubclassOf 템플릿 클래스 객체에 블루프린트 클래스를 넣어준다
	if (MainHUDWidgetAsset.Succeeded())
		MainHUDWidgetClass = MainHUDWidgetAsset.Class;
}

위의 코드처럼 게임 모드 클래스의 생성자에서 블루프린트 클래스를 받아온 후 TSubclassOf 템플릿 클래스 객체에 넣어줍니다.

 

void AMainGameMode::BeginPlay()
{
	Super::BeginPlay();

	if (IsValid(MainHUDWidgetClass))
	{
		MainHUDWidget = Cast<UUIMainHUD>(CreateWidget(GetWorld(), MainHUDWidgetClass));

		if (IsValid(MainHUDWidget))
		{
			// 위젯을 뷰포트에 띄우는 함수
			MainHUDWidget->AddToViewport();
		}
	}
}

그런 다음 게임 모드의 BeginPlay() 함수에서 TSubclassOf 템플릿 클래스 객체를 사용해 위젯을 생성해준 후 뷰포트에 띄워줍니다.

BeginPlay() 함수는 게임 모드 클래스의 월드 배치가 시작할 때 호출되는 함수입니다.

 

 

이렇게 TSubclassOf 템플릿 클래스를 사용하여 개발자가 만든 여러가지 위젯 블루프린트 클래스들을 뷰포트에 띄워줄 수 있습니다.