UnrealEngine5/공부

[UE5/GAS] 상태Tag와 AT를 활용한 GA, AT 규칙

왹져박사 2025. 5. 29. 02:03

인프런 [이득우의 언리얼 프로그래밍 Part4 - 게임플레이 어빌리티 시스템] 강의 공부 노트

강의를 들으며 개념 정리 후, 다른 프로젝트에 실습하고 있습니다. 


 

상태 태그를 이용한 어빌리티 활성화 판별

CanActivateAbility

현재 상태 태그를 확인하여 어빌리티의 활성화를 결정한다. 

bool UVSGA_AttackBase::CanActivateAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayTagContainer* SourceTags, const FGameplayTagContainer* TargetTags, OUT FGameplayTagContainer* OptionalRelevantTags) const
{
	bool bResult = Super::CanActivateAbility(Handle, ActorInfo, SourceTags, TargetTags, OptionalRelevantTags);
	if (!bResult)
	{
		return false;
	}

	return bCanAttack;
}

앞에서 배운 내용에 따르면, bCanAttack 부분은 후에 PlayerState에서 관리하게 될 것 같다.

 

여기서 설정한 Tag가 false라면 ActivateAbility가 실행되지 않고,

Tag가 true라면 상태를 체크하여 실행을 결정하게 된다.

다음은 ActivateAbility로 애니메이션 몽타주을 실행하는 AT를 구동하고,

쿨타임을 설정하여 상태를 제한하고 있다.

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

	bCanAttack = false;
	AVSCharacterChampionPlayer* VSCharacterChampion = CastChecked<AVSCharacterChampionPlayer>(ActorInfo->AvatarActor.Get());

	UVSAttackDataAsset* AttackData = VSCharacterChampion->GetAttackData();
	UAnimMontage* SkillAttackMontage = AttackData->SkillAttackMontage;
	if (SkillAttackMontage)
	{
		UAbilityTask_PlayMontageAndWait* PlayAttackTask = UAbilityTask_PlayMontageAndWait::CreatePlayMontageAndWaitProxy(this, TEXT("PlaySkillAttack"), SkillAttackMontage);

		// 종료 델리게이트 구독. 
		PlayAttackTask->OnCompleted.AddDynamic(this, &UVSGA_SkillAttack::OnCompletedCallback);
		PlayAttackTask->OnInterrupted.AddDynamic(this, &UVSGA_SkillAttack::OnInterruptedCallback);

		// AT 구동.
		PlayAttackTask->ReadyForActivation();
	
		// 스킬 타이머 설정. 
		GetWorld()->GetTimerManager().SetTimer(
			SkillAttackTimerHandle,
			FTimerDelegate::CreateLambda([&]()
				{
					LOL_LOG(LogProjectLOL, Log, TEXT("SkillAttackEnd"));
					bCanAttack = true;
				}), AttackData->SkillAttackTime + AttackData->SkillAttackCoolTime, false
		);
	}
}

 

 


 

AT의 제작 규칙

기본 조건

  • UAbilityTast를 상속
  • 일반적으로 AT 인스턴스를 생성해 반환하는 static 함수 선언
  • AT 종료 시 GA에 알려줄 델리게이트 선언

필요 시

  • 시작과 종료 처리를 위해 Activate와 OnDestroy 오버라이드
  • 일정 시간 이후 종료가 필요하면, 활성화 시 SetWaitingOnAvatar를 호출하여 Waiting 상태로 호출
  • Tick 활성화는 bTickingTask = true
  • 종료 시 선언한 델리게이트 브로드캐스팅

 

현재 프로젝트의 시스템적인 부분에서 AT가 필요한 부분이 있는가 하면 아닌 듯하다.

우선 뒤의 트리거와 이펙트 수업까지 봐야 현재의 프로젝트에 맞는 설계를 할 수 있을 듯하다!