六一的部落格


关关难过关关过,前路漫漫亦灿灿。



Homework / Go To Main Menu


说明

在暂停和游戏结束界面添加按钮, 支持回到主菜单

  1. 在游戏实例中保存主菜单关卡名称
  2. 将按钮单独作为一个窗口部件实现

在游戏实例中保存主菜单关卡名称

  1. 添加属性: 主菜单关卡名称

    protected

    ShootThemUp: STUGameInstance.h
    1UPROPERTY(EditDefaultsOnly)
    2FName MainLevelName = NAME_None; /* MenuLevelName */
  2. 添加接口: 返回主菜单关卡名称

    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

  1. WBP_Menu 拷贝按钮

    考虑到某些界面按钮的大小盒设置可能会不一样, 而复用逻辑针对回到主菜单这一功能


  2. 粘贴按钮

  3. 修改按钮文本


  4. 修改按钮变量名



在WBP_PauseWidget中添加WBP_ReturnToMainMenu

  1. 为按钮上级大小盒添加 Horizontal Box


  2. 添加分隔符 Spacer


  3. 添加 WBP_ReturnToMainMenu

  4. WBP_ReturnToMainMenu 添加大小盒


  5. 拷贝整个水平盒



在WBP_GameOverWidget中添加WBP_ReturnToMainMenu

  1. 在垂直盒粘贴水平盒


  2. 移除左边的按钮


  3. 使用重置按钮替换


    殊途同归


实现STUReturnToMainMenuWidget

覆写NativeOnInitialized, 注册按钮点击事件

  1. 添加属性: 按钮

    protected

    ShootThemUp: Menu/UI/STUReturnToMainMenuWidget.h

    1class UButton;
    2
    3UPROPERTY(meta = (BindWidget))
    4UButton *MainMenuButton; /* GoToMenuButton */
  2. 实现回调函数

    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}
  3. 覆写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}

查看

  1. 设置主菜单关卡名称

    BP_STUGameInstance

    -
    Main Level Name MenuLevel


  2. 暂停窗口


  3. 游戏结束窗口


回到主菜单


Homework / Go To Main Menu


说明

在暂停和游戏结束界面添加按钮, 支持回到主菜单

  1. 在游戏实例中保存主菜单关卡名称
  2. 将按钮单独作为一个窗口部件实现

在游戏实例中保存主菜单关卡名称

  1. 添加属性: 主菜单关卡名称

    protected

    ShootThemUp: STUGameInstance.h
    1UPROPERTY(EditDefaultsOnly)
    2FName MainLevelName = NAME_None; /* MenuLevelName */
  2. 添加接口: 返回主菜单关卡名称

    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

  1. WBP_Menu 拷贝按钮

    考虑到某些界面按钮的大小盒设置可能会不一样, 而复用逻辑针对回到主菜单这一功能


  2. 粘贴按钮

  3. 修改按钮文本


  4. 修改按钮变量名



在WBP_PauseWidget中添加WBP_ReturnToMainMenu

  1. 为按钮上级大小盒添加 Horizontal Box


  2. 添加分隔符 Spacer


  3. 添加 WBP_ReturnToMainMenu

  4. WBP_ReturnToMainMenu 添加大小盒


  5. 拷贝整个水平盒



在WBP_GameOverWidget中添加WBP_ReturnToMainMenu

  1. 在垂直盒粘贴水平盒


  2. 移除左边的按钮


  3. 使用重置按钮替换


    殊途同归


实现STUReturnToMainMenuWidget

覆写NativeOnInitialized, 注册按钮点击事件

  1. 添加属性: 按钮

    protected

    ShootThemUp: Menu/UI/STUReturnToMainMenuWidget.h

    1class UButton;
    2
    3UPROPERTY(meta = (BindWidget))
    4UButton *MainMenuButton; /* GoToMenuButton */
  2. 实现回调函数

    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}
  3. 覆写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}

查看

  1. 设置主菜单关卡名称

    BP_STUGameInstance

    -
    Main Level Name MenuLevel


  2. 暂停窗口


  3. 游戏结束窗口