游戏角色受伤时添加闪烁红屏
2023年10月15日 2024年1月11日
说明
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);