GameplayTagStack in Lyra

Jangmanbo·2025년 9월 16일

Gameplay Tag Stack

현재 들고 있는 무기의 남은 탄창 개수를 보여주고,
탄창이 다 떨어지면 스킬을 못쓰게 하는 기능을 GameplayTagStack으로 구현해보자

GameplayTag와 Stack으로 이루어져 있다.
탄창이라고 하면 탄창에 해당하는 GameplayTag와 탄창 개수를 넣으면 되는 것

Gameplay Tag Stack Container

간단히 말하면 여러 Gameplay Tag Stack을 넣은 struct
여러 스탯에 대한 스택을 현재 아이템에 넣고 스탯이 변동될 때마다 적용할 수 있다

즉, 앞서 장착 아이템에 Ability, Weapon 시스템을 넣었는데 이에 더해 GameplayTagStackContainer를 통해 GameplayTagStack까지 추가할 수 있다
(그래서 InventoryItemInstance에서 멤버변수로 GameplayTagStackContainer가 있다)

InventoryFragment_SetStats

아이템 모듈화를 위한 클래스인 InventoryItemFragment를 상속받은 InventoryFragment_SetStats클래스
(전에 Inventory 시스템 정리하면서 봤던 그 InventoryItemFragment)

스탯이 필요한 InventoryItemDefinition 에셋에 이 프래그먼트를 추가하면 된다
여기서는 최대 탄창 개수와 초기 탄창 개수 스탯이 세팅되어있다

ItemInstance가 생성되는 시점인 OnInstanceCreated에서 프래그먼트 세팅값을 토대로 ItemInstance를 초기화한다
(OnInstanceCreated는 다른 프래그먼트들에서도 유용)

Gameplay Ability

전에도 배웠던 Gameplay Ability 시스템
총을 쏘면 탄창을 줄이는 기능은 Gameplay Ability로 만들어보자

Ability Cost

AbilityCost를 통해 현재 어빌리티를 실행할 수 있을만큼의 cost가 있는지 확인한다
CheckCost: ItemInstance에서 해당 Tag에 대한 값을 가져와 Quantity(Ability 실행에 필요한 cost)와 비교. cost가 부족하면 false, 충분하면 true 리턴
ApplyCost: Ability를 실행하면 ItemInstance의 해당 태그의 Value를 업데이트 (ex. 총을 쏘면 탄창 개수를 줄인다)

Gameplay Ability

GameplayAbility에 여러 AbilityCost를 세팅할 수 있다
이 AbilityCost 리스트를 돌면서 하나라도 cost를 만족하지 못하면 어빌리티가 실행되지 못한다


이제 피스톨에 AbilityCost를 설정하고

크로스헤어 ui는 Weapon이 변경되는 시점인 OnWeaponInitialized에서 초기화 + Tick마다 남은 탄창에 따라 상태를 변경해주면 끝!
(Tick보다는 탄창 태그의 value가 업데이트될 때의 이벤트에서 처리해주면 좋을 듯)

0개의 댓글