[TIL] 251126

๊น€์„ธํฌยท2025๋…„ 11์›” 26์ผ

โœ๏ธToday I Learned

๐Ÿ“… 2025-11-26

  • ์ธ๋ฒคํ† ๋ฆฌ ์ปดํฌ๋„ŒํŠธ ํŽธ์˜ ํ•จ์ˆ˜ ๊ตฌํ˜„ (GetItemCount, ConsumeItem, AddItem ์˜ค๋ฒ„๋กœ๋“œ)
  • ์ œ์ž‘ ์‹œ์Šคํ…œ๊ณผ ์ธ๋ฒคํ† ๋ฆฌ ์—ฐ๋™์„ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์™„์„ฑ

์ธ๋ฒคํ† ๋ฆฌ ์ปดํฌ๋„ŒํŠธ ํŽธ์˜ ํ•จ์ˆ˜ ๊ตฌํ˜„

๐Ÿ“Œ ๊ตฌํ˜„ ๋‚ด์šฉ

์ œ์ž‘ ์‹œ์Šคํ…œ์—์„œ ํ•„์š”๋กœ ํ•˜๋Š” ์ธ๋ฒคํ† ๋ฆฌ ์กฐ์ž‘ ํ•จ์ˆ˜๋“ค์„ ์ถ”๊ฐ€๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค:

1. GetItemCount - ํŠน์ • ์•„์ดํ…œ ์ด ๊ฐœ์ˆ˜ ์กฐํšŒ

int32 UTSInventoryMasterComponent::GetItemCount(int32 StaticDataID) const
{
    int32 ResultCount = 0;
    
    // ํ•ซํ‚ค ์ธ๋ฒคํ† ๋ฆฌ ํƒ์ƒ‰
    for (const FSlotStructMaster& Slot : HotkeyInventory.InventorySlotContainer)
    {
        if (Slot.ItemData.StaticDataID == StaticDataID)
        {
            ResultCount += Slot.CurrentStackSize;
        }
    }
    
    // ๊ฐ€๋ฐฉ ์ธ๋ฒคํ† ๋ฆฌ ํƒ์ƒ‰ (๊ฐ€๋ฐฉ์ด ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ๋งŒ)
    if (GetCurrentBagSlotCount() == 0)
    {
        return ResultCount;
    }
    for (const FSlotStructMaster& Slot : BagInventory.InventorySlotContainer)
    {
        if (Slot.ItemData.StaticDataID == StaticDataID)
        {
            ResultCount += Slot.CurrentStackSize;
        }
    }
    
    return ResultCount;
}

ํŠน์ง•:

  • const ํ•จ์ˆ˜๋กœ ์ฝ๊ธฐ ์ „์šฉ ๋ณด์žฅ
  • ํ•ซํ‚ค + ๊ฐ€๋ฐฉ ์ธ๋ฒคํ† ๋ฆฌ์˜ ๋ชจ๋“  ์Šฌ๋กฏ์„ ์ˆœํšŒํ•˜๋ฉฐ ์ง‘๊ณ„
  • ๊ฐ€๋ฐฉ์ด ๋น„ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ ์กฐ๊ธฐ ๋ฐ˜ํ™˜์œผ๋กœ ์„ฑ๋Šฅ ์ตœ์ ํ™”

2. ConsumeItem - ํŠน์ • ์•„์ดํ…œ ์†Œ๋น„

void UTSInventoryMasterComponent::ConsumeItem(int32 StaticDataID, int32 Quantity)
{
	// ํ•ซํ‚ค ์ธ๋ฒคํ† ๋ฆฌ ํƒ์ƒ‰
	for (int32 i = 0; i < HotkeyInventory.InventorySlotContainer.Num(); ++i)
	{
		FSlotStructMaster& Slot = HotkeyInventory.InventorySlotContainer[i];
		if (Slot.ItemData.StaticDataID == StaticDataID)
		{
			int32 ToRemove = FMath::Min(Quantity, Slot.CurrentStackSize);
			RemoveItem(EInventoryType::HotKey, i, ToRemove);
			Quantity -= ToRemove;
			if (ActiveHotkeyIndex == i)
			{
				HandleActiveHotkeyIndexChanged();
			}
			if (Quantity <= 0)
			{
				break;
			}
		}
	}
	// ๊ฐ€๋ฐฉ ์ธ๋ฒคํ† ๋ฆฌ ํƒ์ƒ‰
	if (GetCurrentBagSlotCount() > 0)
	{
		for (int32 i = 0; i < BagInventory.InventorySlotContainer.Num(); ++i)
		{
			FSlotStructMaster& Slot = BagInventory.InventorySlotContainer[i];
			if (Slot.ItemData.StaticDataID == StaticDataID)
			{
				int32 ToRemove = FMath::Min(Quantity, Slot.CurrentStackSize);
				RemoveItem(EInventoryType::BackPack, i, ToRemove);
				Quantity -= ToRemove;
				if (Quantity <= 0)
				{
					break;
				}
			}
		}
	}
	HandleInventoryChanged();
}

