https://github.com/tranek/GASDocumentation#concepts-ga
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. - GitHub - tranek/GASDocumentation: My understanding of Unreal Engine 5's Gamepl...
github.com
단순히 위의 문서를 보고 제멋대로 해석해서 적은 것입니다. 차라리 위의 문서를 봐주세요. 저 영어 못 합니다.
4.7 Ability Tasks
4.7.1 Abilty Task Definition
게임플레이 어빌리티는 한 프레임에서만 동작한다. 이러한 동작은 유연성이 별로 없다. 시간이 지나서 작동해야 하거나 특정 포인트에서 델리게이트를 동작시키기 위해서는 AbilityTasks라는 잠재적인 액션이 필요하다.
GAS에는 많은 AbilityTasks가 제공된다.
- RootMotionSource와 함께 캐릭터를 움직이는 태스크
- 애니메이션 몽타주를 재생하는 태스크
- 어트리뷰트의 변화에 반응하는 태스크
- 게임플레이 이펙트의 변화에 반응하는 태스크
- 플레이어 인풋에 반응하는 태스크
- 그외 등등
UAbilityTask 생성자는 하드코딩된 게임 전체에서 최대 1000개의 동시 AbilityTasks를 동시에 실행하도록 강제한다. RTS게임처럼 전 세계에서 동시에 수백 개의 캐릭터를 사용할 수 있는 게임의 게임플레이 어빌리티를 디자인할 때는 이 점을 염두해 둬야 한다.
4.7.2 Custom Abilty Tasks
종종 커스텀 Ability Tasks를 만들일이 있다.(C++에서) 샘플프로젝트에서는 2가지 커스텀 Ability Task가 있다:
- PlayMontageAndWaitForEvent는 PlayMontageAndWait와 WaitGameplayEvent 2가지 어빌리티 태스크의 결합이다. 이 태스크는 애니메이션 몽타주가 게임플레이 이벤트를 AnimNotifies에서 이벤트를 시작한 게임플레이 어빌리티로 돌려보내는 작업을 한다. 애니메이션 몽타주동의 특정한 시간에 액션을 트리거하기 위해서는 이걸 사용해라.
- WaitRecieveDamage는 OwnerActor가 데미지를 받는지 듣는다. 패시브 방어구 스택 어빌리티는 데미지 영웅이 데미지 인스턴스를 받았을 때, 스택을 제거한다.
어빌리티 태스크는 다음으로 구성된다:
- 어빌리티 태스크의 인스턴스를 생성하는 static 함수
- 어빌리티 태스크가 목적을 완수하였을 때 broadcast되는 델리게이트
- 외부의 델리게이트와 바인딩하면서 메인 목적을 수행하는 Activate()함수
- 외부의 델리게이트와 바인딩하면서 정리를 위한 OnDestroy()함수
- 바운딩된 외부 델리게이트와의 콜백 함수
- 멤버 변수와 내부 헬퍼 함수
Note: 어빌리티 태스크는 아웃풋 델리게이트 타입을 하나만 선언할 수 있다. 모든 아웃풋 델리게이트는 파라미터를 사용하든 안하든 이 타입이어야만 한다. 사용되지 않는 파라미터에는 디폴트 값을 넣도록 하자.
어빌리티 태스크는 오직 본인의 게임플레이 어빌리티가 돌아가는 클라이언트나 서버에만 돌아간다. 그러나 게임플레이 태스크는 어빌리티 태스크의 생성자에서 bSimulatedTask = true;를 설정하고 virtual void InitSimulatedTask(UGameplayTaskComponent& InGameplayTasksComponent);와 replicate를 위한 멤버 변수를 세팅하여 simulated 클라이언트에서 돌아가도록 설정할 수 있다. 이런 것은 무브먼트 어빌리티태스크처럼 흔하지 않은 상황이다. 모든 RootMotionSource 어빌리티 태스크는 이렇게 한다. AbilityTask_MoveToLocation.h/.cpp이 예시이다.
어빌리티 태스크는 bTickingTask = true;를 통해 Tick기능을 사용할 수 있다. 어빌리티 태스크의 생성자안에서 true로 설정하고 virtual void TickTask(float DeltaTime);을 재정의한다. 이 기능은 프레임마다 러프 값을 매끄럽게 하기에 현한 방법이다. AbilityTask_MoveToLocation.h/.cpp을 보자.
4.7.3 Using Ability Tasks
C++에서 어빌리티 태스크를 접근하기 위해서(From GDGA_FireGun.cpp)
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();
블루프리트에서는 어빌리티 태스크를 위해서 만든 블루프린트 노드를 사용하면 된다. ReadyForactivation()을 호출할 필요가 없다. 그것은 자동적으로 Engine/Source/Editor/GameplayTasksEditor/Private/K2Node_LatentGameplayTaskCall.cpp
에 의해 호출된다. 또한 BeginSpawningActor() and FinishSpawningActor()도 어빌리티 태스크 클래스안에 존재한다면 K2Node_LatentGameplayTaskCall가 자동적으로 호출한다(AbilityTask_WaitTargetData()를 보자). 블루프린트에서만 자동적인 호출이 된다. C++에선, 수동적으로 ReadyForActivation(), BeginSpawningActor(), FinishSpawningActor()를 호출해야 한다.
수동으로 어빌리티 태스크를 위소하고 싶다면, EndTask()를 어빌리티 태스크 오브젝트에서 호출하면 된다. 블루프린트(called Async Task Proxy)나 C++에서
4.7.4 Root Motion Source Ability Tasks
GAS는 넉백이나 복잡한 점프, 당기기, 대쉬와 같은 움직이는 캐릭터를 위해서 CharacterMovementComponent와 연관된 Root Motion Source를 제공한다.
'Unreal Engine > Gameplay Ability System' 카테고리의 다른 글
[UE] Gameplay Ability System -8- Abilty System Globals (0) | 2023.06.02 |
---|---|
[UE] Gameplay Ability System -7- Gameplay Cue (0) | 2023.06.02 |
[UE] Gameplay Ability System -5- Gameplay Ability (0) | 2023.05.30 |
[UE] Gameplay Ability System -4- Gameplay Effects (0) | 2023.05.28 |
[UE] Gameplay Ability System -3- Attribute Set (0) | 2023.05.26 |