Replicated

[Drag Down] Gameplay Tag로 어빌리티 꼬임 방지 본문

언리얼 엔진/Drag Down (캡스톤 디자인)

[Drag Down] Gameplay Tag로 어빌리티 꼬임 방지

라구넹 2025. 4. 2. 01:36

어빌리티 쓰던 도중 다른 어빌리티 쓰면

이전 어빌리티가 AnimNotify에서 태그 제대로 못받아서 어빌리티가 제대로 안끝난다

애초에 도중에 다른 어빌리티 쓰는게 의도된 동작이 아니니 막아보자

 

특정 게임플레이 태그가 있으면 어빌리티가 발동하지 않도록 막을 것이다

ActivationBlockedTags 쓰면 된다

(게임플레이 태그는 정말 쓰면 쓸 수록 너무나 좋은 시스템인 것 같다.)

 

 

현재 상태 기반 공격, 점프 공격, 회피

세 종류만 해주면 된다

 

UDDGA_PushingCharacter::UDDGA_PushingCharacter()
{
	NetExecutionPolicy = EGameplayAbilityNetExecutionPolicy::LocalPredicted; 
	InstancingPolicy = EGameplayAbilityInstancingPolicy::InstancedPerActor;

	static ConstructorHelpers::FObjectFinder<UAnimMontage> PushingMontageRef(TEXT("/Script/Engine.AnimMontage'/Game/Animation/Montage/AM_Manny_Pushing.AM_Manny_Pushing'"));
	if ( PushingMontageRef.Succeeded() )
	{
		PushingMontage = PushingMontageRef.Object;
	}

	bIsTraced = false;

	ActivationBlockedTags.AddTag(FGameplayTag::RequestGameplayTag(FName("Player.State.UsingAbility")));
}

발동 못하게 ActivationBlockedTags에 설정해주고

 

void UDDGA_PushingCharacter::ActivateAbility(const FGameplayAbilitySpecHandle Handle,
	const FGameplayAbilityActorInfo* ActorInfo, 
	const FGameplayAbilityActivationInfo ActivationInfo, 
	const FGameplayEventData* TriggerEventData)
{
	Super::ActivateAbility(Handle, ActorInfo, ActivationInfo, TriggerEventData);
	
	...

	if (UAbilitySystemComponent* ASC = ActorInfo->AbilitySystemComponent.Get())
	{
		ASC->AddLooseGameplayTag(FGameplayTag::RequestGameplayTag(FName("Player.State.UsingAbility")));
	}
	...

ActivateAbility에서 태그 달고

 

void UDDGA_PushingCharacter::EndAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, bool bReplicateEndAbility, bool bWasCancelled)
{
	bIsTraced = false;

	if (UAbilitySystemComponent* ASC = ActorInfo->AbilitySystemComponent.Get())
	{
		ASC->RemoveLooseGameplayTag(FGameplayTag::RequestGameplayTag(FName("Player.State.UsingAbility")));
	}
	...

EndAbility에서 제거해준다

 

이제 어빌리티가 꼬일 일이 없다