์„ค๊ณ„ ์˜๋„:

  • ํ•ซํ‚ค ์ธ๋ฒคํ† ๋ฆฌ โ†’ ๊ฐ€๋ฐฉ ์ธ๋ฒคํ† ๋ฆฌ ์ˆœ์„œ๋กœ ์†Œ๋น„ (์ ‘๊ทผ์„ฑ ๋†’์€ ์ˆœ์„œ)
  • ํ™œ์„ฑ ํ•ซํ‚ค ์Šฌ๋กฏ์˜ ์•„์ดํ…œ์ด ์†Œ๋น„๋˜๋ฉด ์žฅ์ฐฉ ์ƒํƒœ ๊ฐฑ์‹ 
  • ์ „์ฒด ์†Œ๋น„ ์™„๋ฃŒ ํ›„ ํ•œ ๋ฒˆ๋งŒ HandleInventoryChanged() ํ˜ธ์ถœ

3. AddItem ์˜ค๋ฒ„๋กœ๋“œ - int32 ๋ฒ„์ „ ์ถ”๊ฐ€

bool UTSInventoryMasterComponent::AddItem(const int32 StaticDataID, int32 Quantity, int32& OutRemainingQuantity)
{
    FItemInstance ItemData = FItemInstance(StaticDataID, GetWorld()->GetTimeSeconds());
    return AddItem(ItemData, Quantity, OutRemainingQuantity);
}

ํŽธ์˜์„ฑ:

  • ์ œ์ž‘ ์‹œ์Šคํ…œ์—์„œ StaticDataID๋งŒ์œผ๋กœ ์•„์ดํ…œ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ
  • ์„œ๋ฒ„ ์‹œ๊ฐ„ ์ž๋™ ์„ค์ •์œผ๋กœ ๋ถ€ํŒจ ์‹œ์Šคํ…œ ์—ฐ๋™
  • ๊ธฐ์กด FItemInstance ๋ฒ„์ „ AddItem์„ ์žฌ์‚ฌ์šฉ

๐ŸŽฏ ์ œ์ž‘ ์‹œ์Šคํ…œ๊ณผ์˜ ์—ฐ๋™ ์™„์„ฑ

์ด์ œ ์ œ์ž‘๋Œ€์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅ:

// ์ œ์ž‘ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ ํ™•์ธ
bool ATSCraftingTable::CanCraft(int32 RecipeID, ATSCharacter* InstigatorCharacter)
{
    for (const FIngredientData& Ingredient : RecipeData.Ingredients)
    {
        int32 ItemCount = PlayerInventoryComp->GetItemCount(Ingredient.MaterialID);
        if (ItemCount < Ingredient.Count)
        {
            return false;  // ์žฌ๋ฃŒ ๋ถ€์กฑ
        }
    }
    return true;
}

// ์ œ์ž‘ ์‹คํ–‰
void ATSCraftingTable::StartCrafting(int32 RecipeID, ATSCharacter* InstigatorCharacter)
{
    // ์žฌ๋ฃŒ ์†Œ๋น„
    for (const FIngredientData& Ingredient : RecipeData.Ingredients)
    {
        PlayerInventoryComp->ConsumeItem(Ingredient.MaterialID, Ingredient.Count);
    }
    
    // ๊ฒฐ๊ณผ๋ฌผ ์ƒ์„ฑ
    int32 RemainingQuantity;
    InventoryComp->AddItem(RecipeData.ResultItemID, RecipeData.ResultCount, RemainingQuantity);
}

๐Ÿ’ก ๋А๋‚€ ์  (What I Felt)

์˜ค๋ฒ„๋กœ๋“œ ํ•จ์ˆ˜์˜ ํŽธ์˜์„ฑ์„ ์ฒด๊ฐํ–ˆ๋‹ค. AddItem(int32, ...) ๋ฒ„์ „ ํ•˜๋‚˜ ์ถ”๊ฐ€ํ–ˆ์„ ๋ฟ์ธ๋ฐ, ์ œ์ž‘ ์‹œ์Šคํ…œ ์ฝ”๋“œ๊ฐ€ ํ›จ์”ฌ ๊ฐ„๊ฒฐํ•ด์กŒ๋‹ค. FItemInstance๋ฅผ ๋งค๋ฒˆ ์ƒ์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋˜๋‹ˆ ์ฝ”๋“œ ๊ฐ€๋…์„ฑ๋„ ์ข‹์•„์กŒ๋‹ค.

์œ„์ ฏ์ชฝ์—์„œ ํ˜„์žฌ ๋ถ€์กฑํ•œ ์žฌ๋ฃŒ ์•„์ดํ…œ์˜ ๊ฒฝ์šฐ์—๋Š” ํ•œ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ํ‘œ์‹œ๋ฅผ ํ•˜๊ฑฐ๋‚˜ "์ œ์ž‘ ์‹คํŒจ โ†’ ์‚ฌ์šฉ์ž ํ”ผ๋“œ๋ฐฑ"๊นŒ์ง€ ์ด์–ด์ง€๋„๋ก ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ์„ฑ๊ณต ์—ฌ๋ถ€๋ฅผ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜, ์—๋Ÿฌ ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์„ ๊ณ ๋ คํ•ด๋ด์•ผ๊ฒ ๋‹ค.


0๊ฐœ์˜ ๋Œ“๊ธ€