저번 글에서 간단하게 GameplayAbilitySystem에 대해서 알아보고 Lyra 프로젝트에선 AbilitySystem에서 쓰는 몇 가지 객체들을 상속해서 기능을 확장했다고 했습니다. 확장된 LyraAbilitySystemComponent를 알아봤고 이번 글에선 AbilitySystemComponent와 제일 밀접하게 관련있는 GameplayAbility의 확장 버전을 알아보고 AttributeSet이 어떻게 구성되어 있는지, 그리고 실제로 Component가 어떤 식으로 Actor에 붙어있는지 확인해보겠습니다.

 

LyraGameplayAbility

  • GameplayAbility를 상속받았고 Abstract 키워드로 LyraGameplayAbility 자체로는 인스턴스가 될 수 없습니다. friend 선언으로 LyraAbilitySystemComponent에서는 LyraGameplayAbility에 private 구분 없이 접근 가능합니다.

 

  • 마찬가지로 Non virtual, virtual, 멤버 변수순으로 분석하겠습니다.
  • Non virtual(자체 정의)
    • GetLyraAbilitySystemComponentFromActorInfo : LyraAbilitySystemComponent 타입의 ASC를 반환합니다. (ActorInfo 변수로부터)
    • GetLyraPlayerControllerFromActorInfo : LyraPlayerController 타입의 PlayerController를 반환합니다 . (ActorInfo 변수로부터)
    • GetControllerFromActorInfo : Controller를 얻습니다. OwnerActor로부터 재귀적으로 Owner를 검사하여 Pawn 또는 Controller일 때까지 검사합니다. nullptr을 반환할 수 있습니다.
    • GetLyraCharacterFromActorInfo : LyraCharacter 타입의 Character를 반환합니다. (ActorInfo 변수로부터)
    • GetHeroComponentFromActorInfo : HeroComponent를 반환합니다. (Lyra 자체제작 컴포넌트)
    • GetActivationPolicy : ActivationPolicy 열거형을 반환합니다. 가질 수 있는 상태는 OnInputTriggered, WhileInputActive, OnSpawn 입니다. 이 값을 기준으로 Spawn시 어빌리티를 적용하거나 Input을 처리합니다.
    • GetActivationGroup : ActivationGroup 열거형을 반환합니다. 가질 수 있는 상태는 Independent, Exclusive_Replaceable, Exclusive_Blocking 입니다.
    • TryActivateAbilityOnSpawn : ActivationPolicy가 OnSpawn인 어빌리티에 대해서만 TryActivateAbility를 수행합니다.
    • CanChangeActivationGroup : ActivationGroup을 바꿀 수 있는지 여부를 반환합니다. Instance이거나 Active이거나 하는 등의 조건에 따라 반환값이 다릅니다.
    • ChangeActivationGroup : ActivationGroup을 바꿉니다. LyraASC의 컨테이너에서 관리합니다.
    • SetCameraMode : ActiveCameraMode를 세팅합니다.
    • ClearCameraMode : ActiveCameraMode를 nullptr로 바꿉니다.
    • OnAbilityFailedToActivate : Ability가 Activate 실패 시 콜백됩니다. Native 구현과 블프 구현을 둘 다 할 수 있습니다.
  • virtual(오버라이드)
    • CanActivateAbility : ActivationGroup이 Block된다면 false를 반환합니다.
    • SetCanBeCanceled : ActivationGroup이 Exclusive_Replabeable일 경우 Cancel을 막을 수 없습니다.
    • OnGiveAbility : 블프용 함수 호출(K2_OnAbilityAdded), TryActivateAbilityOnSpawn 호출
    • OnRemoveAbility : 블프용 함수 호출(K2_OnAbilityRemoved)
    • EndAbility : ClearCameraMode 호출
    • CheckCost : AdditionalCost를 체크하여 true, false를 반환합니다.
    • ApplyCost : 어빌리티 발동에 따른 Cost를 적용합니다. Additional Cost를 추가로 고려하였고 Additional Cost는 Target이 있어야만 발동되는 경우가 있어 그것에 대한 예외처리도 되어 있습니다.
    • MakeEffectContext : GameplayEffectContext를 LyraGameplayEffectContext로 확장하여 AbilitySource, Instigator, SourceObject등을 부가적으로 관리합니다.
    • ApplyAbilityTagsToGameplayEffectSpec : GameplayEffectSpec에 Tag를 추가합니다. Spec이 HitResult가 있고 HitResult에 따른 PhysicalMaterial이 있을 경우 Material이 갖고 있는 Tag를 Spec.CapturedTargetTags에 추가합니다.
    • DoesAbilitySatisfyTagRequirements : Block, Miss에 대한 Tag가 있으면 false를 반환합니다.
    • GetAbilitySource : AbilitySpec이 관리하는 SourceObject인 UObject 타입이 있고, 그 타입은 어떤 언리얼 오트젝트라면 어떤 형태든 사용자 입맛에 맞게 사용할 수 있음. SourceObject는 이 프로젝트에서 ILyraAbilitySourceInterface를 통해 사용하게 되고 RangedWeapon이 이 인터페이스를 상속받은 유일한 클래스입니다.
  • 멤버 변수
    • ELyraAbilityActivationPolicy ActivationPolicy : OnInputTriggered, WhileInputActive, OnSpawn을 관리하는 열거형입니다.
    • ELyraAbilityActivationGroup ActivationGroup : Independent, Exclusive_Replaceable, Exclusive_Blocking을 관리하는 열거형입니다.
    • TArray<TObjectPtr<ULyraAbilityCost>> AdditionalCosts : 어빌리티 발동에 따른 ApplyCost시 부가적으로 이 컨테이너를 통해 Cost가 소모됩니다.
    • TMap<FGameplayTag, FText> FailureTagToUserFacingMessages : 어빌리티 발동 실패 시 User에게 보여줄 메시지에 대해 Tag와 매핑해 둔 컨테이너입니다.
    • TMap<FGameplayTag, TObjectPtr<UAnimMontage>> FailureTagToAnimMontage : 특정 애님 몽타주가 실패하는 Tag에 대한 컨테이너입니다.
    • bool bLogCancelation : true인 경우 이 어빌리티가 취소될 때 추가 정보가 로깅되어야 합니다. 임시용이고, 버그 추적을 위함입니다.
    • TSubclassOf<ULyraCameraMode> ActiveCameraMode : 최근의 카메라 모드입니다.
  • 요약
    • Lyra Project를 진행하며 서브클래스화 시킨 클래스들(PlayerController, AbilitySystemComponent, Character, HeroComponent 등)에 대해 Getter를 만들어 두었습니다.
    • ActivationPolicy, ActivationGroup의 열거형을 만들어 어빌리티가 Input, Spawn, Block 등에 대해 대응합니다.
    • Additional Cost를 통해 어빌리티 발동 시 부가적인 Cost에 대해 부여합니다.
    • Tag를 통해 어빌리티 발동 시 더 엄격한 검사를 진행합니다.
    • AbilitySpec의 SourceObject는 특정 인터페이스를 의미하며, 그것을 얻어올 수 있는 메서드를 지원합니다. 그 인터페이스의 실제 객체는 RangedWeapon으로 추정됩니다.

 

