虚幻引擎_C++_游戏开始菜单

如果要做一个开始菜单,实现的方法有很多

最佳实践:

  1. 创建一个MainMenuWidget, 继承自UUserWidget类, 然后再创建对应子类BP_MainMenuWidget

  2. 创建一个MainMenuLevel关卡, 专门用于播放开始菜单

  3. 为这个关卡创建一个MainMenuGameMode类,继承自GameModeBase类, 在创建对应子类BP_MainMenuGameMode

  4. 为这个MainMenuLevel关卡挂载这个游戏模式类

5.在MainMenuGameMode游戏模式类中, 创建MainMenuWidget蓝图子类

这就是最佳架构!

MainMenuWidget.h

cpp 复制代码
#pragma once

#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"
#include "Components/Button.h"
#include "MainMenuWidget.generated.h"

UCLASS()
class BATTLEBLASTER_API UMainMenuWidget : public UUserWidget
{
	GENERATED_BODY()

protected:
	// meta = (BindWidget) 必须确保蓝图中按钮的名字与此处变量名完全一致
	UPROPERTY(meta = (BindWidget))
	UButton* BtnSinglePlayer;

	UPROPERTY(meta = (BindWidget))
	UButton* BtnTwoPlayers;

	UPROPERTY(meta = (BindWidget))
	UButton* BtnQuitGame;

	// 必须重写此函数来绑定点击事件
	virtual void NativeConstruct() override;

	// 点击回调函数
	UFUNCTION()
	void OnSinglePlayerClicked();

	UFUNCTION()
	void OnTwoPlayersClicked();

	UFUNCTION()
	void OnQuitClicked();
};

MainMenuWidget.cpp

cpp 复制代码
#include "MainMenuWidget.h"
#include "Kismet/GameplayStatics.h"
#include "Kismet/KismetSystemLibrary.h"

void UMainMenuWidget::NativeConstruct()
{
	Super::NativeConstruct();

	// 绑定回调函数
	if (BtnSinglePlayer)
		BtnSinglePlayer->OnClicked.AddDynamic(this, &UMainMenuWidget::OnSinglePlayerClicked);

	if (BtnTwoPlayers)
		BtnTwoPlayers->OnClicked.AddDynamic(this, &UMainMenuWidget::OnTwoPlayersClicked);

	if (BtnQuitGame)
		BtnQuitGame->OnClicked.AddDynamic(this, &UMainMenuWidget::OnQuitClicked);
}

void UMainMenuWidget::OnSinglePlayerClicked()
{
	// 跳转到游戏关卡,并传递单人参数
	UGameplayStatics::OpenLevel(GetWorld(), TEXT("SinglePlayerLevel_1"), true, TEXT("Players=1"));
}

void UMainMenuWidget::OnTwoPlayersClicked()
{
	// 跳转到游戏关卡,并传递双人参数
	UGameplayStatics::OpenLevel(GetWorld(), TEXT("Level_1"), true, TEXT("Players=2"));
}

void UMainMenuWidget::OnQuitClicked()
{
	// 退出游戏逻辑
	UKismetSystemLibrary::QuitGame(GetWorld(), GetOwningPlayer(), EQuitPreference::Quit, false);
}

MainMenuGameMode.h

cpp 复制代码
#pragma once

#include "CoreMinimal.h"
#include "GameFramework/GameModeBase.h"
#include "MainMenuGameMode.generated.h"

UCLASS()
class BATTLEBLASTER_API AMainMenuGameMode : public AGameModeBase
{
	GENERATED_BODY()

protected:
	// 重写 BeginPlay
	virtual void BeginPlay() override;

	// 定义一个变量,用来在编辑器里选择你的 WBP_MainMenuWidget 蓝图
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "UI")
	TSubclassOf<class UUserWidget> MainMenuWidgetClass;

	// 用于保存创建出来的 UI 实例指针
	UPROPERTY()
	class UUserWidget* CurrentWidget;
};

MainMenuGameMode.cpp

cpp 复制代码
#include "MainMenuGameMode.h"
#include "Blueprint/UserWidget.h"
#include "Kismet/GameplayStatics.h"

void AMainMenuGameMode::BeginPlay()
{
	Super::BeginPlay();

	APlayerController* PC = GetWorld()->GetFirstPlayerController();

	if (PC && MainMenuWidgetClass)
	{
		// 1. 创建 Widget
		CurrentWidget = CreateWidget<UUserWidget>(GetWorld(), MainMenuWidgetClass);

		if (CurrentWidget)
		{
			// 2. 添加到视口
			CurrentWidget->AddToViewport();

			// 3. 设置输入模式为 UI Only
			FInputModeUIOnly InputMode;
			InputMode.SetWidgetToFocus(CurrentWidget->TakeWidget());
			InputMode.SetLockMouseToViewportBehavior(EMouseLockMode::DoNotLock);

			PC->SetInputMode(InputMode);

			// 4. 显示鼠标
			PC->bShowMouseCursor = true;
		}
	}
}

用 UMG 设计菜单 UI

  1. 在内容浏览器右键 → 用户界面 → Widget 蓝图 ,命名为 WBP_MainMenu。
  2. 在蓝图的 "类设置" 中,将父类改为我们刚创建的 UMainMenu(C++ 类)。
  3. 打开 Widget 蓝图,拖入 3 个 Button 控件,分别命名为:
    • Btn_SinglePlayer
    • Btn_MultiPlayer
    • Btn_Quit
  4. 给按钮设置文本为 "单人模式"、"双人模式"、"退出游戏",并按你的图片布局排列。
相关推荐
辻弋20112 小时前
五年前的旅行视频糊成马赛克?Video2X用Real-ESRGAN逐帧重建细节,但只支持Windows、集显用户建议直接放弃
服务器·数据库·windows·游戏引擎·电脑
Martina_032120 小时前
AI生成3D场景导入 Unity/Unreal 后,NPC 总串层?用6步检查导航高度与跨层连接
人工智能·游戏·数学建模·3d·unity·自然语言处理·aigc
Nil20821 小时前
leetcode 55跳跃游戏
算法·leetcode·游戏
Nil2081 天前
leetcode 45跳跃游戏Ⅱ
算法·leetcode·游戏
外收内放2 天前
Python基础语法练习题(拓展1)
python·游戏
Martina_03212 天前
AI生成的过山车轨道导入后频繁脱轨?用5步检查样条、轨距与碰撞
图像处理·人工智能·游戏·3d·材质·游戏策划·关卡设计
Martina_03212 天前
AI生成的模块场景一烘焙就有黑边?用6步检查Lightmap UV、纹素密度与Padding
人工智能·游戏·3d·aigc·uv·游戏策划·关卡设计
狂野小白兔2 天前
AI游戏制作04——Codex 搭配 Godot MCP 全流程教程
人工智能·游戏·godot
狂野小白兔2 天前
AI游戏制作00——AI制作游戏需要准备的前置条件
人工智能·游戏
Martina_03212 天前
AI生成的盔甲换动作后漂移?用6步检查挂点、骨架映射与 Bind Pose
人工智能·游戏·3d·ai·自然语言处理·aigc·游戏策划