라이라의 어빌리티

라이라에서 게임플레이를 위해 게임플레이 어빌리티 시스템을 사용한 방식을 간략하게 살펴봅니다.

Choose your operating system:

Windows

macOS

Linux

라이라(Lyra)에서는 게임플레이 어빌리티 시스템(Gameplay Ability System)(GAS) 을 사용하여 대부분의 게임플레이를 조직합니다. 어빌리티는 점프처럼 영웅 데이터에 이미 선천적으로 내재되어 있을 수도 있고, 게임 피처 같은 액션으로부터 부여받을 수도 있고, 경험이나 장비를 통해 획득할 수도 있습니다.

게임플레이 어빌리티 시스템은 무엇이며 왜 사용해야 하는가?

게임플레이 어빌리티 시스템은 게임플레이 메커니즘을 빠르게 구현하고 반복작업하기 위한 프레임워크를 제공하는 플러그인입니다. 멀티플레이어가 포함될 수 있는 복잡한 게임플레이 메커니즘을 위한 코드를 작성할 때, 여러 다양한 게임 유형에 적용되는 일반적인 표준 함수 기능을 많이 작성하게 될 수 있습니다.

GAS는 메커니즘을 공통 게임 디자인 패턴으로 추상화하려고 시도하고, 프로젝트별로 컨텍스트를 다르게 유지하면서도 일반적인 게임플레이 구현 문제를 해결하는 프레임워크를 제공합니다.

표준 코드 작성 시 종종 오류가 발생하기 쉽고 시간도 많이 걸리며, 특히 멀티플레이어 게임용 표준 코드를 작성할 때는 더 그렇습니다. 예를 들어, 체력(Health) 값을 제대로 리플리케이트되게 하거나, 체력 값과 똑같이 동작하는 에너지(Energy) 값에 사용하기로 한 경우에 같은 코드 라인을 복사하는 데 많은 시간을 들이고 싶지는 않을 것입니다.

GAS는 기계적 중립을 유지하면서 공통 게임플레이 함수 기능을 최대한 많이 충족하는 기반을 제공함으로써 이러한 문제를 해결합니다. 체력(Health)이나 탄약(Ammo), 근접 공격(Melee Attack), 포이즌 디버프(Poison Debuff) 같은 콘셉트를 강제하는 대신, GAS는 특정 게임플레이 메커니즘의 필요를 충족하도록 특화될 수 있는 어트리뷰트(Attributes) , 어빌리티(Abilities)이펙트(Effects) 를 정의하고 리플리케이트하고, 사용할 수 있는 툴을 제공합니다.

라이라에는 무기 사용, 점프나 질주 같은 이동 관련 액션, 그리고 사망 후 리스폰 트리거 같은 수동적인 리스닝 액션 등의 일반적인 액션에 대한 어빌리티가 구현되어 있습니다. 또한, 매치 정보 UI 불러오기나 게임플레이 페이즈 관리 같이 덜 일반적인 목적에도 어빌리티를 사용합니다. 이러한 내용은 아래의 섹션에서 자세하게 설명합니다.

GAS는 다음과 같은 코어 클래스를 중심으로 구성되어 있습니다. 라이라에서는 이러한 클래스 중 다수를 확장하여 추가 함수 기능을 제공합니다.

코어 클래스

설명

UAbilitySystemComponent

어빌리티 시스템 컴포넌트(Ability System Component, ASC) 는 모든 액터에 추가하여 GAS 함수 기능을 제공할 수 있습니다. 특정 액터의 스테이트를 추적하고 리플리케이션을 처리합니다.

UAttributeSet

어트리뷰트 컬렉션으로, 게임 메커니즘 내에서 특정 의미를 지닌 숫자 값입니다. 어트리뷰트는 ‘체력'과 같은 게임 리소스나, ‘기본 공격력(Base Attack Power)' 같이 다른 게임 규칙에 영향을 줄 수 있는 레퍼런스 값을 나타낼 수 있으며, 심지어 ‘적용된 대미지(Applied Damage)' 같이 비상태성 양도 나타낼 수 있습니다. 어트리뷰트 세트는 하나 이상의 어트리뷰트 프로퍼티를 정의하고 관리하고 리플리케이트합니다.

FGameplayTag

게임 오브젝트에 적용할 수 있는 임의의 계층형 식별자입니다. 게임 엔티티를 식별하고 분류하고 필터링하는 데 사용할 수 있습니다. 게임플레이 이펙트 및 어빌리티에 의해 부여되거나 철회될 수 있으며, 그 행동에 영향을 줄 수 있습니다. 오너의 아바타나 폰에 대한 대미지를 방지하는 'Gameplay.DamageImmunity' 태그를 예로 들 수 있습니다.

UGameplayAbility

요구 사항과 비용, 기타 행동을 결정하기 위한 정보와 함께 GAS가 활성화된 액터에 부여되고 해당 액터가 수행할 수 있는 게임 액션입니다. 기본 근접 공격부터 독립형 게임 메뉴 흐름, 다른 게임 액션으로 인해 트리거되는 행동 등 다양한 예가 있습니다.

UGameplayEffect

게임 액션의 결과입니다. 어트리뷰트를 일시적으로 또는 영구적으로 수정하고, 태그를 부여하거나 철회하고, 다른 어빌리티에 대한 액세스를 활성화하는 등, 다양한 이펙트를 적용할 수 있습니다. 게임플레이 이펙트는 GAS가 활성화된 액터끼리 상호작용하는 가장 일반적인 방법입니다.

GAS의 주요 이점은 다음과 같습니다.

  • 네트워크 리플리케이션: 어트리뷰트나 디버프의 올바른 적용 및 리플리케이트에 대해 걱정할 필요가 없습니다. GAS가 알아서 내부 로직을 처리합니다.

  • 모듈성: 종종 새 어빌리티를 구현하고 부여하는 것만큼이나 쉽게 게임 메커니즘을 추가하거나 변경할 수 있습니다. 게임플레이 함수 기능을 별도 에셋으로 나눔으로써, 어빌리티 시스템은 근본적으로 다른 게임 오브젝트나 메커니즘 간에 공통된 커뮤니케이션 레이어를 제공할 수 있습니다. 예를 들어, 체력은 자체 어트리뷰트 세트(Attribute Set)로 구분되어, 다양한 시스템의 게임플레이 이펙트를 통해 상호작용할 수 있습니다.

  • 빠른 반복작업: GAS를 사용하면 전체 시스템을 수정하지 않고도 개별 게임 규칙을 쉽게 변경할 수 있습니다. 게임 계산용 데이터 소스를 쉽게 교환할 수 있으며, 해당 게임플레이 이펙트를 수정함으로써 액션의 결과를 변경할 수 있습니다.

ULyraAbilitySystemComponent

라이라 어빌리티 시스템 컴포넌트(Lyra Ability System Component) (ULyraAbilitySystemComponent)어빌리티 시스템 컴포넌트 (UAbilitySystemComponent) 함수 기능을 확장하여 라이라 프레임워크와 연결됩니다. 모든 LyraPlayerState 인스턴스에 추가되며 c:Lyra\Source\LyraGame\AbilitySystem\LyraAbilitySystemComponent.h 파일 디렉터리에 있습니다.

