4. 配置游戏模式

  1. Content Browser(内容浏览器) 中,我们会基于项目的 Game Mode(游戏模式) 来添加一个 Blueprint Class(蓝图类) 。 这样我们就可以对这两个类的变量设置任意值了。 我们可以这样操作:

    • 点击 Content Browser(内容浏览器) 上的 Add(添加) 按钮。

    AddNewBPClass.png

    • 选取HowTo_UMGGameMode为父类。 它位于"All Classes"(所有类)部分的列表中。

    PickParentClassForGameModeBP.png

  2. 为了能看到游戏中的鼠标指针,我们需要创建 Player Controller(玩家控制器)Blueprint蓝图 ,正如我们使用 Game Mode(游戏模式) 所操作的那样。

    • 再次点击 Content Browser(内容浏览器) 上的 Add(添加) 按钮。

    • 选择"Common Classes"(常见类)部分的 Player Controller(玩家控制器)

    • Blueprint(蓝图 命名为"MenuPlayerController"。

  3. 编辑"MenuPlayerController"。

    • 勾选"Show Mouse Cursor"(显示鼠标指针)框体。

    GamePlayerController.png

  4. 编辑"MenuGameMode"。

    • 起始的控件类必须被设置为"MainMenu"资源,从而在游戏开始时弹出菜单。

    • 默认Pawn类应该被设置为 Pawn 而不是 DefaultPawn ,这样玩家在处于菜单中时将无法到处移动。

    • 玩家控制器类应被设置为我们创建的"MenuPlayerController"资源,这样在游戏中将可以显示鼠标指针。

    ConfigureGameMode.png

  5. 为了使用 Blueprint(蓝图 ,我们必须返回 Level Editor(关卡编辑器) 窗口并通过 Settings(设置) 按钮来变更我们当前 Level(关卡)World Settings(世界设置)

    WorldSettingsBar.png

    我们也可以在 Project Settings(项目设置) 菜单中设置默认的 Game Mode(游戏模式) ,它位于 Maps and Modes(地图和模式) 部分。 如果您使用这种方式来设置,除非进行单独覆盖,否则您所有的关卡都会被默认设置为您选择的 游戏模式 。 您采用哪种方式,取决于您希望如何设置自己的项目。

  6. 此时将会打开 World Settings Panel(世界设置面板) 。 默认情况下,它会和 Details Panel(详细信息面板) 一起驻留,但可以被移动到其它位置。 我们需要设置Game Mode Override(游戏模式覆盖)域为"MenuGameMode"资源。

    WorldSettings.png


我们自定义的 Game Mode(游戏模式) 资源现在在关卡中生效了,配置为载入主菜单,并使用显示鼠标指针的 Player Controller(玩家控制器) 。 如果我们现在就运行游戏,Quit(退出)按钮会和我们预期一样运行,而点击New Game(新建游戏)按钮会让我们进入空白的菜单屏幕。 接下来我们要设置New Game(新建游戏)菜单。

完成的代码

HowTo_UMG.Build.cs

// Copyright 1998-2017 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[] {  });

        // 如果您正在使用Slate UI则取消注释
        PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });

        // 如果您正在使用在线功能则取消注释
        // PrivateDependencyModuleNames.Add("OnlineSubsystem");
        // if ((Target.Platform == UnrealTargetPlatform.Win32) || (Target.Platform == UnrealTargetPlatform.Win64))
        // {
        //      if (UEBuildConfiguration.bCompileSteamOSS == true)
        //      {
        //          DynamicallyLoadedModuleNames.Add("OnlineSubsystemSteam");
        //      }
        // }
    }
}

HowTo_UMGGameMode.h

// Copyright 1998-2017 Epic Games, Inc. All Rights Reserved.

#pragma once

#include "Blueprint/UserWidget.h"
#include "GameFramework/GameMode.h"
#include "HowTo_UMGGameMode.generated.h"

/**
 * 
 */
UCLASS()
class HOWTO_UMG_API AHowTo_UMGGameMode : public AGameMode
{
    GENERATED_BODY()

public:
    /** 在游戏开始时调用。 */
    virtual void BeginPlay() override;

    /** 移除当前菜单控件并且如果可能,从指定类中创建新控件。 */
    UFUNCTION(BlueprintCallable, Category = "UMG Game")
    void ChangeMenuWidget(TSubclassOf<UUserWidget> NewWidgetClass);

protected:
    /** 在游戏开始时我们将作为菜单使用的控件类。 */
    UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UMG Game")
    TSubclassOf<UUserWidget> StartingWidgetClass;

    /** 用作为菜单的控件实例。 */
    UPROPERTY()
    UUserWidget* CurrentWidget;
};

HowTo_UMGGameMode.cpp

// Copyright 1998-2017 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();
        }
    }
}