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가 필요한 부분이 있는가 하면 아닌 듯하다.
우선 뒤의 트리거와 이펙트 수업까지 봐야 현재의 프로젝트에 맞는 설계를 할 수 있을 듯하다!