六一的部落格


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




说明

UMG Damage Effect

通过窗口部件实现. 游戏角色受伤时添加闪烁红屏, 作为流血特效


窗口部件

WBP_PlayerHUD

  • 添加图片 Image 元素, 命名为DamageImage, 移动到层级结构上方


  • 铺满视口

    Details > Anchors , 选择铺满


    设置Offset Left = Offset Top = Offset Right = Offset Bottom = 0


  • 设置颜色

    Details > Appearance > Color and Opacity , 设置为红色; 设置Alpha分量为0



为DamageImage添加动画

选中DamageImage, 打开Animations窗口


点击 +Animation , 命名为DamageAnimation


为DamageAnimation添加Track


选择DamageImage



设置关键帧0.25

在DamageImage这一栏, 点击 +Track


选择Color and Opacity


设置Alpha通道为0.6



设置关键帧0.5

同上, 设置Alpha通道为0



播放DamageImage动画

WBP_PlayerHUD > Event Graph

  • 稍后在C++中定义事件

  • 添加DamageAnimation变量


  • 作为PlayAnimation的输入



生命值减少触发事件


定义蓝图事件

使用宏声明符创建蓝图事件, 该函数只声明不定义

ShootThemUp: UI/STUPlayerHUDWidget.h

public

1UFUNCTION(BlueprintImplementableEvent)
2void OnTakeDamage();

生命值减少通知

两种方法

  • 定义委托, 游戏角色受伤时通知客户端
  • 修改当前委托定义, 添加额外参数, 显示生命值变化

修改委托

  • 修改委托定义

    ShootThemUp: STUCoreTypes.h

    1DECLARE_MULTICAST_DELEGATE_OneParam(FChangeHealthSignature, float);
  • 修改服务端广播

    ShootThemUp: Components/STUHealthComponent.cpp

    1// SetHealth
    2
    3const auto NextHealth = FMath::Clamp(NewHealth, 0.0f, MaxHealth);
    4const auto HealthDelta = NextHealth - Health;
    5
    6Health = NextHealth;
    7OnChangeHealth.Broadcast(HealthDelta);
  • 修改客户端

    • 处理函数声明

      ShootThemUp: Player/STUBaseCharacter.h
      1void OnChangeHealth(float HealthDelta);
    • 处理函数定义

      ShootThemUp: Player/STUBaseCharacter.cpp

窗口部件类订阅生命值减少委托, 并触发事件

  • 处理函数

    ShootThemUp: UI/STUPlayerHUDWidget.h

    private

    1void OnChangeHealth(float HealthDelta);

    触发事件

    ShootThemUp: UI/STUPlayerHUDWidget.cpp

    1void USTUPlayerHUDWidget::OnChangeHealth(float HealthDelta)
    2{
    3    if (HealthDelta < 0.0f)
    4    {
    5        OnTakeDamage();
    6    }
    7}
  • 在Initialize函数中完成订阅

    ShootThemUp: UI/STUPlayerHUDWidget.h

    public

    1virtual bool Initialize() override;

    ShootThemUp: UI/STUPlayerHUDWidget.cpp

    1bool USTUPlayerHUDWidget::Initialize()
    2{
    3    const auto HealthComponent = STUUtils::GetSTUPlayerComponent<USTUHealthComponent>(GetOwningPlayerPawn());
    4    if (HealthComponent)
    5    {
    6        HealthComponent->OnChangeHealth.AddUObject(this, &USTUPlayerHUDWidget::OnChangeHealth);
    7    }
    8    return Super::Initialize();
    9}

在蓝图中添加事件

WBP_PlayerHUD > EventGraph


事件发生时播放DamageAnimation动画


受到伤害时, 有序播放动画

WBP_PlayerHUD > EventGraph

添加节点 IsAnimationPlaying 判断当前动画播放状态; 添加分支: 事件发生时, 若未播放动画, 播放动画



其他: 修改武器组件注册弹匣为空委托的处理函数名

由OnEmptyClip改为OnClipEmpty, 和委托成员一致

  • 声明

    ShootThemUp: Components/STUWeaponComponent.h
    1void OnClipEmpty(ASTUBaseWeapon *AmmoEmptyWeapon);
  • 定义

    ShootThemUp: Components/STUWeaponComponent.cpp
    1void USTUWeaponComponent::OnClipEmpty(ASTUBaseWeapon *AmmoEmptyWeapon)
    2{
    3    // ...
    4}
  • 注册处理函数

    ShootThemUp: Components/STUWeaponComponent.cpp
    1Weapon->OnClipEmpty.AddUObject(this, &USTUWeaponComponent::OnClipEmpty);

