六一的部落格


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



Homework / Game Data Widget


说明

显示以下信息:

  • 回合倒计时
  • 当前回合数 / 总回合数
  • 击杀数
  • 死亡次数

回顾

  1. 关卡使用HUD类 BP_STUGameHUD , BP_STUGameHUD使用窗口组件类 WBP_AboveHUD

  2. 窗口组件类由两个子窗口组件组成, 分别对应游戏角色存活和死亡状态, 每个子窗口组件的可见属性 Visibility 又绑定函数

    游戏角色状态 子窗口组件 Visibility绑定
    存活 WBP_PlayerHUD Is Player Alive
    死亡 WBP_SpectatorHUD Is Player Spectating

    回合信息和击杀信息最终显示在WBP_PlayerHUD中

3.WBP_PlayerHUD中当前显示的信息有生命值和弹药信息


创建C++窗口组件类: STUGameDataWidget

-
基类 UserWidget
路径 UI
名称 STUGameDataWidget
属性 Public

STUGameDataWidget返回信息

建议将获取CurrentRound和RoundsNum分开: 合在一起是不大可能复用的

ShootThemUp: UI/STUGameDataWidget.h

 1class ASTUGameModeBase;
 2class ASTUPlayerState;
 3
 4// public
 5
 6UFUNCTION(BlueprintCallable)
 7int32 GetRoundCountDown() const; /* GetRoundSecondsRemaining */
 8
 9UFUNCTION(BlueprintCallable)
10bool GetRoundInfo(int32 &CurrentRound, int32 &RoundsNum) const; /* GetCurrentRoundNum + GetTotalRoundsNum + */
11
12UFUNCTION(BlueprintCallable)
13int32 GetPawnKillsNum() const; /* GetKillsNum */
14
15UFUNCTION(BlueprintCallable)
16int32 GetPawnDeathsNum() const;
17
18// private
19ASTUGameModeBase *GetSTUGameModeBase() const; /* GetSTUGameMode */
20ASTUPlayerState *GetSTUPlayerState() const;

ShootThemUp: UI/STUGameDataWidget.cpp

 1#include "STUGameModeBase.h"
 2#include "Player/STUPlayerState.h"
 3
 4int32 USTUGameDataWidget::GetRoundCountDown() const
 5{
 6    const auto GameMode = GetSTUGameModeBase();
 7    return GameMode ? GameMode->GetRoundCountDown() : 0;
 8}
 9
10bool USTUGameDataWidget::GetRoundInfo(int32 &CurrentRound, int32 &RoundsNum) const
11{
12    const auto GameMode = GetSTUGameModeBase();
13    if (!GameMode) return false;
14
15    CurrentRound = GameMode->GetCurrentRound();
16    RoundsNum = GameMode->GetRoundsNum();
17    return true;
18}
19
20ASTUGameModeBase *USTUGameDataWidget::GetSTUGameModeBase() const
21{
22    // if (!GetWorld()) return nullptr;
23    // return Cast<ASTUGameModeBase>(GetWorld()->GetAuthGameMode());
24
25    return GetWorld() ? Cast<ASTUGameModeBase>(GetWorld()->GetAuthGameMode()) : nullptr;
26}
27
28ASTUPlayerState *USTUGameDataWidget::GetSTUPlayerState() const
29{
30    return GetOwningPlayer() ? Cast<ASTUPlayerState>(GetOwningPlayer()->PlayerState) : nullptr;
31}
32
33int32 USTUGameDataWidget::GetPawnKillsNum() const
34{
35    // const auto PlayerState = STUUtils::GetPlayerStateByPawn(GetOwningPlayerPawn());
36    const auto PlayerState = GetSTUPlayerState();
37    return PlayerState ? PlayerState->GetKillsNum() : 0;
38}
39
40int32 USTUGameDataWidget::GetPawnDeathsNum() const
41{
42    // const auto PlayerState = STUUtils::GetPlayerStateByPawn(GetOwningPlayerPawn());
43    const auto PlayerState = GetSTUPlayerState();
44    return PlayerState ? PlayerState->GetDeathsNum() : 0;
45}

