1.在小部件控制器类,写一个函数,用于广播初始值:
Source/CC_Aura/Public/UI/WidgetController/CC_WidgetController.h:
virtual void BroadcastInitialValues();
2.在Source/CC_Aura/Public/UI/WidgetController/CC_OverlayWidgetController.h里重写:
public:
// 广播初始值
virtual void BroadcastInitialValues() override;
3.声明动态多播:
//声明动态多播
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnHealthChangedSignature,float, NewHealth);
这是一个UE引擎中用于声明动态多播委托的宏,主要用于实现游戏属性变化的UI响应机制。具体解析如下:
-
宏定义结构
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam
声明了一个动态多播委托类型,包含三个参数:FOnHealthChangedSignature
:委托类型名称(必须以F开头)float
:参数类型(这里是浮点数)NewHealth
:参数名称
-
核心功能
- 动态多播委托支持在蓝图中绑定事件,且允许多个函数同时订阅同一事件
- 通过
UPROPERTY(BlueprintAssignable)
标记后,可在蓝图中暴露为可分配事件 - 触发时使用
Broadcast()
方法广播数据,例如:cppCopy Code
会通知所有绑定的UI更新逻辑FOnHealthChanged.Broadcast(AttributeSetBase->GetHealth());
-
典型应用场景
- 角色血量/法力值等属性变化时驱动UI更新
- 跨模块通信解耦,避免直接对象引用
-
与其他委托对比
特性 动态多播委托 普通多播委托 蓝图支持 ✅ 支持 ❌ 不支持 参数限制 最多8个函数参数 同左 序列化 ✅ 可序列化 ❌ 不可序列化 典型用途 UI交互、跨蓝图通信 纯C++模块间通信 具体差异可参考委托系统的设计文档37
如需完整实现案例,可参考GAS框架中的属性同步机制。
4.定义变量:
private:
UPROPERTY(BlueprintAssignable, Category="GAS|Attributes")
FOnHealthChangedSignature OnHealthChanged;
5.广播值,比如:
但是,我们没有获取真正的属性值,下面操作获取属性值:
void UCC_OverlayWidgetController::BroadcastInitialValues()
{
Super::BroadcastInitialValues();
UCC_AttributeSet* CC_AttributeSet = CastChecked<UCC_AttributeSet>(AttributeSet);
FOnHealthChanged.Broadcast(CC_AttributeSet->GetHealth());
FOnMaxHealthChanged.Broadcast(CC_AttributeSet->GetMaxHealth());
FOnManaChanged.Broadcast(CC_AttributeSet->GetMana());
FOnMaxManaChanged.Broadcast(CC_AttributeSet->GetMaxMana());
}
6.在HUD中,调用函数:
void ACC_HUD::InitOverlay(APlayerController* PC, APlayerState* PS, UAbilitySystemComponent* ASC, UAttributeSet* AS)
{
checkf(OverlayWidgetClass,TEXT("OverlayWidgetClass没有设定!"));
checkf(OverlayWidgetControllerClass,TEXT("OverlayWidgetControllerClass没有设定!"));
//1.创建覆盖层小部件
UUserWidget* Widget = CreateWidget<UUserWidget>(GetWorld(), OverlayWidgetClass);
OverlayWidget = Cast<UCC_UserWidget>(Widget);
//2.创建小部件控制器
const FWidgetControllerParams WidgetControllerParams = FWidgetControllerParams(PC, PS, ASC, AS);
//获取覆盖层小部件控制器指针
OverlayWidgetController = GetOverlayWidgetController(/*WidgetControllerParams*/);
//将参数赋值给小部件控制器
OverlayWidgetController->SetWidgetControllerParams(WidgetControllerParams);
//3.将覆盖层小部件控制器添加到覆盖层小部件
OverlayWidget->AddWidgetController(OverlayWidgetController);
//4.广播初始值
OverlayWidgetController->BroadcastInitialValues();
//将覆盖层小部件打印到屏幕
OverlayWidget->AddToViewport();
}
7.在UE创建蓝图子类:
在Source/CC_Aura/Public/UI/WidgetController/CC_OverlayWidgetController.h中,将类的类型改成蓝图可派生的:
UCLASS(Blueprintable)
class CC_AURA_API UCC_OverlayWidgetController : public UCC_WidgetController
(1)在HUD配置好蓝图控制器
(2)在WBP_Overlay中:为血条和蓝条添加控制器
(3)在血条子类里(WBP_HealthGlobe),触发添加控制器后的回调函数:
(4)蓝条添加控制器回调
运行效果:
在属性集里修改初始值,测试: