虚幻引擎5 GAS开发俯视角RPG游戏 #5-7:广播初始值

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响应机制。具体解析如下:

  1. 宏定义结构
    DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam 声明了一个动态多播委托类型,包含三个参数:

    • FOnHealthChangedSignature:委托类型名称(必须以F开头)
    • float:参数类型(这里是浮点数)
    • NewHealth:参数名称
  2. 核心功能

    • 动态多播委托支持在蓝图中绑定事件,且允许多个函数同时订阅同一事件
    • 通过UPROPERTY(BlueprintAssignable)标记后,可在蓝图中暴露为可分配事件
    • 触发时使用Broadcast()方法广播数据,例如:
      
      

      cppCopy Code

      FOnHealthChanged.Broadcast(AttributeSetBase->GetHealth());

      会通知所有绑定的UI更新逻辑
  3. 典型应用场景

    • 角色血量/法力值等属性变化时驱动UI更新
    • 跨模块通信解耦,避免直接对象引用
  4. 与其他委托对比

    特性动态多播委托普通多播委托
    蓝图支持✅ 支持❌ 不支持
    参数限制最多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)蓝条添加控制器回调

运行效果:

在属性集里修改初始值,测试:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值