언어:
페이지 정보
엔진 버전:
언리얼 엔진

4. 게임 모드 환경설정

언리얼 엔진
  1. 콘텐츠 브라우저 에서 프로젝트의 게임 모드 에 따라 블루프린트 클래스 를 추가할 것입니다. 그러면 그 두 클래스에 노출된 변수를 원하는 값으로 설정하는 것이 가능합니다. 그러기 위해서는:

    • 콘텐츠 브라우저 에서 추가 버튼을 클릭합니다.

    AddNewBPClass.png

    • 부모 클래스로 HowTo_UMGGameMode 를 선택합니다. "모든 클래스" 섹션에 있을 것입니다.

    PickParentClassForGameModeBP.png

    • 결과 블루프린트 애셋 이름을 "MenuGameMode" 라 합니다.

  2. 게임내에서 마우스 커서를 확인하기 위해서는, 게임 모드 에 했던 것처럼 플레이어 컨트롤러블루프린트 를 만들어 줘야 합니다.

    • 다시 콘텐츠 브라우저 에서 추가 버튼을 누릅니다.

    • "일반 클래스" 섹션에서 Player Controller 를 선택합니다.

    • 블루프린트 이름을 "MenuPlayerController" 라 합니다.

  3. "MenuPlayerController" 를 편집합니다.

    • "Show Mouse Cursor" (마우스 커서 표시) 박스를 체크합니다.

    GamePlayerController.png

  4. "MenuGameMode" 를 편집합니다.

    • Starting Widget Class (시작 위젯 클래스)는 반드시 "MainMenu" 애셋으로 설정해야 게임 시작시 메뉴가 뜹니다.

    • Default Pawn Class (디폴트 폰 클래스)는 DefaultPawn 이 아닌 Pawn 으로 설정해야 플레이어가 메뉴에 있을 때 날아다니지 않을 것입니다.

    • Player Controller Class (플레이어 컨트롤러 클래스)는 아까 만든 "MenuPlayerController" 애셋으로 설정해야 게임내에서 마우스 커서가 표시됩니다.

    ConfigureGameMode.png

  5. 블루프린트 를 사용하려면, 레벨 에디터 창으로 돌아와 세팅 버튼을 통해 현재 레벨 에 대한 월드 세팅 을 변경해야 합니다.

    WorldSettingsBar.png

    프로젝트 세팅 메뉴에서도 맵 & 모드 아래에서 기본 게임 모드 설정이 가능합니다. 이 방법을 사용하면 별달리 덮어쓰지 않는 한 모든 레벨의 기본 게임 모드 로 설정됩니다. 어느 방법을 사용할지는 프로젝트 구성을 어떻게 할지에 달렸습니다.

  6. 월드 세팅 패널 이 열립니다. 기본적으로 디테일 패널 에 도킹되어 있으나, 다른 데로 옮겨도 됩니다. Game Mode Override 칸을 "MenuGameMode" 애셋으로 설정해 줘야 합니다.

    WorldSettings.png

이제 레벨에 우리 메인 메뉴를 로드하고, 마우스 커서를 표시하는 플레이어 컨트롤러 를 사용하도록 환경설정된 커스텀 게임 모드 애셋이 적용되었습니다. 이제 게임을 실행하면, 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());
}