ALyraPlayerState

라이라 플레이어 스테이트(Lyra Player States) (ALyraPlayerState) 는 모든 플레이어별 어빌리티와 행동에 사용되는 어빌리티 시스템 컴포넌트를 소유합니다. 인간 플레이어와 AI 봇이 각각 소유합니다. c:\Lyra\Source\LyraGame\Player\LyraPlayerState.h 파일 디렉터리에서 이 클래스에 액세스할 수 있습니다. 플레이어 스테이트 클래스에 어빌리티 시스템 컴포넌트를 추가해서 얻는 주요 이점은 기본 폰(Pawn) 데이터에서 GAS 스테이트 로직을 분리하는 데 도움이 된다는 것입니다.

이 로직을 분리하는 것은 게임에서 플레이어의 폰이 자주 리스폰되어야 하는 경우나, 플레이어가 여러 폰 간에 컨트롤을 전환하는 경우, 또는 현재 폰이 빙의되어 있지 않을 수 있는 게임플레이 인스턴스에서 유용합니다.

이렇게 하면 폰의 일부 어빌리티와 어트리뷰트, 이펙트가 빙의 폰 간에 지속됩니다. 이 로직을 통해 게임 페이즈가 변경되어도 GAS 스테이트를 더 쉽게 유지할 수 있습니다. 하지만, 폰을 빙의(Possess) 하거나 빙의 해제(Unpossess) 할 때마다 폰별로 GAS 스테이트를 초기화 또는 초기화 해제 시 특별히 주의해야 합니다.

라이라에서는 ULyraHeroComponentULyraPawnExtensionComponent 를 통해 이러한 상황을 수용합니다. 이 두 컴포넌트는 유효한 컨트롤러에 의해 폰이 빙의되는 경우 특정 어빌리티와 어트리뷰트, 게임플레이 이펙트 세트를 플레이어 스테이트의 AbilitySystemComponent에 부여하는 일을 담당합니다. 폰이 제거되거나 빙의 해제되거나 플레이에서 제거되면, 이렇게 부여된 항목이 자동으로 철회됩니다.

c:\ReleaseWorkspace\Samples\Games\Lyra\Source\LyraGame\Hero\LyraHeroComponent.h 디렉터리에서 ULyraHeroComponent를, c:\Lyra\Source\LyraGame\Pawn\LyraPawnExtensionComponent.h 디렉터리에서 ULyraPawnExtensionComponent를 살펴볼 수 있습니다.

ALyraGameState

하이 레벨 게임 페이즈 로직은 C:\Lyra\Source\LyraGame\LyraGameState.h 파일 에 있는 라이라 게임 스테이트(Lyra Game State) (ALyraGameState) 클래스에 의해 서버 측에서 관리됩니다. 게임 스테이트는 클라이언트 측과 서버 측 모두에 존재하며, 어빌리티로 구현되는 게임 페이즈(Game Phases)가 있는 어빌리티 시스템 컴포넌트를 사용합니다. 이러한 게임 페이즈를 활성화하거나 비활성화하여 게임플레이 이벤트가 처리되는 방식에 영향을 줍니다. 예를 들어, ShooterCore는 다음 세 개의 페이즈를 구현합니다.

페이즈

설명

웜업(Warmup)

이 페이즈 동안에는 모든 플레이어에게 대미지 면역 게임플레이 이펙트가 적용된 다음, 리플리케이트된 카운트다운이 시작되고, 면역이 제거된 후, 플레이(Playing) 스테이트로 전환됩니다.

플레이(Playing)

이 페이즈에서는 게임이 시작되고 플레이 상태가 됩니다. 점수와 제한 시간이 추적되며, 상황이 되면 포스트 게임(PostGame)으로 전환됩니다.

포스트 게임(PostGame)

이 페이즈에서는 모든 플레이어에게 대미지 면역이 다시 적용되고 모든 플레이어에 대한 컨트롤을 비활성화한 후, 다음 매치 라운드로 전환됩니다.

게임 스테이트(Game States) 는 클라이언트 측과 서버 측 모두에 존재하지만, 게임 모드(Game Mode) 는 서버 측에만 존재합니다.

게임 페이즈 어빌리티

게임 페이즈 어빌리티는 ULyraGamePhaseAbility 클래스에서 확장되며, 각 어빌리티는 개별 스테이트를 캡슐화합니다. 게임 스테이트 로직에서는 어빌리티 활성화가 페이즈 시작이고 어빌리티 종료가 페이즈 종료라고 가정합니다. 이런 방식을 통해 특정 페이즈의 시작과 끝을 Gameplay Tag GamePhaseTag 를 사용하여 리스닝할 수 있습니다.

| */ 이 게임 페이즈 어빌리티가 속한 게임 페이즈를 정의합니다.  예를 들어, 게임 페이즈가 GamePhase.RoundStart라면, 모든 시빌링 페이즈를 취소합니다.

따라서, GamePhase.WaitingToStart와 같은 페이즈가 활성화되어 있다면, RoundStart의 어빌리티 부분이 시작되면서 WaitingToStart가 종료됩니다. 그렇지만, 중첩된 행동을 얻기 위해 페이즈를 중첩할 수도 있습니다. 예를 들어, GamePhase.Playing.NormalPlay는 부모 GamePhase.Playing의 서브 페이즈이므로 서브 페이즈를 GamePhase.Playing.SuddenDeath로 변경하면 GamePhase.Playing.* 에 연결된 모든 어빌리티가 중지되지만, GamePhase.Playing 페이즈에 연결된 어떠한 어빌리티도 종료되지 않습니다.

    UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Lyra|Game Phase")
    FGameplayTag GamePhaseTag;
 |

이전 페이즈 어빌리티(실행 중인 경우)를 종료하고 새 페이즈 어빌리티를 활성화하는 라이라 게임 페이즈 서브시스템(Lyra Game Phase Subsystem) (ULyraGamePhaseSubsytem) 을 사용하여 블루프린트에서 페이즈를 전환할 수 있습니다.

입력 태그 활성화 지원

게임플레이 어빌리티 세트(Gameplay Ability Set) (UGameplayAbilitySet) 를 통해 부여되는 어빌리티는 [라이라의 입력 시스템]()에서 일치하는 입력 태그(Input Tag) 를 수신한 경우, 자동으로 활성화를 확인합니다. 이러한 방식으로 불투명한 입력 ID(Input ID) 숫자에 의존하거나 입력 액션(Input Action) 이벤트를 수동으로 처리하지 않고도 간단히 어빌리티를 활성화할 수 있습니다. 이러한 예에는 아래에서 설명하는 점프(GA_Hero_Jump)와 무기 발사(GA_Weapon_Fire) 등이 있습니다.

확장된 태그 관계 시스템

GAS 어빌리티와 이펙트는 어떤 게임플레이 태그가 오너에게 부여(보통 다른 어빌리티나 게임플레이 이펙트에 의해 부여)되었는지에 따라 특정 어빌리티를 차단하거나 취소하는 함수 기능을 제공합니다.

이 정보는 각 특정 어빌리티와 이펙트에 담겨 있어 이러한 관계를 전반적으로 변경해야 할 때 불편할 수 있습니다. 예를 들어, 게임이 발전하고 규칙이 더 복잡해지면서 게임 규칙을 업데이트 할 때 오류와 불일치가 발생할 수 있습니다.

