언리얼 엔진의 라이라 인벤토리 및 장비 | 언리얼 엔진 5.5 문서 | Epic Developer Community
라이라 인벤토리 시스템으로 알아보는 GameplayTag
UCLASS(Blueprintable, Const, Abstract)
class ULyraInventoryItemDefinition : public UObject
{
GENERATED_BODY()
public:
ULyraInventoryItemDefinition(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get());
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category=Display)
FText DisplayName;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category=Display, Instanced)
TArray<TObjectPtr<ULyraInventoryItemFragment>> Fragments;
public:
const ULyraInventoryItemFragment* FindFragmentByClass(TSubclassOf<ULyraInventoryItemFragment> FragmentClass) const;
};
전에 궁금했던 ULyraInventoryItemDefinition > Fragments는 무엇인가

Fragment를 통해 아이템을 정의하고 있었다

Inventory Fragment Equippable Item > EquipmentDefinition의 경우에는 AbilitySet이나 주웠을 때 붙을 소켓 등을 지정하고 있다.
Fragment 중에 GameplayTag를 사용하는 Inventory Fragment Set Stats에 대해 알아보자
UCLASS()
class UInventoryFragment_SetStats : public ULyraInventoryItemFragment
{
GENERATED_BODY()
protected:
UPROPERTY(EditDefaultsOnly, Category=Equipment)
TMap<FGameplayTag, int32> InitialItemStats;
public:
virtual void OnInstanceCreated(ULyraInventoryItemInstance* Instance) const override;
int32 GetItemStatByTag(FGameplayTag Tag) const;
};
LyraInventoryItemDefenition에서 정의한 대로 InitialItemStats를 세팅하고 이후에는 그때그때 해당 태그의 Stat을 구하기 위한 GetItmeStatByTag 함수가 있다.
int32 ALyraWeaponSpawner::GetDefaultStatFromItemDef(const TSubclassOf<ULyraInventoryItemDefinition> WeaponItemClass, FGameplayTag StatTag)
{
if (WeaponItemClass != nullptr)
{
if (ULyraInventoryItemDefinition* WeaponItemCDO = WeaponItemClass->GetDefaultObject<ULyraInventoryItemDefinition>())
{
if (const UInventoryFragment_SetStats* ItemStatsFragment = Cast<UInventoryFragment_SetStats>( WeaponItemCDO->FindFragmentByClass(UInventoryFragment_SetStats::StaticClass()) ))
{
return ItemStatsFragment->GetItemStatByTag(StatTag);
}
}
}
return 0;
}
그래서 언제 Stat을 구하나 봤더니 코드에서는 ALyraWeaponSpawner에만 있는 기념으로 무기 하나 꺼내봤다

Lyra.ShooterGame.Weapon.MagazineSize : 현재 무기의 탄창 하나에 허용된 최대 탄약 수
Lyra.ShooterGame.Weapon.MagazineAmmo : 현재 탄창에 남은 탄약 수. 탄약 수가 0이 되면, 계속 발사하기 위해 무기를 재장전한다.
Lyra.ShooterGame.Weapon.SpareAmmo : 현재 탄창에 없는 남은 탄약 수
무기의 남은 탄약 수를 무기의 GameplayTag로 관리하는 줄은 몰랐다...

관련 어빌리티인 GA_WeaponReloadMagazine을 살펴봤다
MagazineAmmo(탄창에 남은 탄약 수)를 GameplayTag를 통해 구하고 0이면 플레이어 액터에 NoFiring 태그를 추가하고 있다.(AddLooseGameplayTag가 정확히 뭘까)

재장전 할 때는 MagazineAmmo, SpareAmmo의 값을 변경한다.
...이렇게 수많은 GameplayTag 의 예시 중 하나 알아봤다^^