보통 아이템의 경우 크게 소비할 수 있는지(포션, 버프용 아이템 등등) 혹은 소비할 수 없는지(장비 아이템)로 나뉘는 경우가 많다.
현재 프로젝트에서는 아이템 구조체 부분과 아이템 추가 함수를 업데이트하고 소비 아이템인지 검증하는 함수만 짜면 구현하는데에는 그리 어렵진 않으리라 생각했다.
우선 아이템 구조체 부분
USTRUCT(BlueprintType)
struct FInventoryItem : public FTableRowBase, public IInventoryActionBase
{
. . . . .
UPROPERTY(EditAnywhere, BlueprintReadWrite)
bool IsConsumable = true;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
int32 Quantity = 1;
. . . . .
};
아이템이 소비 가능한지를 판단하는 bool 타입 멤버와 아이템 갯수를 나타내는 Quantity를 추가했다.
bool UInventoryComponent::ConsumableCheck(FInventoryItem ItemToAdd)
{
if (ItemToAdd.IsConsumable)
{
// 소비아이템일경우
for (int32 Index = 0; Index != inventory.Num(); ++Index)
{
if (inventory[Index].ItemID == ItemToAdd.ItemID)
{
// 아이템을 이미 가지고 있는 경우
inventory[Index].Quantity++;
return true;
}
}
// 소비 아이템이지만 아이템을 가지고 있지 않은경우
return false;
}
// 소비 아이템이 아닐 경우
return false;
}
인벤토리 컴포넌트에 추가한 소비재 검증함수이다.
먼저 추가할 아이템이 소비할 수 있는지를 확인한 뒤 소비 아이템이라면 현재 인벤토리에서 해당 아이템을 소지하고 있는지를 검증한다, 만약 가지고 있다면 갯수를 올린뒤 true를 리턴하고 가지고 있지 않다면 소비 아이템이지만 하나도 갖고 있지 않기 때문에 false를 리턴한다.
bool UInventoryComponent::AddItemToInventoryByID(FName ID)
{
ASciFiCombatGameState* GameState = Cast<ASciFiCombatGameState>(GetWorld()->GetGameState());
UDataTable* ItemTable = GameState->GetItemDB();
FInventoryItem* ItemToAdd = ItemTable->FindRow<FInventoryItem>(ID, "");
if (ItemToAdd)
{
// If a Slot- or WeightLimit are not needed remove them in this line
if (inventory.Num() < inventory_slot_limit && GetInventoryWeight() + ItemToAdd->Weight <= inventory_weight_limit)
{
if (!ConsumableCheck(*ItemToAdd))
{
inventory.Add(*ItemToAdd);
inventory_owner->ReloadInventory();
}
// 소비재 아이템의 경우 존재하는 아이템에 Quantity를 증가시키고 함수를 종료한다.
return true;
}
}
return false;
}
아이템을 추가하는 함수이다. 검증 함수를 통해 소비재인지 확인하는 로직이 추가되었고 false인 경우에만 아이템을 새로 추가하게끔 변경했다.
장착용 아이템인 Shield는 소비 옵션이 꺼져있다.
Apple 아이템의 경우 소비 옵션이 켜져있다.
소비 옵션이 꺼져있는 방패 아이템은 카운트가 되지않지만 사과 아이템은 먹을때마다 Quantity값이 올라가는 것을 확인할 수 있다.
아이템 추가할 때 Weight 값도 같이 올려야되는데 깜빡했다.. 일단 자고 일어나서 수정해야겠다.