https://dev.epicgames.com/documentation/ko-kr/unreal-engine/gameplay-ability-tasks-in-unreal-engine?application_version=5.3

 

언리얼 엔진의 게임플레이 어빌리티 태스크 | 언리얼 엔진 5.4 문서 | Epic Developer Community

어빌리티 태스크 클래스의 개요입니다.

dev.epicgames.com

https://github.com/tranek/GASDocumentation?tab=readme-ov-file#concepts-at

 

GitHub - tranek/GASDocumentation: My understanding of Unreal Engine 5's GameplayAbilitySystem plugin with a simple multiplayer s

My understanding of Unreal Engine 5's GameplayAbilitySystem plugin with a simple multiplayer sample project. - tranek/GASDocumentation

github.com

  • 일반적인 Gameplay Task Class의 특수한 형태로 GA와 함께 작동하도록 되어있다.
  • GAS를 사용하는 게임에는 보통 고유한 Gameplay 기능을 구현하는 다양한 Custom Ability Task가 포함되어 있다.
  • 이러한 Task는 GA 실행 중 비동기로 수행하고, Native C++에서 Delegate를 호출하거나
    BP에서 하나 이상의 출력 실행 핀을 이동하여 실행 흐름에 영향을 미칠 수 있다.
    • 이를 통해 Ability가 여러 Frame에서 실행되기도 하고, 동일 Frame에 여러 개의 다른 기능을 수행할 수 있다.
  • 대부분의 Ability Task에는 즉시 발동하는 실행 핀이 있다.
    • 때문에 TAsk 시작 후에도 BP가 계속 실행 된다.
  • 이 외에 Delay 후에 발동되거나, 발생하지 않을 수도 있는 조건부 이벤트에 뒤따라 발동되는 Task별 핀이 있기도 하다.
  • Ability Task를 종료시킬 수 있는 방법은 2가지이다.
    • EndTask 함수를 호출하여 자체적으로 종료
    • 해당 Task를 실행한 Gameplay Ability가 끝날 때 자동 종료하도록 대기
  • 이는 Phantom Ability Task가 실행되어 CPU 및 메모리 누수가 나는 것을 방지합니다.
  • Ability Task는 Network 여부와 상관 없이 모두 사용하도록 설계되었지만 ,직접 자체적으로 업데이트 하지 않는다.
    • 일반적으로 Ability Task는 Replicate되는 GA에서 생성된다.
    • 하지만 실행 흐름을 결정하기 위해 Input이나 Network Variable 등 Replicate 된 정보를 사용한다.
    • 때문에 간접적으로 동기화 상태를 유지한다.

Definition

  • GA는 오직 한 Frame에서 동작하고 이 이상의 유연성을 제공하지 않는다.
  • 여러 Frame에서 동작 하거나 시간이 지난 후 특정 시점에 Delegate를 받으려면 Gmaplay Task를 써야 한다.
  • AbilityTask는 일반적인 Gameplay Task의 특수한 형태로 다음 기능들을 제공한다.
    • RootMotionSource로 움직이는 Character에 대한 Task
    • Animation Montage를 재생시키는 Task
    • Attribute 변화에 대한 반응 Task
    • GE 변화에 대한 반응 Task
    • Player Input에 대한 반응 Task
  • UAbilityTask 생성자는 동시에 실행될 수 있는 AbilityTask를 게임 전체에서 최대 1000개로 제한한다.
    • 이는 캐릭터가 수 백개가 나오는 RTS 게임 설계에서 유념해둬야 한다.

Custom Ability Task

  • Custom Ability Task 생성은 매우 빈번할 것이다.
  • AbilityTask는 다음으로 구성되어 있다.
    • 새 AbilityTask Instance를 생성하는 static function
    • AbilityTask가 동작을 완수 했을 때 발생하는 delegate
    • Activate() 함수
      • 주요 작업을 시행하고 외부 delegate에 bind
    • OnDestroy()
      • 외부 delegate를 포함한 모든 clean up
    • 외부 Delegate에 Bind 되는 Callback 함수
    • 멤버 변수와 다른 내부 함수
  • AbilityTask는 오직 하나의 Output Delegate를 선언할 수 있다.
    • 모든 Output Delegate 는 파라미터가 있든 없든 이 타입이어야 한다.
    • 파라미터를 사용 안 하면 Default Value가 전달된다.
  • Ability Task는 오직 이를 소지한 GameplayAbility의 서버/클라이언트에서만 동작한다.
    • 하지만 AbilityTask::InitSimulatedTask 함수를 override하여 그 안에서 bSimulatedTask 플래그와
      다른 Replicate 되는 멤버변수를 설정하여 Simulated Client에서 동작하도록 할 수 있다.
    • 이는 모든 Movement AbilityTask를 replicate 하고 싶지 않지만 simulate는 하고 싶을 때 유용하다.
  • 모든 RootMotionSource AbilityTask는 이것을 사용한다.
  • 또한 AbilityTask::TickTask를 override하여 bTickTask 플래그를 활성화 하면 Tick을 사용할 수 있다.
    • 이는 프레임에 따라 값이 부드럽게 바뀌는 경우에 유용하다.

Using Ability Task

C++

더보기
UGDAT_PlayMontageAndWaitForEvent* Task = UGDAT_PlayMontageAndWaitForEvent::PlayMontageAndWaitForEvent(this, NAME_None, MontageToPlay, FGameplayTagContainer(), 1.0f, NAME_None, false, 1.0f);
Task->OnBlendOut.AddDynamic(this, &UGDGA_FireGun::OnCompleted);
Task->OnCompleted.AddDynamic(this, &UGDGA_FireGun::OnCompleted);
Task->OnInterrupted.AddDynamic(this, &UGDGA_FireGun::OnCancelled);
Task->OnCancelled.AddDynamic(this, &UGDGA_FireGun::OnCancelled);
Task->EventReceived.AddDynamic(this, &UGDGA_FireGun::EventReceived);
Task->ReadyForActivation();

BP

  • BP에서는 ReadyForActivation()을 호출할 필요가 없다.
    • K2Node_LatentGameplayTaskCall에서 자동으로 호출해준다.
    • 해당 AbilityTask에 있는 경우 BeginSpawningActor(), FinishSpawningActor()도 자동으로 호출해준다.

Root Motion Source Ability Task

  • GAS에서 캐릭터를 이동시키는 AbilityTask는 CharacterMovementComponent에
    후킹 된 Root Motion Source를 이용한다.

'UE5 > GAS' 카테고리의 다른 글

[GAS] Gameplay Cue  (0) 2024.05.21
[GAS] Gameplay Ability  (0) 2024.05.17
[GAS] Gameplay Effect  (0) 2024.05.15
[GAS] Attribute Set  (1) 2024.05.14
[GAS] Gameplay Attribute  (0) 2024.05.13

+ Recent posts