回到主菜单
2023年11月24日 2024年1月11日
Homework / Go To Main Menu
说明
在暂停和游戏结束界面添加按钮, 支持回到主菜单
- 在游戏实例中保存主菜单关卡名称
- 将按钮单独作为一个窗口部件实现
在游戏实例中保存主菜单关卡名称
- 添加属性: 主菜单关卡名称
protected
ShootThemUp: STUGameInstance.h
1UPROPERTY(EditDefaultsOnly) 2FName MainLevelName = NAME_None; /* MenuLevelName */
- 添加接口: 返回主菜单关卡名称
public
ShootThemUp: STUGameInstance.h
1FName GetMainLevelName() const { return MainLevelName; }
创建C++类
- | |
---|---|
基类 | UserWidget |
路径 | Menu/UI |
名称 | STUReturnToMainMenuWidget |
属性 | Public |
可以命名为STUGoToMenuWidget, 存放在UI目录下
创建蓝图窗口部件
- | |
---|---|
路径 | Content/Menu/UI |
基类 | STUReturnToMainMenuWidget |
名称 | WBP_ReturnToMainMenu |
可命名为WBP_GoToMenu, 放在Content/UI目录下
设计WBP_ReturnToMainMenu
-
从
WBP_Menu
拷贝按钮考虑到某些界面按钮的大小盒设置可能会不一样, 而复用逻辑针对回到主菜单这一功能
-
粘贴按钮
-
修改按钮文本
-
修改按钮变量名
在WBP_PauseWidget中添加WBP_ReturnToMainMenu
-
为按钮上级大小盒添加
Horizontal Box
-
添加分隔符
Spacer
-
添加
WBP_ReturnToMainMenu
-
为
WBP_ReturnToMainMenu
添加大小盒 -
拷贝整个水平盒
在WBP_GameOverWidget中添加WBP_ReturnToMainMenu
-
在垂直盒粘贴水平盒
-
移除左边的按钮
-
使用重置按钮替换
殊途同归
实现STUReturnToMainMenuWidget
覆写NativeOnInitialized, 注册按钮点击事件
-
添加属性: 按钮
protected
ShootThemUp: Menu/UI/STUReturnToMainMenuWidget.h
1class UButton; 2 3UPROPERTY(meta = (BindWidget)) 4UButton *MainMenuButton; /* GoToMenuButton */
-
实现回调函数
private
ShootThemUp: Menu/UI/STUReturnToMainMenuWidget.h
1UFUNCTION() 2void OnMainMenu();
ShootThemUp: Menu/UI/STUReturnToMainMenuWidget.cpp
1#include "Kismet/GameplayStatics.h" 2#include "STUGameInstance.h" 3 4DEFINE_LOG_CATEGORY_STATIC(LogReturnToMainMenuWidget, All, All); 5 6void USTUReturnToMainMenuWidget::OnMainMenu() 7{ 8 if (!GetWorld()) return; 9 10 const auto STUGameInstance = GetWorld()->GetGameInstance<USTUGameInstance>(); 11 if (!STUGameInstance) return; 12 13 if (STUGameInstance->GetMainLevelName().IsNone()) 14 { 15 UE_LOG(LogReturnToMainMenuWidget, Error, TEXT("MainLevelName is none")); 16 return; 17 } 18 19 UGameplayStatics::OpenLevel(GetWorld(), STUGameInstance->GetMainLevelName()); 20}
-
覆写NativeOnInitialized, 注册回调函数
protected
ShootThemUp: Menu/UI/STUReturnToMainMenuWidget.h
1virtual void NativeOnInitialized() override;
ShootThemUp: Menu/UI/STUReturnToMainMenuWidget.cpp
1#include "Components/Button.h" 2 3void USTUReturnToMainMenuWidget::NativeOnInitialized() 4{ 5 Super::NativeOnInitialized(); 6 7 if (MainMenuButton) 8 { 9 MainMenuButton->OnClicked.AddDynamic(this, &USTUReturnToMainMenuWidget::OnMainMenu); 10 } 11}
查看
-
设置主菜单关卡名称
BP_STUGameInstance
- Main Level Name MenuLevel -
暂停窗口
-
游戏结束窗口