API
//AbilitySystemComponent.h
/** Allow events to be registered for specific gameplay tags being added or removed */
FOnGameplayEffectTagCountChanged& RegisterGameplayTagEvent(FGameplayTag Tag, EGameplayTagEventType::Type EventType=EGameplayTagEventType::NewOrRemoved);
允许对指定的GameplayTag在新增或删除时注册事件。
参数 | 类型 | 含义 |
Tag | FGameplayTag Tag | 指定的GameplayTag |
EventType | EGameplayTagEventType::Type | 注册的事件类型 |
返回值 | FOnGameplayEffectTagCountChanged& | 委托的引用 |
以下详细解释下UAbilitySystemComponent::RegisterGameplayTagEvent
功能:向GameplayTag的委托(新增或删除/数量变化两种委托)中注册回调函数,当GameplayTag发生变化时(委托会进行广播,进而)触发回调函数中的逻辑。
两种委托动态多播委托:新增或删除/数量变化
//GameplayEffectTypes.h
DECLARE_MULTICAST_DELEGATE_TwoParams(FOnGameplayEffectTagCountChanged, const FGameplayTag, int32);
struct FDelegateInfo
{
FOnGameplayEffectTagCountChanged OnNewOrRemove;
FOnGameplayEffectTagCountChanged OnAnyChange;
};
两种注册的事件类型
//GameplayEffectTypes.h
UENUM(BlueprintType)
namespace EGameplayTagEventType
{
/** Rather a tag was added or removed, used in callbacks */
enum Type
{
/** Event only happens when tag is new or completely removed */
NewOrRemoved,
/** Event happens any time tag "count" changes */
AnyCountChange
};
}
用法,参考GASShooter代码中的KnockedDownTag和AGSPlayerState::KnockDownTagChanged回调函数。
//GSPlayerState.cpp
void AGSPlayerState::BeginPlay()
{
Super::BeginPlay();
if (AbilitySystemComponent)
{
// Attribute change callbacks
HealthChangedDelegateHandle = AbilitySystemComponent->GetGameplayAttributeValueChangeDelegate(AttributeSetBase->GetHealthAttribute()).AddUObject(this, &AGSPlayerState::HealthChanged);
// Tag change callbacks
AbilitySystemComponent->RegisterGameplayTagEvent(KnockedDownTag, EGameplayTagEventType::NewOrRemoved).AddUObject(this, &AGSPlayerState::KnockDownTagChanged);
}
}
void AGSPlayerState::KnockDownTagChanged(const FGameplayTag CallbackTag, int32 NewCount)
{
AGSHeroCharacter* Hero = Cast<AGSHeroCharacter>(GetPawn());
if (!IsValid(Hero))
{
return;
}
if (NewCount > 0)
{
Hero->PlayKnockDownEffects();
}
else if (NewCount < 1 && !AbilitySystemComponent->HasMatchingGameplayTag(DeadTag))
{
Hero->PlayReviveEffects();
}
}