라이라는 라이라 어빌리티 태그 관계 매핑(Lyra Ability Tag Relationship Mapping) (ULyraAbilityTagRelationshipMapping) 데이터 에셋을 도입하여 이 워크플로를 개선했습니다. 이러한 에셋은 차단 및 취소, 필수 태그 관계 목록을 포함합니다. 이 에셋은 콘텐츠 브라우저(Content Browser) > 추가(Add) > 기타(Miscellaneous) > 데이터 에셋(Data Asset) 에서 생성할 수 있습니다.

어빌리티 태그 관계 매핑(Ability Tag Relationship Mapping) 에셋을 ULyraPawnData 에셋의 일부로 지정할 수 있으며, 이 에셋은 폰이 빙의될 때 해당하는 라이라 어빌리티 시스템 컴포넌트에 할당됩니다. 어빌리티 시스템 컴포넌트가 유효한 태그 관계 매핑에 대한 레퍼런스를 보유하고 있으면, 이러한 에셋을 어빌리티 활성화에 대한 활성화 및 취소 조건의 추가 레이어로 적용합니다.

ULyraGlobalAbilitySystem

라이라 글로벌 어빌리티 시스템(Lyra Global Ability System) (ULyraGlobalAbilitySystem) 을 통해서는 빠르게 레벨의 모든 라이라 어빌리티 시스템 컴포넌트를 추적하고 그러한 컴포넌트와 상호작용할 수 있습니다.

라이라 어빌리티 시스템 컴포넌트는 초기화 중에 자동으로 서브시스템에 등록합니다. 현재, 이 서브시스템은 모든 등록된 어빌리티 시스템 컴포넌트에서 어빌리티와 게임플레이 이펙트를 제거하거나 부여하는 블루프린트 호출 가능 함수를 제공합니다.

예를 들어, 라이라의 엘리미네이션 모드는 매치의 웜업 페이즈 동안 전역적으로 게임플레이 이펙트(GE_PregameLobby)를 적용합니다. 모든 플레이어에게 대미지 면역 태그를 부여하고, 매치가 시작되지 않았음을 나타내는 UI 엘리먼트를 활성화하는 게임플레이 큐를 트리거합니다.

ULyraAbilitySet

라이라 어빌리티 세트(Lyra Ability Set) (ULyraAbilitySet) 는 콘텐츠 브라우저(Content Browser)에서 생성할 수 있는 데이터 에셋 유형입니다. 여기에는 어빌리티 세트가 적용될 때 라이라 캐릭터에게 부여할 게임플레이 어빌리티와 게임플레이 이펙트, 어트리뷰트 세트 목록이 담겨 있습니다.

게임 피처나 장비 등, 라이라 어빌리티 세트를 부여하는 파티는 해당 어빌리티 세트가 부여될 액터를 트래킹하는 일을 담당합니다. 헬퍼 구조체 FLyraAbilitySet_GrantedHandles는 기록과 제거에 사용됩니다.

메서드

설명

부여된 게임플레이 어빌리티(Granted Gameplay Abilities)

어빌리티를 부여할 기본 레벨 및 그 어빌리티에 연결할 선택적 입력 태그와 더불어 부여할 라이라 게임플레이 어빌리티 목록입니다.

부여된 게임플레이 이펙트(Granted Gameplay Effects)

이펙트를 부여할 기본 레벨과 더불어 부여할 게임플레이 이펙트 목록입니다.

부여된 어트리뷰트(Granted Attributes)

부여할 어트리뷰트 세트 목록입니다.

어빌리티 세트는 다음과 같은 다양한 방식으로 부여할 수 있습니다.

어빌리티 세트 부여 메서드

설명

ULyraExperienceDefinition ULyraPawnData

어빌리티 세트 목록은 ULyraPawnData 에셋에 정의됩니다. 이러한 에셋은 ULyraExperience 정의(ULyraExperience Definition) 에서 참조할 수 있으며, 해당 어빌리티 세트는 초기화 시 플레이어의 폰에 자동으로 부여됩니다. 이는 Experience가 로드될 때 ULyraPlayerState에 의해 조정됩니다.

이러한 어빌리티는 빙의하는 폰이 아니라 플레이어 스테이트에 부여됩니다. 폰이 빙의되기 전에 이러한 어빌리티가 부여될 수 있으며, 빙의된 폰이 변경된 경우에도 지속될 수 있습니다. 활성화 정책(Activation Policy)이 스폰 시(On Spawn)로 설정되어 있어도, 폰 자체가 빙의될 때까지는 활성화되지 않습니다. 그에 맞춰 계획해야 합니다.

게임 피처 액션(Game Feature Actions)

UGameFeatureAction_AddAbilities 는 활성화 시 액터에 어빌리티 세트를 부여할 수 있습니다. 이러한 액션은 게임 피처 플러그인이나 Experience Definition 자체에 추가될 수 있습니다.

장비(Equipment)

ULyraEquipmentDefinitions 또한, 이 정의가 추가되는 액터에 어빌리티 세트를 부여할 수 있습니다. 이는 Experience가 로드될 때 ULyraPlayerState 에 의해 조정됩니다.

이러한 어빌리티는 빙의하는 폰이 아니라 플레이어 스테이트에 부여됩니다. 폰이 빙의되기 전에 이러한 어빌리티가 부여될 수 있으며, 빙의된 폰이 변경된 경우에도 지속될 수 있습니다. 활성화 정책(Activation Policy)이 스폰 시(On Spawn)로 설정되어 있어도, 폰 자체가 빙의될 때까지는 활성화되지 않습니다. 그에 맞춰 계획해야 합니다.

ULyraGameplayAbility

라이라 게임플레이 어빌리티(Lyra Gameplay Ability) (ULyraGameplayAbility) 는 UGameplayAbility 클래스에서 확장되어 라이라 프레임워크에 대한 추가 유틸리티와 인터페이스를 제공합니다.

활성화 그룹

활성화 그룹(Activation Group)은 어빌리티가 자유롭게 활성화될 수 있는지, 아니면 해당 어빌리티가 다른 전용 어빌리티를 차단하거나 중단할지를 결정합니다. 다음과 같은 태그 관계 에셋을 사용하여 복잡한 추가 차단 행동을 적용할 수 있습니다.

활성화 그룹

설명

독립(Independent)

어빌리티가 다른 어빌리티를 차단하거나 대체하지 않습니다. 대부분의 어빌리티는 기본으로 이 태그로 설정되어야 합니다.

전용 대체 가능(Exclusive Replaceable)

어빌리티가 다른 전용 어빌리티를 차단하지 않지만, 또 다른 전용 어빌리티가 활성화되면 취소됩니다.

전용 차단(Exclusive Blocking)

어빌리티가 실행되는 동안, 다른 전용 어빌리티가 활성화될 수 없습니다.

사격과 무기 교체, 근접 공격 같은 대부분의 게임 액션은 독립 및 차단으로 설정됩니다. 동시성과 취소는 태그 관계에 의해 조정됩니다. 순위표 및 기타 게임 내 메뉴는 한 번에 하나의 메뉴만 표시되도록 전용 차단으로 설정됩니다.

