언어:
페이지 정보
엔진 버전:
언리얼 엔진

ARPG 의 밀리 어빌리티

언리얼 엔진

Action RPG (ARPG) 의 어빌리티 유형은 크게 두 가지, Melee (근접, 밀리)와 Skill (스킬)입니다. 두 어빌리티 다 비슷하지만, 차이가 약간 있습니다. 예를 들어 밀리 어빌리티는 캐릭터의 무기가 적에 겹치면 시전되는 반면, 스킬 어빌리티는 스킬별 라인 트레이스 검사를 사용합니다. 다음 이미지는 모든 밀리 어빌리티의 베이스인 GA_MeleeBase 의 블루프린트 그래프입니다.

클릭하면 이미지 원본을 확인합니다.

ActivateAbility 는 어빌리티 시작 시 호출하며, CommitAbility 는 어빌리티의 Cost (비용, ARPG 에서는 보통 마나) 및 Cooldown (재사용 대기시간, 쿨다운)을 적용합니다. EndAbility 는 어빌리티 실행이 끝났음을 시스템에 알리기 위해 호출합니다. 다른 두 노드는 ARPG 전용으로, 보통 게임마다 필요에 따라 새 함수와 노드를 추가합니다.

PlayMontageandWaitForEventAbilityTask 노드로, URPGAbilityTask_PlayMontageAndWaitForEvent 에 해당합니다. AbilityTasks 는 태스크 실행에 사용되는 함수, 변수, 태스크 (이 경우 PlayMontageAndWaitForEvent) 생성을 위한 정적 함수 세트를 정의하는 특수 오브젝트입니다. 태스크에서 가동하는 동적/블루프린트 델리게이트 세트도 있습니다. (상단 옆에서 항상 즉시 가동되는) 각 출력 실행 핀은 이 델리게이트 중 하나에 해당하며, 출력 데이터 핀은 델리게이트의 시그너처에 일치합니다. 이 특정 태스크는 UAbilityTask_PlayMontageAndWaitUAbilityTask_WaitGameplayEvent 의 조합으로, 약간의 게임 전용 트윅과 코멘트를 포함합니다. 게임마다 새 게임플레이 태스크를 다수 구현하게 마련이므로, 이 태스크는 설정 방법에 대한 좋은 예가 됩니다.

이 태스크 작동 방식은 먼저 몽타주를 재생한 뒤 AbilitySystemComponent 에서 게임플레이 이벤트가 방출(emit)될 때까지 대기(listen)합니다. 방출된 게임플레이 이벤트가 전달된 EventTags 에 일치하면 태그 및 페이로드와 함께 EventReceived 실행 핀을 가동한 뒤 ApplyEffectContainer 함수를 호출합니다. 몽타주 블렌딩이 끝나거나, 중단 또는 취소되면, 어빌리티가 끝납니다. 실제 게임플레이 이벤트는 WeaponActor 블루프린트에서 방출되며, 로직은 다음과 같습니다.

ARPG_Melee_Abilities_02.png

무기 액터가 캐릭터에 겹칠 때 발동됩니다. 그러면 GameplayEventData 페이로드를 생성하고 Target Actor + Instigator. 에 전달합니다. 그런 다음 몽타주에 배치한 Anim Notify 스테이트로 게임플레이 이벤트를 전송합니다. 즉 그 이벤트가 발동되면, 어빌리티 그래프는 EventReceived 실행 핀을 가동합니다. ApplyEffectContainer 노드는 URPGGameplayAbility::ApplyEffectContainer 에 해당하며, 게임플레이 이펙트 세트를 적용합니다. 각 URPGGameplayAbility 에는 FRPGGameplayEffectContainer 구조체에 대한 태그로 된 맵이 있으며, 여기에는 타깃 정보와 적용할 게임플레이 이펙트 목록이 들어갑니다. GA_PlayerAxeMelee 의 그 맵 예제입니다.

ARPG_Melee_Abilities_03.png

AM_Attack_Axe 몽타주를 실행하면, Event.Montage.Shared.WeaponHit GameplayEvent 가 방출되었을 때 RPGTargetType_UseEventData 타기팅 클래스를 사용하여 GE_PlayerAxeMelee 이펙트를 실행할 것임을 나타냅니다. 그 타깃 유형은 RPGTargetType.cpp 파일에 네이티브 C++ 로 구현되어 있으며, 전달된 EventData 에서 타깃 액터와 히트 결과를 추출합니다. 그 맵의 두 번째 엘리먼트는 BurstPound 특수 공격을 실행하는데, 이 스킬은 나중에 자세이 설명합니다.

ApplyEffectContainer 는 두 가지 작업을 합니다. 첫째, 이 맵 안에서 전달된 태그에 일치하는 FRPGGameplayEffectContainer 를 찾습니다. 찾으면 TargetDataEffectSpecs 목록이 들어있는 FRPGGameplayEffectContainerSpec 을 생성합니다. 그런 다음 그 ContainerSpec 을 적용하면, 타깃에 실제 대미지를 입힙니다. 타깃 데이터는 FGameplayAbilityTargetDataHandle 이며 히트 결과, 액터, 또는 다른 게임 전용 객체가 들어있는 다형성 타깃 구조체 배열을 가리킵니다. EffectSpecs 는 FGameplayEffectSpecHandle 배열로 적용할 이펙트와 캡처한 어트리뷰트 값 목록을 가리킵니다. 이펙트와 타깃 데이터 캡처가 완료되면, 나중에 전달, 수정, 실행할 수 있습니다. 하지만 밀리의 경우, 캡처 직후 실행됩니다. 어빌리티 시스템을 사용하는 게임은 아마도 ApplyEffectContainer 비슷한 시스템을 구현하는 것이 좋은데, 그래야 블루프린트 로직은 부모 어빌리티에 넣고 실행할 이펙트 목록은 자손 블루프린트에 넣기가 쉬워집니다. 하지만 게임마다 약간씩 다를 것이고, 게임에 클라이언트 예측 타기팅 기능이 포함된 경우 ARPG 에 사용된 버전보다 훨씬 복잡해질 것입니다.