游戏角色受伤时添加闪烁红屏



说明

UMG Damage Effect

通过窗口部件实现. 游戏角色受伤时添加闪烁红屏, 作为流血特效


窗口部件

WBP_PlayerHUD

  • 添加图片 Image 元素, 命名为DamageImage, 移动到层级结构上方


  • 铺满视口

    Details > Anchors , 选择铺满


    设置Offset Left = Offset Top = Offset Right = Offset Bottom = 0


  • 设置颜色

    Details > Appearance > Color and Opacity , 设置为红色; 设置Alpha分量为0



为DamageImage添加动画

选中DamageImage, 打开Animations窗口


点击 +Animation , 命名为DamageAnimation


为DamageAnimation添加Track


选择DamageImage



设置关键帧0.25

在DamageImage这一栏, 点击 +Track


选择Color and Opacity


设置Alpha通道为0.6



设置关键帧0.5

同上, 设置Alpha通道为0



播放DamageImage动画

WBP_PlayerHUD > Event Graph

  • 稍后在C++中定义事件

  • 添加DamageAnimation变量


  • 作为PlayAnimation的输入



生命值减少触发事件


定义蓝图事件

使用宏声明符创建蓝图事件, 该函数只声明不定义

ShootThemUp: UI/STUPlayerHUDWidget.h

public

1UFUNCTION(BlueprintImplementableEvent)
2void OnTakeDamage();

生命值减少通知

两种方法

  • 定义委托, 游戏角色受伤时通知客户端
  • 修改当前委托定义, 添加额外参数, 显示生命值变化

修改委托

  • 修改委托定义

    ShootThemUp: STUCoreTypes.h

    1DECLARE_MULTICAST_DELEGATE_OneParam(FChangeHealthSignature, float);
  • 修改服务端广播

    ShootThemUp: Components/STUHealthComponent.cpp

    1// SetHealth
    2
    3const auto NextHealth = FMath::Clamp(NewHealth, 0.0f, MaxHealth);
    4const auto HealthDelta = NextHealth - Health;
    5
    6Health = NextHealth;
    7OnChangeHealth.Broadcast(HealthDelta);
  • 修改客户端

    • 处理函数声明

      ShootThemUp: Player/STUBaseCharacter.h
      1void OnChangeHealth(float HealthDelta);
    • 处理函数定义

      ShootThemUp: Player/STUBaseCharacter.cpp

窗口部件类订阅生命值减少委托, 并触发事件

  • 处理函数

    ShootThemUp: UI/STUPlayerHUDWidget.h

    private

    1void OnChangeHealth(float HealthDelta);

    触发事件

    ShootThemUp: UI/STUPlayerHUDWidget.cpp

    1void USTUPlayerHUDWidget::OnChangeHealth(float HealthDelta)
    2{
    3    if (HealthDelta < 0.0f)
    4    {
    5        OnTakeDamage();
    6    }
    7}
  • 在Initialize函数中完成订阅

    ShootThemUp: UI/STUPlayerHUDWidget.h

    public

    1virtual bool Initialize() override;

    ShootThemUp: UI/STUPlayerHUDWidget.cpp

    1bool USTUPlayerHUDWidget::Initialize()
    2{
    3    const auto HealthComponent = STUUtils::GetSTUPlayerComponent<USTUHealthComponent>(GetOwningPlayerPawn());
    4    if (HealthComponent)
    5    {
    6        HealthComponent->OnChangeHealth.AddUObject(this, &USTUPlayerHUDWidget::OnChangeHealth);
    7    }
    8    return Super::Initialize();
    9}

在蓝图中添加事件

WBP_PlayerHUD > EventGraph


事件发生时播放DamageAnimation动画


受到伤害时, 有序播放动画

WBP_PlayerHUD > EventGraph

添加节点 IsAnimationPlaying 判断当前动画播放状态; 添加分支: 事件发生时, 若未播放动画, 播放动画



其他: 修改武器组件注册弹匣为空委托的处理函数名

由OnEmptyClip改为OnClipEmpty, 和委托成员一致

  • 声明

    ShootThemUp: Components/STUWeaponComponent.h
    1void OnClipEmpty(ASTUBaseWeapon *AmmoEmptyWeapon);
  • 定义

    ShootThemUp: Components/STUWeaponComponent.cpp
    1void USTUWeaponComponent::OnClipEmpty(ASTUBaseWeapon *AmmoEmptyWeapon)
    2{
    3    // ...
    4}
  • 注册处理函数

    ShootThemUp: Components/STUWeaponComponent.cpp
    1Weapon->OnClipEmpty.AddUObject(this, &USTUWeaponComponent::OnClipEmpty);