활성화 정책

라이라 프레임워크가 어빌리티 활성화를 자동으로 처리하도록 허용합니다.

활성화 정책

설명

없음(None)

게임 코드나 블루프린트에 의해 수동으로 활성화합니다.

스폰 시(On Spawn)

플레이어 스테이트에 유효한 아바타가 할당되는 즉시 어빌리티가 활성화됩니다. 무기 재장전 게임플레이 어빌리티(GA_Weapon_AutoReload )는 스폰 시로 설정됩니다. 즉시 활성화되고 수동적으로 실행되어 현재 탄창이 비었는지 주기적으로 확인합니다. 폰이 빙의 해제될 때까지 어빌리티가 종료되지 않습니다.

입력 트리거 시(On Input Triggered)

관련 입력 태그가 트리거되는 즉시 어빌리티가 한 번 활성화됩니다. 확대 조준(Aim Down Sights) (ADS), 수류탄 및 기타 비슷한 어빌리티는 입력 트리거 시로 설정됩니다. 버튼이 눌리면 어빌리티가 한 번 활성화되며 자동으로 재활성화되지 않습니다.

입력 활성화 중(While Input Active)

관련 입력 태그가 트리거되는 한 계속해서 어빌리티가 활성화됩니다. GA_Weapon_Fire_Shotgun 같은 무기 발사 어빌리티는 입력 활성화 중으로 설정됩니다. 이 경우 발사 애니메이션 몽타주를 재생한 다음, 재발사 시간이 경과할 때까지 기다렸다가 어빌리티를 종료합니다. 이렇게 작동하는 까닭은 인스턴스드 어빌리티 리트리거(Retrigger Instanced Ability)가 false로 설정되어 있고, 어빌리티가 종료될 때까지 중복 활성화 메시지가 무시되기 때문입니다.

인스턴스드 어빌리티 리트리거가 설정된 경우에는 이 활성화를 주의해서 사용해야 합니다. 그렇지 않으면, 마구잡이로 활성화를 일으켜 원치 않는 결과가 발생할 수 있습니다.

K2_CanActivateAbility

몇몇 라이라 어빌리티는 K2_CanActivateAbility 함수를 사용하여 C++ 대신 블루프린트에서 활성화 확인을 구현합니다. 이 함수는 true나 false를 반환하여 활성화를 허용하고, 활성화를 방해했을 수 있는 요소를 확인할 수 있는 컨텍스트 게임플레이 태그를 제공합니다. 이는 라이라뿐 아니라 모든 게임플레이 어빌리티에 노출됩니다.

추가 비용

일반 게임플레이 어빌리티는 단일 비용 및 쿨다운 게임플레이 이펙트만 허용합니다. 추가 비용(Additional Costs) 목록은 게임플레이 이펙트로 설정하지 않고 지정할 수 있는 추가 비용을 제공하며, 이를 통해 더 복잡한 활성화 조건이 지원됩니다.

추가 비용은 표준 비용 흐름에 통합되어 있으며, 해당하는 Check CostCommit Cost 노드 또는 Commit Ability (쿨다운도 커밋하려는 경우)를 통해 수동으로 확인하고 커밋할 수 있습니다.

실제 비용은 ULyraAbilityCost 오브젝트로서 구현됩니다. C++에서 이 클래스를 확장하고 CheckCostApplyCost 가상 함수를 오버라이드하여 커스텀 비용을 생성할 수 있습니다.

라이라에서는 플레이어 스테이트에 지정된 게임플레이 태그의 많은 스택을 소모하는 ULyraAbilityCost_PlayerTagStack 을 사용하여 몇 가지 추가 비용을 구현합니다. 이 경우, ULyraGameplayAbility_FromEquipment 에서 파생하는 어빌리티에서 호출된다고 가정합니다.

라이라 어빌리티 비용

설명

ULyraAbilityCost_InventoryItem

캐릭터 인벤토리에서 주어진 양의 관련 아이템을 소모합니다. 소모품 인벤토리 아이템에 사용됩니다.

ULyraAbilityCost_ItemTagStack

캐릭터 인벤토리에서 지정된 아이템의 여러 스택을 소모합니다. 비용을 지불할 수 없는 경우, 다른 어빌리티에 게임플레이 태그를 보고하여 비용을 처리합니다. 라이라에서 탄약 소모 및 재장전 트래킹에 사용됩니다. GA_Weapon_Fire_Shotgun 및 이와 비슷한 어빌리티는 Lyra.ShooterGame.Weapon.MagazineAmmo 로 설정된 아이템 태그 스택(Item Tag Stack) 추가 비용을 사용합니다. 무기가 발사될 때마다, 소모된 양만큼 MagazineAmmo 스택이 감소합니다. 이를 통해 플레이어의 현재 무기 탄창에 탄약이 떨어지면 활성화가 되지 않습니다.

추가/제거 시 이벤트

라이라 어빌리티는 활성화에 의존하지 않고서도 캐릭터에 추가되거나 제거되는 어빌리티를 처리할 수 있는 추가 블루프린트 이벤트를 제공합니다. 이러한 이벤트는 초기 설정과 클린업에 유용합니다.

블루프린트 이벤트

설명

On Ability Added

어빌리티가 부여되는 즉시 이벤트가 호출됩니다. 아바타나 입력 컴포넌트가 아직 유효하지 않을 수 있으므로, 조심해서 액세스해야 합니다.

On Pawn Avatar Set

폰이 완전히 초기화되고, 아바타와 입력 컴포넌트가 모두 유효한 경우 호출됩니다.

On Ability Removed

이 이벤트는 보통 폰이 빙의 해제되거나 파괴되는 등의 이유로 ASC에서 어빌리티가 제거되려고 할 때 호출됩니다.

카메라 모드

라이라 어빌리티는 Set Camera Mode 및 Clear Camera Mode 블루프린트 노드를 통해 카메라 모드(Camera Mode)를 오버라이드할 수 있습니다. 그 한 가지 예는 폰이 죽어가는 동안 GA_Hero_Death 어빌리티에 의해 트리거되는 사망 카메라 모드를 사용하는 것입니다.

유형 태그

라이라의 어빌리티에는 일반적으로 어빌리티를 계층적으로 분류하기 위해 ‘어빌리티 태그(Ability Tags)' 프로퍼티에 게임플레이 태그 유형이 포함되어 있습니다. 이 유형 태그는 다른 어빌리티의 차단과 취소, 필수 태그 세팅 관리에 널리 사용되며, 태그 관계 시스템을 통해서도 널리 사용됩니다.

예를 들어, 캐릭터 중심 액션 어빌리티에는 ‘Ability.Type.Action.Dash' 및 ‘Ability.Type.Action.Jump'와 같은 유형 태그가 포함됩니다. 하지만, 'Ability.Type.Passive.AutoRespawn'과 같은 태그가 있는 캐릭터보다 오래 지속되는 패시브 어빌리티도 있습니다. 캐릭터가 사망하면 일부 다른 어빌리티에는 영향을 주지 않고 모든 다른 캐릭터 액션 어빌리티가 취소됩니다.

네이티브 어빌리티 서브클래스

