12:为MainMenuMap创建GameModeBase类和HUD类和playcontroller类。即继承GameModeBase类和HUD类和playcontroller类,playcontroller类是为了将鼠标显示出来,重写HUD类的beginplay函数,并且在begameplay时,创建widget,并addtoviewport,如下图。
13:在MainMenuMap的GamemodeBase类中,设置默认的HUD类成员为12步骤创建的HUD,playcontroller为12创建的类。
14:设置MainMenuMap的默认gamemodebase及hud。如下图:
15:设置mainmenu的button对应的函数,使之点击按钮实现相应的动作,如点击开始按钮,则进入第三人称模板。如下图:
16:设置默认地图,Edit->ProjectSettings,如下图:
到此,设置菜单关卡就已经完成。测试成功如下:
下面贴出涉及到的代码。
MainMenuUserWidget.h
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"
#include "MainMenuUserWidget.generated.h"
/**
*
*/
UCLASS()
class BLOGPROJECT_API UMainMenuUserWidget : public UUserWidget
{
GENERATED_BODY()
UPROPERTY(meta = (BindWidget))
class UButton* StartGameBtn;
UPROPERTY(meta = (BindWidget))
class UButton* SettingBtn;
UPROPERTY(meta = (BindWidget))
class UButton* QuitGameBtn;
virtual bool Initialize() override;
public:
UFUNCTION()
void OnClickedStartGame();
UFUNCTION()
void OnClickedSetting();
UFUNCTION()
void OnClickedQuitGame();
};
MainMenuUserWidget.CPP
// Fill out your copyright notice in the Description page of Project Settings.
#include "MainMenuUserWidget.h"
#include "Components/Button.h"
bool UMainMenuUserWidget::Initialize()
{
Super::Initialize();
if (StartGameBtn != nullptr)
{
StartGameBtn->OnClicked.AddDynamic(this, &UMainMenuUserWidget::OnClickedStartGame);
}
if (SettingBtn != nullptr)
{
SettingBtn->OnClicked.AddDynamic(this, &UMainMenuUserWidget::OnClickedSetting);
}
if (QuitGameBtn != nullptr)
{
QuitGameBtn->OnClicked.AddDynamic(this, &UMainMenuUserWidget::OnClickedQuitGame);
}
return true;
}
void UMainMenuUserWidget::OnClickedStartGame()
{
FString NewMap = FString::Printf(TEXT("/Game/ThirdPersonCPP/Maps/ThirdPersonExampleMap"));
GetWorld()->ServerTravel(NewMap);
}
void UMainMenuUserWidget::OnClickedSetting()
{
UE_LOG(LogTemp, Warning, TEXT("OnClicked Setting"));
}
void UMainMenuUserWidget::OnClickedQuitGame()
{
APlayerController* PC = GetWorld()->GetFirstPlayerController();
if (PC != nullptr)
{
PC->ConsoleCommand(TEXT("quit"));
}
}
MainMenuPlayerController.h
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/PlayerController.h"
#include "MainMenuPlayerController.generated.h"
/**
*
*/
UCLASS()
class BLOGPROJECT_API AMainMenuPlayerController : public APlayerController
{
GENERATED_BODY()
AMainMenuPlayerController();
};
MainMenuPlayerController.cpp
// Fill out your copyright notice in the Description page of Project Settings.
#include "MainMenuPlayerController.h"
AMainMenuPlayerController::AMainMenuPlayerController()
{
bShowMouseCursor = true;
}
MainMenuHUD.h
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/HUD.h"
#include "MainMenuHUD.generated.h"
/**
*
*/
UCLASS()
class BLOGPROJECT_API AMainMenuHUD : public AHUD
{
GENERATED_UCLASS_BODY()
virtual void BeginPlay() override;
private:
TSubclassOf<class UUserWidget> MainMenuWidgetClass;
};
MainMenuHUD.cpp
// Fill out your copyright notice in the Description page of Project Settings.
#include "MainMenuHUD.h"
#include "UObject/ConstructorHelpers.h"
#include "MainMenuUserWidget.h"
AMainMenuHUD::AMainMenuHUD(const FObjectInitializer& Initailizer)
: Super(Initailizer)
{
static ConstructorHelpers::FClassFinder<UUserWidget> MainMenuWidgetBP(TEXT("/Game/ThirdPersonCPP/UI/MainMenu")); // 找到蓝图类
if (MainMenuWidgetBP.Succeeded())
{
MainMenuWidgetClass = MainMenuWidgetBP.Class; // 得到class
}
}
void AMainMenuHUD::BeginPlay()
{
if (MainMenuWidgetClass != nullptr)
{
UMainMenuUserWidget* Widget = CreateWidget<UMainMenuUserWidget>(GetWorld()->GetGameInstance(), MainMenuWidgetClass);
if (Widget != nullptr)
{
Widget->AddToViewport();
}
}
}
MainMenuGameModeBase.h
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/GameModeBase.h"
#include "MainMenuGameModeBase.generated.h"
/**
*
*/
UCLASS()
class BLOGPROJECT_API AMainMenuGameModeBase : public AGameModeBase
{
GENERATED_BODY()
AMainMenuGameModeBase();
};
MainMenuGameModeBase.cpp
// Fill out your copyright notice in the Description page of Project Settings.
#include "MainMenuGameModeBase.h"
#include "MainMenuHUD.h"
#include "MainMenuPlayerController.h"
AMainMenuGameModeBase::AMainMenuGameModeBase()
{
HUDClass = AMainMenuHUD::StaticClass();
PlayerControllerClass = AMainMenuPlayerController::StaticClass();
}