使用C++实现游戏角色生命条
2023年10月6日 2024年1月11日
概览
- 创建C++类: 窗口部件; 返回生命值百分比
- 在STUGameHUD中创建并添加窗口部件
- 修改WBP_PlayerHUD基类; 使用STUPlayerHUDWidget提供的接口获取生命值百分比
- 移除BP_STUGameHUD中创建并添加窗口部件逻辑; 配置窗口部件类属性
C++类: 窗口部件
在虚幻编辑器中创建C++类
- | |
---|---|
基类 | UserWidget |
名称 | STUPlayerHUDWidget |
路径 | UI/ |
Public |
添加接口: 获取生命值百分比
ShootThemUp: UI/STUPlayerHUDWidget.h
public
1UFUNCTION(BlueprintCallable) 2float GetHealthPercent() const;
ShootThemUp: UI/STUPlayerHUDWidget.cpp
使用Cast转换空指针得到空指针
1#include "Components/STUHealthComponent.h" 2 3float USTUPlayerHUDWidget::GetHealthPercent() const 4{ 5 const auto Player = GetOwningPlayerPawn(); 6 if (!Player) return 0.0f; 7 8 const auto Component = Player->GetComponentByClass(USTUHealthComponent::StaticClass()); 9 const auto HealthComponent = Cast<USTUHealthComponent>(Component); 10 if (!HealthComponent) return 0.0f; 11 12 return HealthComponent->GetHealthPercent(); 13}
在STUGameHUD中创建并添加窗口部件
添加数据成员: 保存窗口部件类
ShootThemUp: UI/STUGameHUD.h
protected
1class UUserWidget; 2 3UPROPERTY(EditDefaultsOnly, BlueprintReadWrite) 4TSubclassOf<UUserWidget> PlayerHUDWidgetClass;
创建窗口部件并添加到视口
通常, 在蓝图中使用的函数和C++中提供同样功能的函数一一对应, 甚至同名
创建窗口部件
头文件 Blueprint/UserWidget.h
提供CreateWidget函数
添加到视口
使用AddToViewport函数
添加到视口时可以设置景深 Z-order
参数, 涉及到窗口部件的渲染顺序, 默认为0
在BeginPlay中完成
ShootThemUp: UI/STUGameHUD.h
protected
1virtual void BeginPlay() override;
ShootThemUp: UI/STUGameHUD.cpp
1#include "Blueprint/UserWidget.h" // Provide CreateWidget: Template function 2 3void ASTUGameHUD::BeginPlay() 4{ 5 Super::BeginPlay(); 6 auto PlayerHUDWidget = CreateWidget<UUserWidget>(GetWorld(), PlayerHUDWidgetClass); 7 if (PlayerHUDWidget) 8 { 9 PlayerHUDWidget->AddToViewport(); 10 } 11}
修改WBP_PlayerHUD
将基类从UserWidget改为STUPlayerHUDWidget
打开WBP_PlayerHUD, File > Reparent Blueprint
选择STUPlayerHUDWidget
右上角查看当前基类
修改蓝图GetHealthPercent实现
去到 Graph
-
添加节点:
GetHealthPercent
-
蓝图实现
窗口部件的逻辑和功能封装在C++中, 在虚幻运动图表编辑器, 我们可以从设计的角度装饰窗口部件
修改BP_STUGameHUD
已在C++中实现创建并添加窗口部件到关卡, 移除 Event Graph
操作
点击按钮 Class Defaults
设置PlayerHUDWidgetClass为WBP_PlayerHUD