일부 라이라 어빌리티에는 C++ 구현이 있어 특정 활성화 조건을 적용하거나 블루프린트에서 구현하기는 번거로운 복잡한 수학 로직을 수행하거나 민감한 로우 레벨 게임플레이 시스템과 상호작용합니다. 아래 테이블에서 이러한 어빌리티의 몇 가지 예를 확인할 수 있습니다.

게임플레이 어빌리티

설명

ULyraGameplayAbility_Death

사망 게임플레이 이벤트(Death Gameplay Event)를 트리거하기 위해 자동으로 구성됩니다. 모든 다른 어빌리티를 취소하고 폰의 체력 컴포넌트(Health Component)에 신호를 보내 나머지 게임 알림 및 스테이트 변경을 차례로 트리거하는 사망 프로세스를 시작합니다. 비주얼 이펙트는 이 클래스(GA_Hero_Death)의 BP 어빌리티 익스텐션에 의해 수행됩니다.

ULyraGameplayAbility_Jump

어빌리티 오너가 유효하고 로컬에서 제어되는 폰인지 확인하면서 폰의 캐릭터 무브먼트 컴포넌트(Character Movement Component)에 Jump 및 StopJumping 입력을 트리거하는 함수 기능을 제공합니다.

ULyraGameplayAbility_Reset

활성화되면, 이 어빌리티는 즉시 소유 플레이어를 초기 스폰 스테이트의 새 폰으로 리셋하고 모든 다른 어빌리티를 취소합니다.

ULyraGameplayAbility_FromEquipment

라이라의 장비 시스템과 상호작용하고 어빌리티와 관련된 아이템을 검색하는 함수 기능을 제공합니다.

ULyraGameplayAbility_RangedWeapon

무기 발사의 네이티브 구현입니다. 관련 무기와 상호작용하여 탄약 수와 적중률 등을 결정합니다. 발사 원뿔 내에서 탄도를 계산하고 적중 타깃을 찾고 유효성을 검사하는 레이 캐스팅 함수 기능을 제공합니다.

블루프린트 어빌리티 서브클래스

다음은 블루프린트 서브클래스에서 라이라의 확장된 어빌리티 함수 기능을 사용하는 방법에 대한 몇 가지 예입니다.

블루프린트 서브클래스

게임플레이 어빌리티 설명

GA_AbilityWithWidget

추가 UI 기능을 제공하는 모든 어빌리티의 베이스 클래스입니다. 베이스 클래스는 어빌리티의 위젯 스테이트를 관리하므로, 상태와 쿨다운, 기타 어빌리티 정보를 표시할 수 있습니다. 그 한 가지 예시는 모바일 플랫폼의 커스텀 터치 입력 위젯을 사용하는 라이라의 근접 어빌리티입니다. OnAbilityAdded 이벤트는 위젯 익스텐션을 UI 익스텐션 서브시스템에 등록하여 익스텐션 핸들을 저장합니다. OnAbilityRemoved 이벤트는 익스텐션 핸들을 등록 해제하고 지웁니다.

GA_Melee

활성 상태 동안 Event.Movement.Melee 태그를 부여하는 Ability.Type.Action.Melee 의 에셋 태그가 포함되어 있습니다. 이 어빌리티는 InputTag.Ability.Melee 태그에 의해 활성화되며, 이 태그가 활성화되면, 활성화 시 이벤트를 통해 다음과 같은 순서로 어빌리티 비용이 커밋됩니다.

  1. 현재 장착된 무기를 찾고 관련 애니메이션 몽타주를 재생합니다.

  2. 권한을 확인(서버 전용)한 다음, 플레이어 앞에서 캡슐 트레이스를 수행합니다.

  3. 그 트레이스가 폰에 적중하면, 아군 사격을 피하기 위한 팀 비교와 레벨 지오메트리에 의해 타깃이 가려지지 않는지 확인하는 2차 확인 등의 추가 확인이 실행됩니다.

  4. 유효 적중이 등록되면, 캐릭터가 루트 모션(RootMotion) 포스를 통해 타깃을 향해 이동합니다.

  5. 다음으로 근접 대미지 게임플레이 이펙트가 타깃에 적용되고, 근접 적중 게임플레이 큐가 그 오너에게 트리거됩니다.

  6. 마지막으로, 멀티캐스트 RPC를 통해 근접 임팩트 사운드가 모든 클라이언트에서 재생됩니다.

GA_Weapon_Fire

발사 및 재장전(Fire and Reload) 어빌리티는 관련 무기를 집었을 때 라이라 장비 정의(Lyra Equipment Definition) (ULyraEquipmentDefinition) 클래스에 의해 부여됩니다. 활성화 요구 사항은 ULyraGameplayAbility_RangedWeapon 클래스에 의해 처리되며, 타기팅 로직은 같은 클래스에 의해 C++에서 수행됩니다. 무기 발사 게임플레이(Weapon Fire Gameplay) 어빌리티는 InputTag.Weapon.FireAuto 태그(입력 바인딩) 및 Input.Weapon.Fire 태그(게임플레이 이벤트)에 의해 활성화됩니다. 탄창이 비면, 이 어빌리티는 재장전 어빌리티에서 설정된 Ability.Weapon.NoFiring 태그에 의해 제한됩니다. Ability.Type.Action.WeaponFire 에셋 태그가 Event.Movement.WeaponFire 태그를 부여합니다. 이 태그가 활성화된 동안, On Ability Added 이벤트는 Ability.PlayMontageOnActivateFail.Message 태그에 대한 리스너를 설정합니다. 이 이벤트는 플레이어가 탄약이 없는 상태에서 무기를 발사하려 할 때 트리거됩니다. 메시지를 수신하면, 발사 실패 몽타주(dry fire)를 재생합니다. 이 몽타주는 플레이어가 살아 있을 경우에만 재생되며, 애니메이션은 마구잡이로 애니메이션이 재생되지 않도록 설정된 시간이 경과한 경우에만 다시 트리거됩니다. On Activation 이벤트가 호출되고 캐릭터를 로컬에서 제어하는 경우, 네이티브 타기팅 트레이스를 수행하고 다음과 같은 순서로 타기팅 데이터를 빌드합니다.

  1. 어빌리티 비용(탄약 소모)은 기본적으로 커밋됩니다.

  2. 타기팅 데이터는 네트워크에서 예측되어 서버로 전송되며, 서버에서 ULyraWeaponStateComponent 에 의해 검증되고 확인됩니다.

  3. 타기팅 데이터가 서버에 의해 확인되면, BP 이벤트 OnRangedWeaponTargetDataReady 가 호출되고, 찾아낸 모든 타깃을 전달합니다. 이를 통해 어빌리티가 대미지를 적용하고 적중 이펙트를 재생할 수 있습니다.

  4. 발사 애니메이션 몽타주를 재생합니다.

  5. 타이머를 발사 간의 유효한 지연인 발사 딜레이(Fire Delay)로 설정합니다.

  6. 발사 딜레이나 타이머가 종료되면, 어빌리티가 종료됩니다. 추가 발사 시도는 활성화 로직에 의해 처리됩니다.

