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在新增或删除时注册事件。

参数类型含义
TagFGameplayTag Tag指定的GameplayTag
EventTypeEGameplayTagEventType::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();
	}
}

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