언리얼 엔진의 게임플레이 어빌리티 태스크 | 언리얼 엔진 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는 하고 싶을 때 유용하다.
- 하지만 AbilityTask::InitSimulatedTask 함수를 override하여 그 안에서 bSimulatedTask 플래그와
- 모든 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 |