STUGameModeBase返回回合信息

建议提供获取GameData, 由调用方取出分量

public

ShootThemUp: STUGameModeBase.h

1int32 GetCurrentRound() const { return CurrentRound; }
2int32 GetRoundsNum() const { return GameData.RoundsNum; }
3int32 GetRoundCountDown() const { return RoundCountDown; }

创建窗口蓝图

  1. Content/UI 目录下空白处右键, User Interface > Widget Blueprint
  2. 设置基类为STUGameDataWidget
  3. 命名为WBP_GameData

设置窗口蓝图

WBP_GameData


添加并设置组件

  1. 添加画布 Palette > PANEL > Canvas Panel

  2. 添加垂直盒 Palette > PANEL > Vertical Box

    内容自适应


  3. 添加文本框: 显示回合倒计时

    修改完默认文本后再修改名称

    修改名称会影响文本绑定名称

    -
    默认文本(用以测试) Details> Content > Text
    字体大小 Details > Font > Size
    名称 Hierarchy


  4. 添加分隔

    纵向20


  5. 添加文本框: 显示当前回合/总回合


  6. 添加分隔

    纵向10


  7. 添加文本框: 显示击杀数


  8. 添加分隔

    纵向10


  9. 添加文本框: 显示死亡次数



设置组件颜色

  1. WBP_PlayerHUD 拷贝文本颜色

    右键 Details > Color and Opacity


  2. 设置文本颜色: 回合倒计时


  3. 设置其他文本颜色



为文本组件的文本添加绑定

入口



回合倒计时



回合计数



击杀数



死亡次数



在WBP_PlayerHUD中添加WBP_GameData



查看

  1. 使NPC容被击杀

    BP_STUAICharacter


  2. 效果图: 秒数后面有毫秒数



移除毫秒数

WBP_GameData > Get_RoundSecondRemaining_Text

Mid 从给定下标开始, 截取指定个数字符. 考虑到分和秒各占2位, 以及一个占位符

-
Start 0
Count 5



设置回合时长为120s

BP_STUGameModeBase


显示效果


在窗口部件显示游戏数据


Homework / Game Data Widget


说明

显示以下信息:

  • 回合倒计时
  • 当前回合数 / 总回合数
  • 击杀数
  • 死亡次数

回顾

  1. 关卡使用HUD类 BP_STUGameHUD , BP_STUGameHUD使用窗口组件类 WBP_AboveHUD

  2. 窗口组件类由两个子窗口组件组成, 分别对应游戏角色存活和死亡状态, 每个子窗口组件的可见属性 Visibility 又绑定函数

    游戏角色状态 子窗口组件 Visibility绑定
    存活 WBP_PlayerHUD Is Player Alive
    死亡 WBP_SpectatorHUD Is Player Spectating

    回合信息和击杀信息最终显示在WBP_PlayerHUD中

3.WBP_PlayerHUD中当前显示的信息有生命值和弹药信息


创建C++窗口组件类: STUGameDataWidget

-
基类 UserWidget
路径 UI
名称 STUGameDataWidget
属性 Public

STUGameDataWidget返回信息

建议将获取CurrentRound和RoundsNum分开: 合在一起是不大可能复用的

ShootThemUp: UI/STUGameDataWidget.h

 1class ASTUGameModeBase;
 2class ASTUPlayerState;
 3
 4// public
 5
 6UFUNCTION(BlueprintCallable)
 7int32 GetRoundCountDown() const; /* GetRoundSecondsRemaining */
 8
 9UFUNCTION(BlueprintCallable)
10bool GetRoundInfo(int32 &CurrentRound, int32 &RoundsNum) const; /* GetCurrentRoundNum + GetTotalRoundsNum + */
11
12UFUNCTION(BlueprintCallable)
13int32 GetPawnKillsNum() const; /* GetKillsNum */
14
15UFUNCTION(BlueprintCallable)
16int32 GetPawnDeathsNum() const;
17
18// private
19ASTUGameModeBase *GetSTUGameModeBase() const; /* GetSTUGameMode */
20ASTUPlayerState *GetSTUPlayerState() const;

