4. 配置游戏模式

设置游戏模式以使用主菜单控件。

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

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

    AddNewBPClass.png

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

    PickParentClassForGameModeBP.png

    • 将运算结果的 Blueprint(蓝图) 资源命名为"MenuGameMode"。

  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-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[] {  });

        // 如果您正在使用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-2018 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-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();
        }
    }
}
Select Skin
Light
Dark

Welcome to the new Unreal Engine 4 Documentation site!

We're working on lots of new features including a feedback system so you can tell us how we are doing. It's not quite ready for use in the wild yet, so head over to the Documentation Feedback forum to tell us about this page or call out any issues you are encountering in the meantime.

We'll be sure to let you know when the new system is up and running.

Post Feedback