本文讲述一下动态多播委托的简单使用,包括它的声明,定义,在蓝图中的使用。
我这边使用的前提是在创建了一个属性组件,添加到角色中,当角色收到血量改变的通知的时候,会进行相应的处理。
DECLARE_DYNAMIC_MULTICAST_DELEGATE_FourParams(FOnHealthChanged,AActor*,InstigatorActor,UAttributeComponent*,AttributeComponent,float,NewHealth,float,Delta);
定义变量,注意在public权限内使用,因为外部会引用到。BlueprintAssignable标识符,表示在蓝图中可以进行使用。
public:
UPROPERTY(BlueprintAssignable,Category=Events)
FOnHealthChanged OnHealthChanged;
在血量产生变化时,会进行一个通知。
bool UAttributeComponent::ApplyChangeHealth(float Delta)
{
CurrentHealth = FMath::Clamp(CurrentHealth + Delta,0.0f,MaxHealth);
OnHealthChanged.Broadcast(nullptr,this,CurrentHealth,Delta);
return true;
}
C++中的通知监听,在组件初始化好之后进行动态监听
void ASCharacter::PostInitializeComponents()
{
Super::PostInitializeComponents();
AttributeComp->OnHealthChanged.AddDynamic(this,&ASCharacter::OnHealthChanged);
}
在这里我进行了一个打印,打印出新血量和Delta
void ASCharacter::OnHealthChanged(AActor* InstigatorActor, UAttributeComponent* AttributeComponent, float NewHealth,
float Delta)
{
FString Msg = FString::Printf(TEXT("Current Health:%f,delta:%f"),NewHealth,Delta);
GEngine->AddOnScreenDebugMessage(-1,5.0f,FColor::Red,Msg);
}
在蓝图中的使用:
在代码里面定义之后,会在对应的组件底部添加事件,进行对应的处理。

在蓝图中的监听:使用绑定对应的事件,执行一次,进度条产生变化。

效果:
可以看出对应的打印已经显示,进度条长度有变化,效果正确。
