虚幻GAS:更改属性时,将当前值输出到UI

时间:2018-10-28 21:43:56

标签: c++ unreal-engine4 unreal-gameplay-ability-system

属性的基值更改时,UAttributeSet::PostGameplayEffectExecute()可用于访问(新)值和 GameplayEffect 及其上下文。我正在使用它来将更改后的值打印到UI(在ActionRPG中也是如此)。

属性的当前值是否有类似的可用内容? FGameplayAttributeData::CurrentValue更新时如何通知UI?


  • 尽管每次更新值都会调用UAttributeSet::PreAttributeChange(),但它不提供任何上下文,因此无法从那里访问UI(FAggregator广播的事件也不适合)。
  • 可以改用 GameplayCue 在UI中设置FGameplayAttributeData::CurrentValue的值(提示由 GameplayEffect 设置,当前值)。这可以通过从GameplayCueNotifyActor派生并使用其事件OnExecuteOnRemove来实现。但是,仅实例化一个actor以更新UI似乎浪费资源。
  • 还可以使用UI本身(调用每个刻度或使用计时器访问属性的函数)来获取信息,但是与事件驱动的UI更新相比,这也是浪费的。

1 个答案:

答案 0 :(得分:1)

GameplayAbilitySystem具有UAbilitySystemComponent::GetGameplayAttributeValueChangeDelegate(),它返回类型为FOnGameplayAttributeValueChange的回调,只要属性(基本值或当前值)发生更改,就会触发该回调。可用于注册委托/回调,可用于更新UI。

最小示例

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);
    }
}

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更新UI的示例,该图来自MyCharacterUpdatedManaInUI是将值打印到UI的函数。

Update attribute within blueprint

在这里,UpdatedManaInUI自己检索值。您可能要使用AttributeValue中的OnManaChange