게임플레이 어빌리티(Gameplay Ability) 는 UGameplayAbility
클래스에서 파생된 것으로, 게임 내 어빌리티가 하는 일, 사용 비용(있는 경우), 사용할 수 있는 상황 및 시점 등을 정의합니다. 게임플레이 어빌리티는 비동기 실행되는 인스턴스된 오브젝트로 존재할 수 있기에 캐릭터 애니메이션, 파티클과 사운드 이펙트, 플레이어 입력이나 실행 도중 벌어지는 캐릭터 상호작용에 따른 분기처럼 전문화된 다단계 태스크를 실행할 수 있습니다. 네트워크를 통한 자체 리플리케이트나, (클라이언트 측 예측 지원을 포함해서) 클라이언트 또는 서버 머신에서의 실행이나, 심지어 변수 동기화 및 원격 프로시저 콜(Remote Procedure Calls, RPC) 호출도 가능합니다. 또한 쿨다운 및 사용 비용, 플레이어 입력, 애님 몽타주가 있는 애니메이션, 액터에 부여되는 어빌리티 자체에 대한 반응을 구현하는 확장 가능한 함수 기능 등 게임 세션 중에 엔진이 게임플레이 어빌리티를 구현하는 방식에 있어 유연성을 제공합니다.
액터가 어빌리티를 사용하기 전에 어빌리티 시스템 컴포넌트에 해당 어빌리티를 부여해야 합니다. 다음 어빌리티 시스템 컴포넌트 함수는 어빌리티에 액세스를 부여합니다.
GiveAbility
: FGameplayAbilitySpec
으로 추가할 어빌리티를 나타내며, FGameplayAbilitySpecHandle
을 반환합니다.GiveAbilityAndActivateOnce
: FGameplayAbilitySpec
으로 추가할 어빌리티를 나타내며, FGameplayAbilitySpecHandle
을 반환합니다. 어빌리티는 반드시 인스턴스되고 서버에서 실행할 수 있어야 합니다. 서버에서 어빌리티 실행을 시도한 후에는 FGameplayAbilitySpecHandle
이 반환됩니다. 어빌리티가 필수 조건을 충족하지 못했거나 실행할 수 없었던 경우, 반환 값은 유효하지 않게 되어 어빌리티 시스템 컴포넌트가 어빌리티를 부여받지 못합니다.다음은 어빌리티 시스템 컴포넌트에서 어빌리티에 대한 액세스를 철회하는 함수로, 어빌리티를 부여받았을 때 반환된 FGameplayAbilitySpecHandle
을 사용합니다.
ClearAbility
: 지정한 어빌리티를 어빌리티 시스템 컴포넌트에서 제거합니다.SetRemoveAbilityOnEnd
: 지정한 어빌리티 실행이 완료되면 어빌리티 시스템 컴포넌트에서 제거합니다. 어빌리티가 실행 중이지 않은 경우 즉시 제거합니다. 어빌리티가 실행 중인 경우, 그 입력을 즉시 지워 플레이어가 더 이상 재활성화 또는 상호작용하지 못하도록 합니다.ClearAllAbilities
: 어빌리티 시스템 컴포넌트에서 모든 어빌리티를 제거합니다. FGameplayAbilitySpecHandle
이 필요하지 않은 유일한 함수입니다.게임플레이 어빌리티가 액터의 어빌리티 시스템 컴포넌트에 부여된 이후의 기본 실행 주기는 다음과 같습니다.
CanActivateAbility
는 호출자가 어빌리티 실행을 시도하지 않아도 어빌리티 사용 가능 여부를 알려줍니다. 예를 들어, 유저 인터페이스에서 플레이어가 사용할 수 없는 아이콘을 회색 처리하여 비활성화하거나, 캐릭터에 사운드 또는 파티클 이펙트를 재생하여 특정 어빌리티를 사용할 수 있음을 표시해야 할 수도 있습니다.CallActivateAbility
는 어빌리티에 관련된 게임 코드를 실행하지만, 어빌리티의 사용 가능 여부는 검사하지 않습니다. 이 함수는 CanActivateAbility
검사와 어빌리티 실행 사이에 약간의 로직이 필요한 경우에 주로 호출됩니다.
ActivateAbility
또는 블루프린트 이벤트 Activate Ability입니다.CommitAbility
는 Activate 내에서 호출한 경우 어빌리티 실행 비용을 적용합니다. 즉 게임플레이 어트리뷰트(Gameplay Attribute)에서 '마나', '스태미나' 등 게임 시스템에 맞는 리소스를 빼고 쿨다운을 적용합니다.CancelAbility
는 어빌리티 취소 메커니즘을 제공합니다. 어빌리티의 CanBeCanceled
함수가 요청을 거부할 수 있습니다. CommitAbility
와 달리, 이 함수는 어빌리티 자체 외부 호출자에서 사용할 수 있습니다. 취소가 성공하면 게임플레이 어빌리티 취소 시(On Gameplay Ability Cancelled)로 브로드캐스트한 뒤 해당 어빌리티를 종료하기 위한 표준 코드 경로로 들어가, 어빌리티에 특수한 클린업 코드를 실행할 기회를 주거나 정상적으로 종료했을 때와 다른 작동을 하도록 할 수 있습니다.TryActivateAbility
는 어빌리티를 실행하는 전형적인 방식입니다. 이 함수는 CanActivateAbility
를 호출해서 어빌리티를 즉시 실행할 수 있는지 여부를 판단하고, 가능하다면 CallActivateAbility
를 호출합니다.EndAbility
(C++) 또는 End Ability 노드(블루프린트)는 어빌리티 실행을 마치면 어빌리티를 종료합니다. 어빌리티가 취소된 경우 UGameplayAbility
클래스에서 취소 프로세스의 일부로 자동 처리하지만, 다른 모든 경우에는 개발자가 C++ 함수를 호출하거나 어빌리티의 블루프린트 그래프에 노드를 추가해야 합니다. 어빌리티를 정상적으로 종료하지 못하면 게임플레이 어빌리티 시스템은 어빌리티가 아직 실행 중인 것으로 믿으며, 향후 해당 어빌리티 또는 그 어빌리티가 차단한 다른 어빌리티를 사용하지 못하게 될 수 있습니다. 예를 들어 게임에서 체력 회복약 마시기(Drink Health Potion)라는 게임플레이 어빌리티가 정상 종료되지 못한 경우, 해당 어빌리티를 사용하는 캐릭터는 다른 약 마시기, 질주하기, 사다리 오르기 등 체력 회복약 마시기가 방지하는 다른 액션을 취할 수 없게 됩니다. 이러한 어빌리티 차단은 게임플레이 어빌리티 시스템이 캐릭터가 아직 약을 마시는 중이라고 간주하므로 무한히 계속됩니다.<aside> 📌
언리얼 엔진 프로젝트에서 게임플레이 어빌리티를 구성하는 방법에 대한 자세한 내용은 액션 RPG의 게임플레이 어빌리티를 확인하세요.
</aside>
게임플레이 태그(Gameplay Tag) 는 여러 게임플레이 어빌리티의 상호작용 방식을 결정하는 데 도움이 됩니다. 각 어빌리티에는 어빌리티의 비헤이비어에 영향을 미칠 수 있는 방식으로 어빌리티를 식별 및 분류하는 태그 세트가 있으며, 다른 어빌리티와의 인터랙션을 지원하기 위한 게임플레이 태그 컨테이너(Gameplay Tag Container) 및 게임플레이 태그 쿼리(Gameplay Tag Query)도 있습니다.
게임플레이 태그 변수 | 목적 |
---|---|
태그로 어빌리티 취소(Cancel Abilities With Tag) | 이 어빌리티가 실행되는 동안 이미 실행 중인 어빌리티의 태그가 제공된 목록과 일치하면 취소합니다. |
태그로 어빌리티 차단(Block Abilities With Tag) | 이 어빌리티가 실행되는 동안 일치하는 태그가 있는 다른 어빌리티의 실행을 방지합니다. |
활성화 소유 태그(Activation Owned Tags) | 이 어빌리티가 실행되는 동안 해당 어빌리티의 오너에 이 태그 세트가 부여됩니다. |
활성화 필수 태그(Activation Required Tags) | 이 어빌리티는 활성 상태인 액터 또는 컴포넌트에 이러한 태그가 모두 있을 때만 활성화할 수 있습니다. |
활성화 차단 태그(Activation Blocked Tags) | 이 어빌리티는 활성 상태인 액터 또는 컴포넌트에 이러한 태그가 하나도 없을 때만 활성화할 수 있습니다. |
타깃 필수 태그(Target Required Tags) | 이 어빌리티는 타깃 액터 또는 컴포넌트에 이 태그가 모두 있을 때만 활성화할 수 있습니다. |
타깃 차단 태그(Target Blocked Tags) | 이 어빌리티는 타깃 액터 또는 컴포넌트에 이 태그가 하나도 없을 때만 활성화할 수 있습니다. |