무기에 적중된 모든 타깃의 유효성이 검증되면 C++에서 On Ranged Weapon Target Data Ready 이벤트가 호출됩니다. 이 이벤트는 무기 오너의 발사 게임플레이 큐를 트리거하고, 그런 다음 첫 번째 적중을 파라미터로 전달합니다. 이 큐는 타깃에 적중할 때마다 반복되어 각 타깃 위치에 임팩트 게임플레이 큐를 재생합니다. 이 어빌리티에 권한이 있다면(서버에서 실행), 각 타깃 적중 시 대미지 게임플레이 이펙트를 적용합니다.

GA_Weapon_ReloadMagazine

이 게임플레이 어빌리티는 Ability.Type.Action.Reload 태그의 에셋인 InputTag.Weapon.Reload 에 의해 활성화됩니다. 이는 Event.Movement.Reload 태그를 부여합니다. 활성화된 동안, 이동 옵션을 제한합니다. 재장전 로직은 관련 무기의 세 가지 게임플레이 태그 스택을 중심으로 돌아갑니다. Lyra.ShooterGame.Weapon.MagazineSize 는 현재 무기의 탄창 하나에 허용된 최대 탄약 수입니다. Lyra.ShooterGame.Weapon.MagazineAmmo 는 현재 탄창에 남은 탄약 수입니다. 탄약 수가 0이 되면, 계속 발사하기 위해 무기를 재장전해야 합니다. Lyra.ShooterGame.Weapon.SpareAmmo 는 현재 탄창에 없는 남은 탄약 수입니다. 이는 다음과 같은 활성화 확인 로직의 블루프린트 구현인 K2_CanActivateAbility 함수를 오버라이드합니다.

  • MagazineAmmoMagazineSize 보다 작은지 확인합니다. 값이 false이면, 탄창이 가득하므로 재장전이 계속되지 않습니다.

  • SpareAmmo 가 0보다 큰지 확인합니다. 값이 false이면, 플레이어에게 이 무기의 탄약이 없는 것입니다.

어빌리티 활성화 시:
  • 관련 아이템의 MagazineAmmo 스택 수를 확인합니다. 현재 탄창에 남은 탄약이 없다면, 태그를 적용하여 무기 발사 어빌리티 활성화를 억제합니다.

  • 무기 재장전 애니메이션 몽타주를 재생한 다음, GameplayEvent.ReloadDone 이벤트를 리스닝합니다. 이 이벤트는 마네킹 몽타주의 애니메이션 노티파이(Animation Notify)를 통해 전송됩니다.

  • 이벤트가 수신되면, 권한(서버)을 확인한 다음, 단순하게 캐릭터 인벤토리에서 관련 무기의 Lyra.ShooterGame.Weapon.MagazineAmmoLyra.ShooterGame.Weapon.SpareAmmo 값을 변경하는 재장전 로직을 수행합니다. 그런 다음, 어빌리티를 종료합니다.

  • 어떤 이유로든 이벤트가 처리되지 않았다면, 몽타주가 중지되거나 중단될 때 어빌리티가 로컬에서 종료됩니다. On End Ability 이벤트가 호출되어 활성화 시 설정된(앞서 설정된 경우) 사격 억제 태그를 제거합니다.

GA_Grenade

이 어빌리티는 Ability.Type.Action.GrenadeInputTag.Weapon.Grenade 에셋 태그에 의해 활성화됩니다. GE_Grenade_Cooldown 을 쿨다운 이펙트로 사용합니다. On Pawn Avatar Set 이벤트는 로컬 클라이언트의 UI 익스텐션 서브시스템에 위젯을 등록하여 어빌리티 인스턴스당 하나의 위젯만 추가되도록 합니다. On Activation 이벤트는 어빌리티 비용과 쿨다운을 확인하고 이를 커밋합니다. 어느 쪽이든 확인에 실패하면 어빌리티를 종료합니다. 그런 다음, 다음 프로세스를 실행합니다.

  1. 어빌리티 비용과 쿨다운을 커밋합니다.

  2. 수류탄 스폰 위치와 회전을 계산합니다.

  3. 권한을 확인합니다. 권한이 서버에 있으면, 계산된 값으로 수류탄 액터를 스폰하고 소유 라이라 캐릭터를 인스티게이터로 설정합니다.

  4. 스폰된 B_Grenade 액터는 폭발을 확인하고 관련 게임플레이 이펙트를 적용합니다.

  5. B_Grenade는 적 폰과 충돌 시 자동으로 폭발합니다. 유발 캐릭터(수류탄을 던진 캐릭터)에 아군 사격을 적용하지만, 해당 팀원에게는 적용하지 않습니다.

  6. 수류탄 투척 몽타주를 재생한 다음, 관련 위젯이 쿨다운 표시를 동기화할 수 있도록 게임플레이 메시지 서브시스템을 통해 남은 쿨다운 시간을 브로드캐스팅합니다.

  7. 몽타주 완료를 기다리지 않고 즉시 어빌리티를 종료합니다.

On Ability Removed 이벤트는 UI 익스텐션을 등록 해제하고 지웁니다.

GA_ADS (Aim Down Sights)

GA_AbilityWithWidget 에서 상속되어 HUD 디스플레이 버튼을 처리합니다. 이 어빌리티는 Event.Movement.ADS 태그를 부여하는 Ability.Type.Action.ADS 의 에셋 태그인 InputTag.Weapon.ADS 태그에 의해 활성화됩니다. 활성화된 동안 로컬에서 예측됩니다. 즉, 클라이언트에서 즉시 실행된 다음, 서버에서 동기화하여 따라갑니다. 활성화 시:

  1. 커스텀 카메라 모드를 적용하여 필드 오브 뷰(FOV)를 좁힙니다.

  2. 캐릭터의 걷기 속도를 캐시하고 오버라이드합니다. 어빌리티가 로컬에서 예측되므로, 소유 클라이언트와 서버에서 실행한 다음, 로컬이 아닌 클라이언트에 리플리케이트합니다.

  3. 임시 입력 매핑 컨텍스트를 적용하고 배수가 더 작은 입력에 그 이동 입력을 오버라이드합니다. 입력 규모를 줄임으로써 추가 이동 입력은 더 작은 가속을 생성하고, 가속 값이 더 작은 서버에 복제되어 캐릭터가 조준하는 동안 걷게 합니다.

  4. 로컬 플레이어의 경우, UI를 업데이트하고 ‘조준 시작' 사운드를 재생합니다.

  5. 입력 버튼을 놓을 때까지 기다렸다가, 버튼을 놓으면 어빌리티를 종료합니다.

어빌리티 종료 시:
  1. 커스텀 카메라 모드를 지웁니다.

  2. 로컬에서 제어되는 경우, UI가 업데이트되고 '조준 종료' 사운드를 재생합니다.

  3. 제어하던 캐릭터의 걷기 속도를 복원하고 입력 매핑 컨텍스트를 제거하여 일반 이동 속도를 복원합니다.

GA_Hero_Dash

