UE5/GAS

어빌리티 태스크 (AT)의 활용

뽀또치즈맛 2025. 6. 10. 23:52

Unreal GAS: 어빌리티 태스크(AT) 활용 패턴 정리

Gameplay Ability System(GAS)에서 어빌리티는 한 프레임 내에서 시작되며,

EndAbility 혹은 CancelAbility가 호출되기 전까지는 계속 실행 상태를 유지합니다.
즉, GA가 시작되면 명시적으로 끝내기 전까지는 유효합니다.

 

시간이 걸리는 GA는 어떻게 설계할까?

어빌리티 중에는 애니메이션 재생, 캐스팅 타임, 딜레이 후 효과 적용 등 시간이 필요한 작업들이 있습니다.

이런 작업을 동기적으로 처리하면 복잡해지고 GA가 차단될 수 있기 때문에,

비동기 방식으로 처리하는 것이 좋습니다.

이를 위해 GAS는 Ability Task(AT, 혹은 Task Ability로 TA)를 제공합니다.

 

어빌리티 태스크(AT) 활용 패턴

기본 사용 순서

  1. Ability Task에 작업 완료 시 브로드캐스팅되는 델리게이트 선언
  2. GA는 AT를 생성하고 델리게이트를 구독
  3. GA의 구독 설정 완료 후, ReadyForActivation() 호출로 TA 구동
  4. 작업 완료 시 AT는 델리게이트를 통해 GA에 콜백 전달
  5. GA 콜백 함수에서 EndAbility() 호출하여 어빌리티 종료

 

 

예시 코드

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

    UAbilityTask_WaitDelay* DelayTask = UAbilityTask_WaitDelay::WaitDelay(this, 2.0f);
    DelayTask->OnFinish.AddDynamic(this, &UGA::OnDelayComplete);
    DelayTask->ReadyForActivation();
}

void UGA::OnDelayComplete()
{
    EndAbility(CurrentSpecHandle, CurrentActorInfo, CurrentActivationInfo, true, false);
}

 

 

Unreal 기본 Ability Task

UAbilityTask_WaitDelay 일정 시간 대기
UAbilityTask_PlayMontageAndWait 몽타주 재생 & 기다리기
UAbilityTask_Repeat 반복 호출
UAbilityTask_WaitTargetData 타겟 지정 기다리기
UAbilityTask_WaitGameplayEvent 특정 게임플레이 이벤트 기다리기

 

 

꼭 Ability Task 클래스를 기본 제공되는 것으로 쓰지 않아도 된다.

시간 지연, 애니메이션, 트레이스 같은 비동기 처린 복잡한 상태 관리가 필요하다면

AT를 만들어 쓰는 것도 좋은 선택지이다.

 

그럼 언제 Ability Task를 꼭 만들어야 할까?

 

상황  태스크 클래스 필요 여부  이유
단순한 이펙트 적용 있는 거 쓰기 ApplyGameplayEffectToTarget() 등으로 충분
시간 지연, 트레이스, 애니메이션 대기 등 만들어 쓰기 GA는 한 프레임 단위, 대기 처리는 Task에서 분리해야 함
반복적/재사용 가능한 비동기 로직 만들어 쓰기 Task로 분리하면 깔끔하게 모듈화 가능
블루프린트에서도 쓰고 싶다 만들어 쓰기 BlueprintAssignable 델리게이트로 노드화 가능