ShootThemUp: UI/STUGameDataWidget.cpp

 1#include "STUGameModeBase.h"
 2#include "Player/STUPlayerState.h"
 3
 4int32 USTUGameDataWidget::GetRoundCountDown() const
 5{
 6    const auto GameMode = GetSTUGameModeBase();
 7    return GameMode ? GameMode->GetRoundCountDown() : 0;
 8}
 9
10bool USTUGameDataWidget::GetRoundInfo(int32 &CurrentRound, int32 &RoundsNum) const
11{
12    const auto GameMode = GetSTUGameModeBase();
13    if (!GameMode) return false;
14
15    CurrentRound = GameMode->GetCurrentRound();
16    RoundsNum = GameMode->GetRoundsNum();
17    return true;
18}
19
20ASTUGameModeBase *USTUGameDataWidget::GetSTUGameModeBase() const
21{
22    // if (!GetWorld()) return nullptr;
23    // return Cast<ASTUGameModeBase>(GetWorld()->GetAuthGameMode());
24
25    return GetWorld() ? Cast<ASTUGameModeBase>(GetWorld()->GetAuthGameMode()) : nullptr;
26}
27
28ASTUPlayerState *USTUGameDataWidget::GetSTUPlayerState() const
29{
30    return GetOwningPlayer() ? Cast<ASTUPlayerState>(GetOwningPlayer()->PlayerState) : nullptr;
31}
32
33int32 USTUGameDataWidget::GetPawnKillsNum() const
34{
35    // const auto PlayerState = STUUtils::GetPlayerStateByPawn(GetOwningPlayerPawn());
36    const auto PlayerState = GetSTUPlayerState();
37    return PlayerState ? PlayerState->GetKillsNum() : 0;
38}
39
40int32 USTUGameDataWidget::GetPawnDeathsNum() const
41{
42    // const auto PlayerState = STUUtils::GetPlayerStateByPawn(GetOwningPlayerPawn());
43    const auto PlayerState = GetSTUPlayerState();
44    return PlayerState ? PlayerState->GetDeathsNum() : 0;
45}

STUGameModeBase返回回合信息

建议提供获取GameData, 由调用方取出分量

public

ShootThemUp: STUGameModeBase.h

1int32 GetCurrentRound() const { return CurrentRound; }
2int32 GetRoundsNum() const { return GameData.RoundsNum; }
3int32 GetRoundCountDown() const { return RoundCountDown; }

创建窗口蓝图

  1. Content/UI 目录下空白处右键, User Interface > Widget Blueprint
  2. 设置基类为STUGameDataWidget
  3. 命名为WBP_GameData

设置窗口蓝图

WBP_GameData


添加并设置组件

  1. 添加画布 Palette > PANEL > Canvas Panel

  2. 添加垂直盒 Palette > PANEL > Vertical Box

    内容自适应


  3. 添加文本框: 显示回合倒计时

    修改完默认文本后再修改名称

    修改名称会影响文本绑定名称

    -
    默认文本(用以测试) Details> Content > Text
    字体大小 Details > Font > Size
    名称 Hierarchy


  4. 添加分隔

    纵向20


  5. 添加文本框: 显示当前回合/总回合


  6. 添加分隔

    纵向10


  7. 添加文本框: 显示击杀数


  8. 添加分隔

    纵向10


  9. 添加文本框: 显示死亡次数



设置组件颜色

  1. WBP_PlayerHUD 拷贝文本颜色

    右键 Details > Color and Opacity


  2. 设置文本颜色: 回合倒计时


  3. 设置其他文本颜色



为文本组件的文本添加绑定

入口



回合倒计时



回合计数



击杀数



死亡次数



在WBP_PlayerHUD中添加WBP_GameData



查看

  1. 使NPC容被击杀

    BP_STUAICharacter


  2. 效果图: 秒数后面有毫秒数



移除毫秒数

WBP_GameData > Get_RoundSecondRemaining_Text

Mid 从给定下标开始, 截取指定个数字符. 考虑到分和秒各占2位, 以及一个占位符

-
Start 0
Count 5



设置回合时长为120s

BP_STUGameModeBase


显示效果