GA_AbilityWithWidget에서 상속됩니다. 이 어빌리티는 Ability.Type.Action.Dash 의 에셋 태그인 InputTag.Ability.Dash 태그에 의해 활성화됩니다. Event.Movement.Dash 를 부여합니다. 활성화된 동안 쿨다운 이펙트를 사용합니다. GE_HeroDash_Cooldown : 쿨다운 활성화 시:

  1. 어빌리티 비용을 확인합니다. 비용을 지불 가능하면 비용을 커밋하고, 아니면 어빌리티를 종료합니다.

  2. 로컬 컨트롤을 확인하고, 서버에서 어빌리티를 종료합니다.

  3. 로컬 클라이언트에서, 입력 및 시선 방향에 따라 질주 방향을 선택합니다. 이동 입력이 없다면, 이 어빌리티는 클라이언트에서 종료됩니다(질주는 질주 방향 입력이 있을 때만 발생합니다).

  4. 이동 방향과 캐릭터의 오리엔테이션에 따라 재생할 애니메이션 몽타주를 선택합니다.

  5. 캐릭터가 웅크리고 있다면 웅크린 자세에서 벗어납니다.

  6. 어빌리티에 권한이 없다면(로컬 클라이언트), 서버 RPC를 통해 질주 방향과 선택한 몽타주를 리플리케이트합니다.

  7. 소유 클라이언트와 서버 양측에서 선택된 몽타주를 재생한 다음, 질주 방향으로 루트 모션 포스를 적용합니다.

  8. 메시징 서브시스템을 통해 메시지를 전송하여 클라이언트 측 UI에서 쿨다운 시간을 동기화할 수 있게 합니다.

  9. 서버에서 질주 이펙트 게임플레이 큐를 트리거하여 모든 클라이언트에 리플리케이트되도록 합니다.

  10. 루트 모션 포스가 완료되면, 추가로 잠시 딜레이한 다음, 어빌리티를 종료합니다. 이렇게 하면 추가 지연 시간 동안 부여된 어빌리티 태그를 유지하고 사격이나 점프 같은 다른 액션이 제한합니다.

GE_InstantHeal

GiveWeapon 함수를 오버라이드하여 수신하는 폰에 게임플레이 이펙트를 적용하고 인스턴스 치유 게임플레이 이펙트를 적용하는 ALyraWeaponSpawner 클래스가 있는 B_AbilitySpawner 에 의해 부여됩니다.

FLyraGameplayEffectContext

라이라 게임플레이 이펙트 컨텍스트(Lyra Gameplay Effect Context) 는 GAS에서 제공하는 기본 게임플레이 이펙트 컨텍스트(Gameplay Effect Context) (FGameplayEffectContext) 구조체에서 확장되어 게임플레이 큐 노티파이(Gameplay Cue Notifies) 에 전송할 추가 데이터 멤버와 함수를 정의합니다. FGameplayEffectContext는 구조체 유형이므로, 언리얼과 게임플레이 어빌리티 시스템에서 제대로 인식할 수 있는 대체 유형이 필요합니다. 라이라 게임플레이 이펙트 컨텍스트는 다음과 같은 여러 함수를 오버라이드합니다.

함수

설명

Duplicate()

HitResults 및 메모리 복사가 불가능한 다른 멤버에 대한 전체 복사를 수행합니다.

GetScriptStruct()

FLyraGameplayEffectContext::StaticStruct() 를 반환하여 블루프린트에 올바른 리플렉션 데이터를 제공합니다.

NetSerialize()

정의된 모든 추가 멤버에 대한 리플리케이션을 추가합니다.

라이라 게임플레이 이펙트 컨텍스트에 대해 구조체 템플릿(TStructOpsTypeTraits<> )이 정의됩니다. 이 헬퍼 구조체는 복제 및 시리얼라이제이션 함수 기능을 모두 바인딩하여 리플리케이션 시스템에서 사용할 수 있게 만듭니다.

라이라 어빌리티 시스템 글로벌(Lyra Ability System Globals) (ULyraAbilitySystemGlobals) 클래스는 어빌리티 시스템 글로벌(Ability System Globals) (UAbilitySystemGlobals) 클래스를 확장하고, AllocGameplayEffectContext() 함수를 오버라이드하여 라이라 게임플레이 이펙트 컨텍스트 구조체를 구성하고 반환합니다.

이를 통해 게임플레이 어빌리티 시스템이 새 게임플레이 이펙트 컨텍스트 오브젝트가 생성될 때마다 확장된 구조체를 할당하도록 합니다.

포함되는 추가 데이터

현재 게임플레이 이펙트 컨텍스트 구조체는 슈팅 코어(Shooter Core)의 원거리 무기 적중에 관련된 고유한 카트리지 ID(Cartridge ID)를 제공하고, 피지컬 머티리얼(Physical Material)과 어빌리티 소스 오브젝트(Ability Source Object)에 액세스하기 위한 추가 유틸리티를 제공합니다.

추가 데이터에 액세스하는 방법

라이라 게임플레이 이펙트 컨텍스트 구조체는 구조체 유형이기 때문에 그 데이터에 액세스하기 위해 블루프린트 노출 함수를 직접 포함할 수 없습니다.

이 제한을 해결하는 방법은 접근자를 블루프린트 함수 라이브러리에서 스태틱 함수로 구현하고, 컨텍스트 핸들(Context Handle)을 입력 파라미터로 전달한 다음, 내부적으로 파생된 구조체 유형에 캐스팅하는 것입니다.

헬퍼 함수 FLyraGameplayEffectContext::ExtractEffectContext 는 특수 유형에 대한 컨텍스트 포인터 캐스팅을 처리합니다. 현재 이러한 방식을 FLyraGameplayAbilityTargetData_SingleTargetHit 구조체에서 사용하고 있습니다.

비슷한 방식을 'FGameplayCueParameters'를 통해 게임플레이 큐에 전달된 이펙트 컨텍스트 핸들을 캐스팅하는 데 사용하여 추가 함수 기능에 액세스할 수 있습니다.

ULyraAttributeSet

라이라 어트리뷰트 세트(Lyra Attribute Set) (ULyraAttributeSet) 는 기본 어트리뷰트 세트 클래스에서 확장됩니다. 이 라이라 전용 베이스 클래스는 Get, Set 및 Initialize 함수 기능에 대한 값과 게임플레이 어트리뷰트 프로퍼티를 자동화하기 위한 편리한 ATTRIBUTE_ACCESSORS 매크로를 제공합니다.

FLyraAttributeEvent 는 어트리뷰트 세트 레벨에서 어트리뷰트 변경 이벤트를 간소화하는 데 사용됩니다.

함수

설명

GetWorld()

월드에 대한 레퍼런스를 가져오는 편의 게터입니다.

GetLyraAbilitySystemComponent()

라이라 어빌리티 시스템 컴포넌트에 대한 레퍼런스를 가져오는 편의 게터입니다.

라이라에서는 다음 두 개의 특수 어트리뷰트 세트 클래스를 제공합니다.

ULyraHealthSet

라이라 체력 세트(Lyra Health Set) (ULyraHealthSet) 에는 캐릭터의 현재 체력과 최대 체력을 관리하는 다음 어트리뷰트가 포함되어 있습니다.

어트리뷰트

설명

Health

현재 체력 값으로, MaxHealth가 최대치입니다.

MaxHealth

최대 허용 체력 값을 결정합니다.

Healing

캐릭터에 적용된 치유량을 누적합니다. 체력 값에 영향을 준 다음, 자동으로 0으로 리셋됩니다.

