六一的部落格


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




概览

  • 创建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


使用C++实现游戏角色生命条



概览

  • 创建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