Language:
Page Info
Engine Version:
The translation of this page is out of date. Please see the English version for the latest version of the page.

4.ゲーム モードの設定

  1. プロジェクトの Game Mode に基づいて、コンテンツ ブラウザBlueprint クラス を追加します。このクラスを追加することにより、この 2 つのクラスに公開された変数に好きな値を設定することができるようになります。以下の方法で実行します。

    • コンテンツ ブラウザ[Add (追加)] ボタンをクリックします。

    AddNewBPClass.png

    • 親クラスに HowTo_UMGGameMode を選びます。クラスが [All Classes (すべてのクラス)] セクションにリスト表示されます。

    PickParentClassForGameModeBP.png

    • 生成された Blueprint アセットに「MenuGameMode」と名前を付けます。

  2. ゲーム内にマウスカーソルを表示するには、Game Mode で作成したように、Player Controller のブループリントを作成しなくてはいけません。

    • コンテンツ ブラウザ で再度 [Add (追加)] ボタンをクリックします。

    • [Common Classes] セクションから [Player Controller] を選びます。

    • ブループリントに「MenuPlayerController」と名前を付けます。

  3. MenuPlayerController を編集します。

    • [Show Mouse Cursor (マウスカーソルを表示)] ボックスをチェックします。

    GamePlayerController.png

  4. MenuGameMode を編集します。

    • ゲームを開始したらメニューが開くように、Starting Widget クラス を MainMenu アセットに設定しなくてはいけません。

    • メニュー内をプレイヤーが飛び回らないように、Default Pawn クラスDefaultPawn ではなく Pawn に設定しなくてはいけません。

    • ゲーム内にマウスカーソルを表示するために、Player Controller クラス を既に作成した MenuPlayerController アセットに設定しなくてはいけません。

    ConfigureGameMode.png

  5. ブループリント を使用するには、[レベル エディタ] ウィンドウへ戻って、Setting (設定) ボタンで現在の レベルWorld Settings (ワールド設定) に変更しなくてはいけません。

    WorldSettingsBar.png

    デフォルトの ゲームモード は、[Maps and Modes] セクションの [Project Settings (プロジェクトの設定)] メニューからも設定出来ます。この設定方法を使用した場合、個別にオーバーライドしない限り、すべてのレベルは選択したゲームモードがデフォルト設定となります。どの方法を使用するかは、プロジェクトをどのように設定するかによって決まります。

  6. World Settings Panel (ワールド設定パネル) が開きます。デフォルトでは [Details] パネル にドッキングしますが、別の場所へ移動することも出来ます。Game Mode Override フィールドを MenuGameMode アセットに設定します。

    WorldSettings.png

カスタムの Game Mode アセットがレベルで有効になって、メインメニューをロードするようになります。マウスカーソルを表示するプレイヤー コントローラーを使用します。ここでゲームを実行すると、[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[] {  });

        // Uncomment if you are using Slate UI (スレート 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-2017 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:
    /** 現在のメニューウィジェットを取り除き、指定されたクラスがあればそこから新しいものを作成します */
    UFUNCTION(BlueprintCallable, Category = "UMG Game")
    void ChangeMenuWidget(TSubclassOf<UUserWidget> NewWidgetClass);

protected:
    /** Called when the game starts. (ゲーム開始時に呼び出されます) */
    virtual void BeginPlay() override;

    /** ゲーム開始時にメニューとして使用するウィジェット クラスです */
    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();
        }
    }
}

HowTo_UMGPlayerController.h

// Copyright 1998-2016 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-2016 Epic Games, Inc. All Rights Reserved.

#include "HowTo_UMG.h"
#include "HowTo_UMGPlayerController.h"

void AHowTo_UMGPlayerController::BeginPlay()
{
    Super::BeginPlay();
    SetInputMode(FInputModeGameAndUI());
}