Choose your operating system:
Windows
macOS
Linux
Action RPG (ARPG) 의 어빌리티 유형은 크게 두 가지,
Melee
(근접, 밀리)와
Skill
(스킬)입니다. 두 어빌리티 다 비슷하지만, 차이가 약간 있습니다. 예를 들어 밀리 어빌리티는 캐릭터의 무기가 적에 겹치면 시전되는 반면, 스킬 어빌리티는 스킬별 라인 트레이스 검사를 사용합니다. 다음 이미지는 모든 밀리 어빌리티의 베이스인
GA_MeleeBase
의 블루프린트 그래프입니다.
ActivateAbility
는 어빌리티 시작 시 호출하며,
CommitAbility
는 어빌리티의
Cost
(비용, ARPG 에서는 보통 마나) 및
Cooldown
(재사용 대기시간, 쿨다운)을 적용합니다.
EndAbility
는 어빌리티 실행이 끝났음을 시스템에 알리기 위해 호출합니다. 다른 두 노드는 ARPG 전용으로, 보통 게임마다 필요에 따라 새 함수와 노드를 추가합니다.
PlayMontageandWaitForEvent 는 AbilityTask 노드로, URPGAbilityTask_PlayMontageAndWaitForEvent 에 해당합니다. AbilityTasks 는 태스크 실행에 사용되는 함수, 변수, 태스크 (이 경우 PlayMontageAndWaitForEvent) 생성을 위한 정적 함수 세트를 정의하는 특수 오브젝트입니다. 태스크에서 가동하는 동적/블루프린트 델리게이트 세트도 있습니다. (상단 옆에서 항상 즉시 가동되는) 각 출력 실행 핀은 이 델리게이트 중 하나에 해당하며, 출력 데이터 핀은 델리게이트의 시그너처에 일치합니다. 이 특정 태스크는 UAbilityTask_PlayMontageAndWait 및 UAbilityTask_WaitGameplayEvent 의 조합으로, 약간의 게임 전용 트윅과 코멘트를 포함합니다. 게임마다 새 게임플레이 태스크를 다수 구현하게 마련이므로, 이 태스크는 설정 방법에 대한 좋은 예가 됩니다.
이 태스크 작동 방식은 먼저 몽타주를 재생한 뒤
AbilitySystemComponent
에서 게임플레이 이벤트가 방출(emit)될 때까지 대기(listen)합니다. 방출된 게임플레이 이벤트가 전달된
EventTags
에 일치하면 태그 및 페이로드와 함께
EventReceived
실행 핀을 가동한 뒤
ApplyEffectContainer
함수를 호출합니다. 몽타주 블렌딩이 끝나거나, 중단 또는 취소되면, 어빌리티가 끝납니다. 실제 게임플레이 이벤트는
WeaponActor
블루프린트에서 방출되며, 로직은 다음과 같습니다.
무기 액터가 캐릭터에 겹칠 때 발동됩니다. 그러면
GameplayEventData
페이로드를 생성하고
Target Actor + Instigator.
에 전달합니다. 그런 다음 몽타주에 배치한
Anim Notify
스테이트로 게임플레이 이벤트를 전송합니다. 즉 그 이벤트가 발동되면, 어빌리티 그래프는
EventReceived
실행 핀을 가동합니다.
ApplyEffectContainer
노드는
URPGGameplayAbility::ApplyEffectContainer
에 해당하며, 게임플레이 이펙트 세트를 적용합니다. 각 URPGGameplayAbility 에는
FRPGGameplayEffectContainer
구조체에 대한 태그로 된 맵이 있으며, 여기에는 타깃 정보와 적용할 게임플레이 이펙트 목록이 들어갑니다.
GA_PlayerAxeMelee
의 그 맵 예제입니다.
AM_Attack_Axe
몽타주를 실행하면,
Event.Montage.Shared.WeaponHit GameplayEvent
가 방출되었을 때
RPGTargetType_UseEventData
타기팅 클래스를 사용하여
GE_PlayerAxeMelee
이펙트를 실행할 것임을 나타냅니다. 그 타깃 유형은
RPGTargetType.cpp
파일에 네이티브 C++ 로 구현되어 있으며, 전달된
EventData
에서 타깃 액터와 히트 결과를 추출합니다. 그 맵의 두 번째 엘리먼트는
BurstPound
특수 공격을 실행하는데, 이 스킬은 나중에 자세이 설명합니다.
ApplyEffectContainer 는 두 가지 작업을 합니다. 첫째, 이 맵 안에서 전달된 태그에 일치하는 FRPGGameplayEffectContainer 를 찾습니다. 찾으면 TargetData 와 EffectSpecs 목록이 들어있는 FRPGGameplayEffectContainerSpec 을 생성합니다. 그런 다음 그 ContainerSpec 을 적용하면, 타깃에 실제 대미지를 입힙니다. 타깃 데이터는 FGameplayAbilityTargetDataHandle 이며 히트 결과, 액터, 또는 다른 게임 전용 객체가 들어있는 다형성 타깃 구조체 배열을 가리킵니다. EffectSpecs 는 FGameplayEffectSpecHandle 배열로 적용할 이펙트와 캡처한 어트리뷰트 값 목록을 가리킵니다. 이펙트와 타깃 데이터 캡처가 완료되면, 나중에 전달, 수정, 실행할 수 있습니다. 하지만 밀리의 경우, 캡처 직후 실행됩니다. 어빌리티 시스템을 사용하는 게임은 아마도 ApplyEffectContainer 비슷한 시스템을 구현하는 것이 좋은데, 그래야 블루프린트 로직은 부모 어빌리티에 넣고 실행할 이펙트 목록은 자손 블루프린트에 넣기가 쉬워집니다. 하지만 게임마다 약간씩 다를 것이고, 게임에 클라이언트 예측 타기팅 기능이 포함된 경우 ARPG 에 사용된 버전보다 훨씬 복잡해질 것입니다.