文章目录
- 一、优化执行效率
- 二、简单脉冲动画
一、优化执行效率
- 绑定事件需要每一帧检查绑定对象是否有变化,势必造成CPU资源的浪费,因此优化执行效率的思路是:UI组件不再自行每帧查询血量,而是让血量自己在发生变化的同时通知UI进行刷新。
- 多播委托(
Multicast Delegate
)是一种特殊的委托类型,它允许多个函数绑定到同一个委托实例,当该委托被调用时,会依次调用所有绑定的函数。这在需要通知多个对象或系统某个事件发生时非常有用。
参考链接:
https://dev.epicgames.com/documentation/zh-cn/unreal-engine/delegates-and-lamba-functions-in-unreal-engine?application_version=5.2
(1)声明多播委托
SurAttributeComponent.h
#pragma once
#include "CoreMinimal.h"
#include "Components/ActorComponent.h"
#include "SurAttributeComponent.generated.h"
// 发起者,控件拥有者,改变后的血量,变化值
DECLARE_DYNAMIC_MULTICAST_DELEGATE_FourParams(FOnHealthChanged, AActor*, InstigatorActor, USurAttributeComponent*, OwningComp, float, NewHealth, float, Delta);
UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )
class SURKEAUE_API USurAttributeComponent : public UActorComponent
{
GENERATED_BODY()
protected:
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="Attributes")
float Health;
public:
USurAttributeComponent();
// 声明一个多播委托实例
UPROPERTY(BlueprintAssignable)
FOnHealthChanged OnHealthChanged;
// 要触发的函数
UFUNCTION(BlueprintCallable, Category="Attributes")
bool ApplyHealthChange(float Delta);
};
(2)触发多播委托
SurAttributeComponent.cpp
#include "SurAttributeComponent.h"
USurAttributeComponent::USurAttributeComponent()
{
Health = 100;
}
bool USurAttributeComponent::ApplyHealthChange(float Delta)
{
Health += Delta;
// 由多播实例触发多播委托,通知所有绑定的函数
OnHealthChanged.Broadcast(nullptr, this, Health, Delta);
return true;
}
(3)绑定函数到多播委托
MyCharacter->OnTakeDamage.AddDynamic(this, &AMyGameMode::OnCharacterTakeDamage);
- 回到UE,在
Player
的AttributeComp
中添加刚刚编写的OnHealthChanged事件,利用PrintString
节点快速验证效果
- 现在需要把这个事件分配给相应的UI控件
PlayerHealth_Widget
即可,绑定到血条(进度条) - 在·PlayerHealth_Widget·的事件图表中编写蓝图程序,在“事件构造”一开始就将将玩家
Pawn
的AttributeComp
绑定到OnHealthChanged
事件上。在每次事件触发时计算当前血量与玩家默认血量的百分比,并设置给进度条。此外,我还顺便设置了文本块显示的内容,并在设计器中取消了上一节实现的绑定函数。如果在蓝图中找不到文本框变量,记得在设计器中把相应控件前的Is Variable
打开。
二、简单脉冲动画
- 此这部分通过在UI中添加血量减少时的脉冲动画,来了解UMG中动画的使用
- 在左下角的“动画”中点击“添加动画”,命名为
PulseHealthAnim
,点击动画,并选择旁边的“时间轴”。选择显示血量数字的文本块,在细节中下滑找到“渲染变换”,将缩放添加为关键帧。 - 将时间轴拖拽到0.75,添加关键帧;在0.25处,将缩放的XY设置为0.5再次添加关键帧。此时拖动时间轴(或者按下空格键),就可预览到这个简易的脉冲动画。切换切换到蓝图中,添加播放动画的节点。
- 在刚才设置关键帧的时候更改了文本缩放的默认值,此时需要回到设计器中,点击黄色返回键将文本的缩放变为默认值
参考链接:
https://dev.epicgames.com/documentation/zh-cn/unreal-engine/animating-umg-widgets-in-unreal-engine?application_version=5.2