Система GameplayAbilitySystem имеет UAbilitySystemComponent::GetGameplayAttributeValueChangeDelegate()
, которая возвращает обратный вызов типа FOnGameplayAttributeValueChange
, который запускается при изменении атрибута (базовое значение или текущее значение).Это можно использовать для регистрации делегата / обратного вызова, который можно использовать для обновления пользовательского интерфейса.
Минимальный пример
В MyCharacter.h
// Declare the type for the UI callback.
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FAttributeChange, float, AttributeValue);
UCLASS()
class MYPROJECT_API MyCharacter : public ACharacter, public IAbilitySystemInterface
{
// ...
// This callback can be used by the UI.
UPROPERTY(BlueprintAssignable, Category = "Attribute callbacks")
FAttributeChange OnManaChange;
// The callback to be registered within AbilitySystem.
void OnManaUpdated(const FOnAttributeChangeData& Data);
// Within here, the callback is registered.
void BeginPlay() override;
// ...
}
В MyCharacter.cpp
void MyCharacter::OnManaUpdated(const FOnAttributeChangeData& Data)
{
// Fire the callback. Data contains more than NewValue, in case it is needed.
OnManaChange.Broadcast(Data.NewValue);
}
void MyCharacter::BeginPlay()
{
Super::BeginPlay();
if (AbilitySystemComponent)
{
AbilitySystemComponent->GetGameplayAttributeValueChangeDelegate(MyAttributeSet::GetManaAttribute()).AddUObject(this, &MyCharacterBase::OnManaUpdated);
}
}
In MyAttributeSet.h
UCLASS()
class MYPROJECT_API MyAttributeSet : public UAttributeSet
{
// ...
UPROPERTY(BlueprintReadOnly, Category = "Mana", ReplicatedUsing=OnRep_Mana)
FGameplayAttributeData Mana;
// Add GetManaAttribute().
GAMEPLAYATTRIBUTE_PROPERTY_GETTER(URPGAttributeSet, Mana)
// ...
}
Пример обновления пользовательского интерфейса через EventGraph светокопии персонажа, которая получена из MyCharacter
.UpdatedManaInUI
- это функция, которая печатает значение в пользовательском интерфейсе.
Здесь UpdatedManaInUI
получает значение самостоятельно.Вы можете использовать AttributeValue
из OnManaChange
.