LyraAttributeSet

  • 위 사진과 같이 간단하게 구성되어 있습니다.
  • LyraProject에선 2가지 AttributeSet만 사용하는데 LyraHealthSet, LyraCombatSet입니다. 체력(Health)에 대해 관리해주는 AttributeSet, 체력 회복(Heal), 데미지(Damage)에 대해 관리해주는 AttributeSet이 있습니다.
  • 네트워킹까지 고려되어 있기 때문에 어떻게 구성되어 있는지 LyraHealthSet을 통해 알아보겠습니다.

 

LyraHealthSet

  • 당연하게도 LyraAttributeSet을 상속받습니다.
  • 관리하는 Attribute는 총 4가지입니다. [ Health, MaxHealth, Healing, Damage ]

  • 각각의 Attribute에 대해 Getter, Setter, Init 등의 함수를 지원합니다.
  • Helath와 MaxHealth의 경우 리플리케이션이 되어야 하는 변수이므로(사용자 간 체력을 알아야 함) ReplicatedUsing 키워드를 통해 리플리케이션을 명시하고 리플리케이션 시 콜백함수를 명시합니다.

  • 변수에 ReplicatedUsing에 이어 위 매크로 함수를 통해 등록하는 작업까지 해주어야 변수가 변경 시 네트워크를 통해 그 값이 전파됩니다.

  • Helath 변경 시 콜백 호출 된 OnRep_Health에선 Health 변경에 따른 델리게이트가 전파되고 체력이 0이하가 되면 Health가 없다는 델리게이트도 전파됩니다.

  • Attribute 변경 전, 후로 Clamp를 진행하게 되며 Health는 0보다 작아질 수 없고, MaxHealth보다 커질 수 없습니다. MaxHealth는 1보다 작아질 수 없습니다.

  • 위 사진은 PostGameplayEffectExecute의 일부분으로서 Health는 직접 조작되는 것이 아닌 Damage 혹은 Healing Attribute를 통해 간접적으로 조작되며 Damage, Healing에 대해선 Health를 위한 Attribute로 사용되고 나면 다시 0으로 초기화하는 특징이 있는 Meta Attribute라고 합니다.

 

AbilitySystemComponent, AttributeSet 적용 위치

  • LyraProject에서 기본적으로 사용될 Character 타입으로 LyraCharacter가 있습니다. 이 캐릭터에 Ability를 적용한 버전 LyraCharacterWithAbilities에서 Component와 AttirubteSet들을 가지고 있습니다.

  • 사진과 같이 변수로 선언하여 Subobject로 만들어 '인지'가 아닌 '집합'의 개념으로 소유하게 됩니다.
  • 네트워킹까지 고려하게 되면 Player용 캐릭터는 PlayerState에 AbilitySystemComponent와 AtrributeSet을 갖는 것이 정보교환에 유리하게 됩니다.

  • Player용 캐릭터는 LyraCharacterWithAbilities 버전을 사용하지 않을 것이고 그 내용은 PlayerState에서 관리하게 됩니다.

'Unreal Engine > Lyra Starter Game 분석' 카테고리의 다른 글

[2] - Lyra Starter Game 분석  (0) 2024.04.02
[1] - Lyra Starter Game 분석  (0) 2024.04.01
[0] - Lyra Starter Game 분석  (0) 2024.04.01

+ Recent posts