1일1알

Ability Task (AT) 본문

언리얼/Gameplay Ability System

Ability Task (AT)

영춘권의달인 2024. 6. 17. 17:25

Ability Task (AT)

Gameplay Ability (GA)는 한 프레임에서만 실행되기 때문에 유연한 기능을 제공하지 못할 수도 있다. 따라서 시간이 지남에 따라 발생하거나 특정 시점에 실행된 델리게이트에 응답해야 할 때에는 Ability Task를 사용한다. 예를들어 점프라는 GA가 발동되었을때 Ability Task를 생성하여 착지 시점에 호출되는 델리게이트를 등록하여 착지 시점에 맞춰서 GA를 종료시킬 수 있다.

 

GA는 발동되면 EndAbility가 호출되기 전까지 끝나지 않는다. 애니메이션 재생 같이 시간이 소요되고 상태를 관리해야 하는 어빌리티는 보통 비동기적으로 작업을 수행하고 결과를 통보받는 형태로 구현하고, 이러한 상황을 위해 GAS는 AT를 제공한다.

 

AT의 제작 규칙

  • AT는 AbilityTask 클래스를 상속받아 제작한다.
  • AT 인스턴스를 생성해 반환하는 static 함수를 선언해 구현한다.
  • AT가 종료되면 GA에 알려줄 델리게이트를 선언한다.
  • 시작과 종료 처리를 위해 Activate와 OnDestroy함수를 오버라이딩해 구현한다.
  • 일정 시간이 지난 후 AT를 종료하고자 한다면 AT 활성화시 SetWaitingOnAvatar()함수를 호출해 대기상태로 설정한다.
  • 만약 Tick을 활성화하고 싶다면 bTickingTask를 true로 설정한다.
  • AT가 종료되면 델리게이트를 브로드캐스팅한다.

AT의 활용 패턴

  • 1. AT에 작업이 끝나면 호출되는 종료 델리게이트 선언
  • 2. GA는 AT를 생성한 후 AT의 종료 델리게이트에 호출될 함수를 등록
  • 3. AT를 발동시킬 준비가 되면 AT의 ReadyForActivation함수 호출, AT 발동
  • 4. AT의 작업이 끝나면 델리게이트에 등록한 GA의 콜백 함수 실행
  • 5. GA의 콜백함수가 호출되면 EndAbility를 호출해 GA 종료

예시로 AbilityTask_PlayMontageAndWait라는 이미 구현되어있는 AT가 있는데, 이것은 지정한 몽타주를 재생하고 끝날때까지 기다려주는 기능을 제공하는 편리한 AT이다.

 

GA가 활성화될때 AT를 생성시켜주어야 하는데, 보통 AT클래스 내에 해당 AT를 생성해주는 static함수를 설계해 이 함수를 이용해 AT를 생성해준다. NewAbilityTask<AT>(GA)를 사용해 만들 수 있다.

생성한 AT의 종료 델리게이트에 종료될때 실행될 함수를 등록해주고 ReadyForActivation함수를 호출하여 AT를 발동시킨다.

 

AbilityTask_PlayMontageAndWait의 내부를 간단하게 살펴보면 PlayMontage함수를 실행하여 애니메이션을 실행하고

MontageEndedDelegate.BindUObject(this, &UAbilityTask_PlayMontageAndWait::OnMontageEnded);
AnimInstance->Montage_SetEndDelegate(MontageEndedDelegate, MontageToPlay);

를 통해 MontageEndedDelegate라는 델리게이트에 OnMontageEnded()라는 함수를 등록하고 몽타주가 끝나는 델리게이트에 MontageEndedDelegate를 등록한다.

그리고 SetWaitingOnAvatar();를 통해 AT가 바로 끝나지 않도록 대기시킨다.

그러면 몽타주가 끝나는 시점에 MontageEndedDelegate에 등록한 함수가 실행되고, MontageEndedDelegate에는 OnMontageEnded함수가 등록되어있다.

void UAbilityTask_PlayMontageAndWait::OnMontageEnded(UAnimMontage* Montage, bool bInterrupted)
{
	if (!bInterrupted)
	{
		if (ShouldBroadcastAbilityTaskDelegates())
		{
			OnCompleted.Broadcast();
		}
	}

	EndTask();
}

OnMontageEnded에서는 ShouldBroadcastAbilityTaskDelegates()를 통해 끝났다는 정보를 전파할 것인지를 검사하고 OnCompleted에 등록된 함수를 실행해준다. 그리고 EndTask를 호출하여 Task를 종료시킨다.

 

GA를 발동시켰을 때 AT를 만들고 AT의 OnCompleted 델리게이트에 GA의 EndAbility 관련 함수를 넣어준 뒤 ReadyForActivation함수를 실행하면 GA가 발동되면서 AT가 생성되고 SetWaitingOnAvatar 에 의해 애니메이션이 종료될때까지 대기상태로 있다가 애니메이션이 종료되면 OnCompleted에 등록된 EndAbility관련 함수가 호출되면서 GA가 종료되는 식으로 아름답게 동작한다.

 

AT내의 편리한 함수

  • GetAvatarActor() : AT를 실행한 GA의 AvatarActor를 가져온다.
  • GetOwnerActor() : AT를 실행한 GA의 OwnerActor를 가져온다.

 

'언리얼 > Gameplay Ability System' 카테고리의 다른 글

Gameplay Effect  (0) 2024.07.02
Attribute  (0) 2024.07.02
Gameplay Tags  (0) 2024.06.16
Gameplay Abilities (GA)  (0) 2024.06.16
Ability System Component (ASC)  (0) 2024.06.16