在窗口部件显示游戏数据
2023年11月21日 2024年1月11日
Homework / Game Data Widget
说明
显示以下信息:
- 回合倒计时
- 当前回合数 / 总回合数
- 击杀数
- 死亡次数
回顾
-
关卡使用HUD类
BP_STUGameHUD
, BP_STUGameHUD使用窗口组件类WBP_AboveHUD
-
窗口组件类由两个子窗口组件组成, 分别对应游戏角色存活和死亡状态, 每个子窗口组件的可见属性
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; }
创建窗口蓝图
Content/UI
目录下空白处右键,User Interface > Widget Blueprint
- 设置基类为STUGameDataWidget
- 命名为WBP_GameData
设置窗口蓝图
WBP_GameData
添加并设置组件
-
添加画布
Palette > PANEL > Canvas Panel
-
添加垂直盒
Palette > PANEL > Vertical Box
内容自适应
-
添加文本框: 显示回合倒计时
修改完默认文本后再修改名称
修改名称会影响文本绑定名称- 默认文本(用以测试) Details> Content > Text
字体大小 Details > Font > Size
名称 Hierarchy
-
添加分隔
纵向20
-
添加文本框: 显示当前回合/总回合
-
添加分隔
纵向10
-
添加文本框: 显示击杀数
-
添加分隔
纵向10
-
添加文本框: 显示死亡次数
设置组件颜色
-
从
WBP_PlayerHUD
拷贝文本颜色
右键Details > Color and Opacity
-
设置文本颜色: 回合倒计时
-
设置其他文本颜色
为文本组件的文本添加绑定
入口
回合倒计时
回合计数
击杀数
死亡次数
在WBP_PlayerHUD中添加WBP_GameData
查看
-
使NPC容被击杀
BP_STUAICharacter
-
效果图: 秒数后面有毫秒数
移除毫秒数
WBP_GameData > Get_RoundSecondRemaining_Text
Mid
从给定下标开始, 截取指定个数字符. 考虑到分和秒各占2位, 以及一个占位符
- | |
---|---|
Start | 0 |
Count | 5 |
设置回合时长为120s
BP_STUGameModeBase