Choose your operating system:
Windows
macOS
Linux
-
콘텐츠 브라우저 에서 프로젝트의 게임 모드 에 따라 블루프린트 클래스 를 추가할 것입니다. 그러면 그 두 클래스에 노출된 변수를 원하는 값으로 설정하는 것이 가능합니다. 그러기 위해서는:
-
콘텐츠 브라우저 에서 추가 버튼을 클릭합니다.
-
부모 클래스로 HowTo_UMGGameMode 를 선택합니다. "모든 클래스" 섹션에 있을 것입니다.
-
결과 블루프린트 애셋 이름을 "MenuGameMode" 라 합니다.
-
-
게임내에서 마우스 커서를 확인하기 위해서는, 게임 모드 에 했던 것처럼 플레이어 컨트롤러 의 블루프린트 를 만들어 줘야 합니다.
-
다시 콘텐츠 브라우저 에서 추가 버튼을 누릅니다.
-
"일반 클래스" 섹션에서 Player Controller 를 선택합니다.
-
블루프린트 이름을 "MenuPlayerController" 라 합니다.
-
-
"MenuPlayerController" 를 편집합니다.
-
"Show Mouse Cursor" (마우스 커서 표시) 박스를 체크합니다.
-
-
"MenuGameMode" 를 편집합니다.
-
Starting Widget Class (시작 위젯 클래스)는 반드시 "MainMenu" 애셋으로 설정해야 게임 시작시 메뉴가 뜹니다.
-
Default Pawn Class (디폴트 폰 클래스)는 DefaultPawn 이 아닌 Pawn 으로 설정해야 플레이어가 메뉴에 있을 때 날아다니지 않을 것입니다.
-
Player Controller Class (플레이어 컨트롤러 클래스)는 아까 만든 "MenuPlayerController" 애셋으로 설정해야 게임내에서 마우스 커서가 표시됩니다.
-
-
블루프린트 를 사용하려면, 레벨 에디터 창으로 돌아와 세팅 버튼을 통해 현재 레벨 에 대한 월드 세팅 을 변경해야 합니다.
프로젝트 세팅 메뉴에서도 맵 & 모드 아래에서 기본 게임 모드 설정이 가능합니다. 이 방법을 사용하면 별달리 덮어쓰지 않는 한 모든 레벨의 기본 게임 모드
-
월드 세팅 패널 이 열립니다. 기본적으로 디테일 패널 에 도킹되어 있으나, 다른 데로 옮겨도 됩니다. Game Mode Override 칸을 "MenuGameMode" 애셋으로 설정해 줘야 합니다.
이제 레벨에 우리 메인 메뉴를 로드하고, 마우스 커서를 표시하는 플레이어 컨트롤러 를 사용하도록 환경설정된 커스텀 게임 모드 애셋이 적용되었습니다. 이제 게임을 실행하면, Quit 버튼은 예상대로 작동하나, New Game 버튼은 빈 메뉴 화면으로 이동됩니다. 다음 단계에서는 New Game 메뉴를 구성해 주겠습니다.
완성 코드
HowTo_UMG.Build.cs
// Copyright 1998-2018 Epic Games, Inc. All Rights Reserved.
using UnrealBuildTool;
public class HowTo_UMG : ModuleRules
{
public HowTo_UMG(TargetInfo Target)
{
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "UMG" });
//PrivateDependencyModuleNames.AddRange(new string[] { });
// Uncomment if you are using Slate UI
PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });
// Uncomment if you are using online features
// PrivateDependencyModuleNames.Add("OnlineSubsystem");
// if ((Target.Platform == UnrealTargetPlatform.Win32) || (Target.Platform == UnrealTargetPlatform.Win64))
// {
// if (UEBuildConfiguration.bCompileSteamOSS == true)
// {
// DynamicallyLoadedModuleNames.Add("OnlineSubsystemSteam");
// }
// }
}
}
HowTo_UMGGameMode.h
// Copyright 1998-2018 Epic Games, Inc. All Rights Reserved.
#pragma once
#include "Blueprint/UserWidget.h"
#include "GameFramework/GameModeBase.h"
#include "HowTo_UMGGameMode.generated.h"
/**
*
*/
UCLASS()
class HOWTO_UMG_API AHowTo_UMGGameMode : public AGameModeBase
{
GENERATED_BODY()
public:
/** Remove the current menu widget and create a new one from the specified class, if provided. */
UFUNCTION(BlueprintCallable, Category = "UMG Game")
void ChangeMenuWidget(TSubclassOf<UUserWidget> NewWidgetClass);
protected:
/** Called when the game starts. */
virtual void BeginPlay() override;
/** The widget class we will use as our menu when the game starts. */
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UMG Game")
TSubclassOf<UUserWidget> StartingWidgetClass;
/** The widget instance that we are using as our menu. */
UPROPERTY()
UUserWidget* CurrentWidget;
};
HowTo_UMGGameMode.cpp
// Copyright 1998-2018 Epic Games, Inc. All Rights Reserved.
#include "HowTo_UMG.h"
#include "HowTo_UMGGameMode.h"
void AHowTo_UMGGameMode::BeginPlay()
{
Super::BeginPlay();
ChangeMenuWidget(StartingWidgetClass);
}
void AHowTo_UMGGameMode::ChangeMenuWidget(TSubclassOf<UUserWidget> NewWidgetClass)
{
if (CurrentWidget != nullptr)
{
CurrentWidget->RemoveFromViewport();
CurrentWidget = nullptr;
}
if (NewWidgetClass != nullptr)
{
CurrentWidget = CreateWidget<UUserWidget>(GetWorld(), NewWidgetClass);
if (CurrentWidget != nullptr)
{
CurrentWidget->AddToViewport();
}
}
}
HowTo_UMGPlayerController.h
// Copyright 1998-2018 Epic Games, Inc. All Rights Reserved.
#pragma once
#include "GameFramework/PlayerController.h"
#include "HowTo_UMGPlayerController.generated.h"
/**
*
*/
UCLASS()
class HOWTO_UMG_API AHowTo_UMGPlayerController : public APlayerController
{
GENERATED_BODY()
public:
virtual void BeginPlay() override;
};
HowTo_UMGPlayerController.cpp
// Copyright 1998-2018 Epic Games, Inc. All Rights Reserved.
#include "HowTo_UMG.h"
#include "HowTo_UMGPlayerController.h"
void AHowTo_UMGPlayerController::BeginPlay()
{
Super::BeginPlay();
SetInputMode(FInputModeGameAndUI());
}