Damage

캐릭터에 적용된 대미지 양을 누적합니다. 체력 값에 영향을 줍니다.

이 어트리뷰트 세트는 현재 체력 값을 MaxHealth에 고정하고, 체력이 고갈되는 시기를 추적하는 일도 담당합니다. 체력이 고갈되면 실행되는 FLyraAttributeEvent 델리게이트를 구현합니다.

다른 클래스는 게임에 체력 값을 노출하고 사망을 처리하는 ULyraHealthComponent 같은 체력 알림을 수신하기 위해 이 델리게이트에 바인딩됩니다.

ULyraCombatSet

라이라 전투 세트(Lyra Combat Set) (ULyraCombatSet) 는 대미지 및 치유에 대한 지원을 제공합니다. 게임플레이 이펙트는 이러한 어트리뷰트 중 하나를 수정하거나, 라이라의 커스텀 실행에 의존하여 총 체력을 조정합니다.

어트리뷰트

설명

BaseDamage:

대미지 실행 시 가해질 베이스 대미지 양입니다. 대미지 실행 계산에 입력으로 제공되어 실제 가해진 대미지를 결정합니다.

BaseHeal:

치유가 실행될 때 회복되는 체력 양입니다.

치유 및 대미지 작동 방식

기본으로 체력 어트리뷰트는 모디파이어로부터 숨겨지므로, 정규 어트리뷰트 등의 게임플레이 이펙트에 의해 직접 변경될 수 없습니다. 대신, Healing 어트리뷰트와 커스텀 실행 ULyraHealExecutionULyraDamageExecution 을 통해 간접적으로 값이 설정됩니다.

대미지와 치유를 어트리뷰트로 취급하면 수정된 어트리뷰트에서 개별 대미지 인스턴스를 분리할 수 있어 대미지 값으로 작업하는 것이 더 쉬워집니다. 이를 통해 중요 어트리뷰트를 실수로 수정하는 일을 방지할 수 있습니다. 체력 값은 게임플레이 이펙트 모디파이어로부터 숨겨지므로, 베이스 값 위에 기간 이펙트나 무한 이펙트를 적용하여 장기적인 측면에서 문제를 일으킬 위험이 없습니다.

치유 실행

ULyraHealExecution은 소스에서 BaseHeal 어트리뷰트의 스냅샷을 찍은 다음, 0으로 고정하여 마이너스 치유를 방지합니다. 마지막으로, 타깃(Target) 의 Health 어트리뷰트를 수정합니다. 이 작업은 소스에서 수행되므로, 체력 값이 문제없이 수정될 수 있습니다.

대미지 실행

ULyraDamageExecution은 BaseDamageHealth 어트리뷰트 값을 집계합니다. BaseDamage는 소스에서 캡처되고 스냅샷이 찍히지만, Health는 타깃에서 캡처됩니다. 그런 다음, 임팩트 위치를 확인합니다(이를 통해 대미지 수치 이펙트를 스폰할 위치를 파악합니다).

아군 사격을 위해 타깃의 팀을 확인하고, 거리와 피지컬 머티리얼에 따라 어테뉴에이션을 적용합니다. 마지막으로, 타깃의 Health 어트리뷰트를 수정합니다. 이 작업은 소스 코드에서 수행되므로, 체력 값이 문제없이 수정될 수 있습니다.

대미지 수치 게임플레이 큐는 체력 어트리뷰트 변경 사항을 그 크기로 수신하도록 설정되고 정규화되지 않은 원시 값에서 디스플레이를 파생합니다.

추가 정보

대미지 수치 작동 방식

대미지 어빌리티가 활성화되면, 테스트를 실행하여 무엇에 적중했는지 확인한 다음, 어빌리티가 타깃 액터에 대미지 게임플레이 이펙트를 적용합니다.

GameplayEffectParent_Damage_Basic (또는 거기서 상속된 모든 자손)은 무기 캐스트 및 수류탄에 의해 적용됩니다. 그러면, BaseDamage를 체력으로 변환하고 아군 사격을 필터링하는 실행을 통해 대미지가 적용된 다음, 게임플레이 큐 GameplayCue.Character.DamageTaken 의 크기가 LyraHealthSet.Health 큐에 적용됩니다.

GCN_Character_DamageTaken 이 클라이언트에서 호출됩니다. 이는 이펙트 인스티게이터가 로컬 플레이어인 경우에만 표시됩니다. 대미지는 게임플레이 큐의 원시 크기에 의해 결정됩니다. 위치는 적중 결과의 위치 값에 의해 결정되며, 위치 값은 로컬 컨트롤러의 ULyraNumberPopComponent에 전달됩니다. 이 컴포넌트는 디스플레이와 풀링을 처리하며, 적중 위치에 나이아가라 이미터를 스폰하고 구성하여 실제 대미지를 표시합니다.

라이라 캐릭터 초기화 방식

폰의 빙의 흐름, 게임 피처 등록 및 다양한 리플리케이트된 게임 프레임워크 값 간의 상호작용 때문에, 플레이 가능 캐릭터의 초기화 흐름을 예측할 수 없을 때도 있습니다. 클라이언트가 계속 서버를 기다리는 동안 이벤트가 제멋대로 발생할 수 있습니다.

라이라에서는 UPawnExtensionComponent 를 구현하여 이 문제를 해결합니다. 이 컴포넌트의 주요 임무는 폰의 어빌리티 세트를 부여하고 On Spawn Lyra Abilities 이벤트를 활성화하기 전에 폰에 대한 모든 관련 초기화 조건이 충족되는지 확인하는 것입니다.

또한 폰 확장 컴포넌트는 폰 때문에 부여된 모든 어빌리티를 추적하고 캐릭터가 파괴되거나 빙의 해제되면 빙의자의 플레이어 스테이트에서 어빌리티를 제거합니다.

ULyraPawnData 에셋을 통해 어빌리티 세트를 폰에 할당할 수 있습니다. 이러한 어빌리티 세트는 콘텐츠 브라우저에서 생성할 수 있으며, 기본 폰 데이터는 경험 정의(Experience Definition)에 의해 결정됩니다.

폰을 초기화하고 폰의 어빌리티를 할당하려면, 다음 조건이 충족되어야 합니다.

  • 기본 폰 데이터가 유효해야 합니다.

  • 유효한 로컬 컨트롤러에 의해 폰이 빙의되어 있거나 폰에 서버 권한이 있어야 합니다.

  • 관련 플레이어 스테이트 및 입력 컴포넌트가 폰에 리플리케이트되어야 하며, 유효해야 합니다.

블루프린트 에셋 명명 규칙

약어

의미

GA_

게임플레이 어빌리티

GE_

게임플레이 이펙트

GCN_

게임플레이 큐 노티파이(UGameplayCueNotify)

GCNL_

레이턴트 게임플레이 큐 노티파이(AGameplayCueNotify_Actor 및 서브클래스에서 상속)

Phase_

게임 페이즈 어빌리티

AbilitySet_

어빌리티 세트

IA_

입력 액션

InputData_

라이라 입력 환경설정

W_

위젯 UI

B_

폰 유형, 아이템 스포너 등의 모든 기타 블루프린트