Inventory - osy9611/ProjectPT GitHub Wiki

Inventory

ν•΄λ‹Ή λ¬Έμ„œλŠ” 인벀토리 μ‹œμŠ€ν…œμ„ κ΅¬ν˜„ν•œ λ‚΄μš©μ΄λ‹€.

ν˜„μž¬ μ„œλ²„ 연동이 μ—†λŠ” μƒνƒœμ—μ„œ ν΄λΌμ΄μ–ΈνŠΈκ°€ μž„μ‹œμ μœΌλ‘œ μ²˜λ¦¬ν•˜κ³  있으며, ν–₯ν›„ μ„œλ²„ μΆ”κ°€ μ‹œ μˆ˜μ •λ  ꡬ쑰λ₯Ό κ³ λ €ν•˜μ—¬ 섀계가 λ˜μ—ˆλ‹€.

κ²°κ³Όλ¬Ό

μ•„μ΄ν…œ 정보 및 μ‘°μž‘

Item ToolTip (툴팁)
Item ToolTip GIF
Item Divide (λ‚˜λˆ„κΈ°)
Item Divide GIF

인벀토리 μ •λ ¬ 및 이동

Item Category (필터링)
Item Category GIF
Item Drag&Drop, Sort (μ •λ ¬ 및 이동)
Item Drag&Drop, Sort GIF

μ£Όμš” κΈ°λŠ₯

  • μ•„μ΄ν…œ 이동
    • λ“œλž˜κ·Έ μ•€ λ“œλ‘­μ„ ν†΅ν•œ μ•„μ΄ν…œ 이동 κΈ°λŠ₯ κ΅¬ν˜„
    • μ•„μ΄ν…œμ„ λ“œλ ˆκ·Έν•˜μ—¬ λ‹€λ₯Έ 슬둯으둜 이동 κ°€λŠ₯ν•˜λ©°, UI와 데이터 동기화가 μ¦‰μ‹œ 반영됨
  • μ•„μ΄ν…œ μ •λ ¬
    • λ“±κΈ‰(λ ˆμ–΄λ„), μ•„μ΄ν…œ νƒ€μž…(μ†Œλͺ¨ν’ˆ, μž₯λΉ„ λ“±), TableID κΈ°μ€€μœΌλ‘œ μ •λ ¬ κΈ°λŠ₯ 제곡
  • μ•„μ΄ν…œ 필터링
    • μ•„μ΄ν…œ νƒ€μž…μ— λ”°λ₯Έ 필터링 κΈ°λŠ₯ μΆ”κ°€
    • μΉ΄ν…Œκ³ λ¦¬λ³„ 필터링을 μ μš©ν•˜μ—¬ μ‚¬μš©μžκ°€ μ›ν•˜λŠ” μ•„μ΄ν…œμ„ μ†μ‰½κ²Œ 찾을 수 μžˆλ„λ‘ κ΅¬ν˜„
  • μ•„μ΄ν…œ λ‚˜λˆ„κΈ° 및 병함
    • μ•„μ΄ν…œμ„ λ‚˜λˆ„κ³ , μŠ€νƒ κ°€λŠ₯ν•œ μ•„μ΄ν…œμ˜ 경우 병합할 수 μžˆλ„λ‘ κ΅¬ν˜„
    • νŠΉμ • ν‚€ μž…λ ₯ μ‹œ μ•„μ΄ν…œ λ‚˜λˆ„κΈ° UIλ₯Ό ν‘œμ‹œν•˜κ³  μ‚¬μš©μžμ˜ μž…λ ₯을 λ°›μ•„ λΆ„ν•  μˆ˜ν–‰
    • 병합 μ‹œ μŠ€ν… μ œν•œμ„ κ³ λ €ν•˜μ—¬ μ΅œλŒ€μΉ˜λ₯Ό μ΄ˆκ³Όν•˜μ§€ μ•Šλ„λ‘ 섀계
  • μ•„μ΄ν…œ 툴팁
    • μ•„μ΄ν…œμ— 따라 νˆ΄νŒμ„ λ™μ μœΌλ‘œ μƒμ„±ν•˜μ—¬ ν‘œμ‹œ
    • UMG 기반의 툴팁 μœ„μ ―μ„ μ‚¬μš©ν•˜μ—¬ μ•„μ΄ν…œλ³„ 고유 정보λ₯Ό μ‹€μ‹œκ°„μœΌλ‘œ μ œκ³΅ν•˜λ©°, λ‹€λ₯Έ UIμ—μ„œλ„ ν™œμš© κ°€λŠ₯

뢄석 및 고렀사항

μ•„μ΄ν…œ 데이터 ꡬ쑰

  • μ•„μ΄ν…œ λ°μ΄ν„°λŠ” μ„œλ²„μ™€ λ™κΈ°ν™”λ˜λ©°, GUID 기반으둜 κ΄€λ¦¬λ˜μ–΄ 쀑볡 μ•„μ΄ν…œμ„ ꡬ별할 수 μžˆλ„λ‘ 섀계됨

  • 데이터 ꡬ쑰

    tableNo ItemName Grade ItemType BindType CanSell ItemDesc ResourcePath CanStack MaxStackCount
    int string int ItemType BindType bool string string bool int

UI/UX κ³ λ € 사항

  • μ•„μ΄ν…œ 이동
    • μ•„μ΄ν…œ 이동 μ‹œ 전체 데이터λ₯Ό κ°±μ‹ ν•˜μ§€ μ•Šκ³ , λ³€κ²½λœ λ°μ΄ν„°λ§Œ μ—…λ°μ΄νŠΈν•˜μ—¬ μ„±λŠ₯ μ΅œμ ν™”
    • 슬둯 μŠ€μ™‘ λ˜λŠ” 병합 μ—¬λΆ€λ₯Ό μžλ™ κ°μ§€ν•˜μ—¬ μœ μ—°ν•œ UI 제곡
  • μ•„μ΄ν…œ 필터링
    • UI의 ν•„ν„° λ²„νŠΌμ„ μ‚¬μš©ν•˜μ—¬ μ›ν•˜λŠ” μΉ΄ν…Œκ³ λ¦¬(μž₯λΉ„, μ†ŒλΉ„, μ•„μ΄ν…œ λ“±)만 ν‘œμ‹œ κ°€λŠ₯
  • μ•„μ΄ν…œ 병합, λ‚˜λˆ„κΈ°
    • νŠΉμ • ν‚€ μž…λ ₯ μ‹œ μ•„μ΄ν…œ λ‚˜λˆ„κΈ° UIλ₯Ό ν‘œμ‹œν•˜κ³  μ‚¬μš©μžμ˜ μž…λ ₯을 λ°›μ•„ λΆ„ν•  μˆ˜ν–‰
    • 병합 μ‹œ μŠ€νƒ μ œν•œμ„ κ³ λ €ν•˜μ—¬ μ΅œλŒ€μΉ˜λ₯Ό μ΄ˆκ³Όν•˜μ§€ μ•Šλ„λ‘ 섀계
  • μ•„μ΄ν…œ 툴팁
    • 툴팁이 νœ˜λ°œμ„±μ΄ μ•„λ‹Œ, μ§€μ†μ μœΌλ‘œ ν™œμ„±ν™”λ˜κ±°λ‚˜ μœ μ €κ°€ 직접 확인할 수 μžˆλŠ” κΈ°λŠ₯ 제곡
    • μΈλ²€ν† λ¦¬λΏλ§Œ μ•„λ‹ˆλΌ λ‹€λ₯Έ UIμ—μ„œλ„ μ‰½κ²Œ ν™œμš© κ°€λŠ₯ν•˜λ„λ‘ ꡬ쑰 섀계

μ„œλ²„ 연동 및 ν™•μž₯μ„±

  • μ„œλ²„ 연동 μ‹œ μ•„μ΄ν…œ 데이터 μš”μ²­ 흐름
    1. ν΄λΌμ΄μ–ΈνŠΈ 접속 μ‹œ, μ„œλ²„μ—μ„œ 인벀토리 데이터 μš”μ²­
    2. μ„œλ²„λŠ” ν˜„μž¬ 보유 쀑인 μ•„μ΄ν…œ 리슀트λ₯Ό λ°˜ν™˜
    3. ν΄λΌμ΄μ–ΈνŠΈλŠ” 받은 데이터λ₯Ό 기반으둜 인벀토리 UI μ—…λ°μ΄νŠΈ
    4. μ•„μ΄ν…œ μ‚¬μš©/μ‚­μ œ/이동 μ‹œ μ„œλ²„μ— μš”μ²­μ„ 보내고 응닡을 기반으둜 μ΅œμ’… 처리
  • μ„œλ²„ 데이터 검증 방식
    • ν΄λΌμ΄μ–ΈνŠΈλŠ” μ„œλ²„ 응닡을 받은 ν›„ μ•„μ΄ν…œ μƒνƒœλ₯Ό λ³€κ²½ν•˜λŠ” 방식 적용
    • μ„œλ²„μ—μ„œ μ†Œμ§€ κ°€λŠ₯ 개수 μ—¬λΆ€ 등을 데이터 검증을 μˆ˜ν–‰ν•œ ν›„ μ΅œμ’… 데이터λ₯Ό ν΄λΌμ΄μ–ΈνŠΈμ— 반영
    • 데이터 뢈일치 λ°œμƒ μ‹œ ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„ 데이터λ₯Ό κ°•μ œ λ™κΈ°ν™”ν•˜λŠ” κΈ°λŠ₯을 제곡
    • μ„œλ²„μ—μ„œ 검증 ν›„ λ³€κ²½λœ 데이터λ₯Ό ν΄λΌμ΄μ–ΈνŠΈμ— λ°˜μ˜ν•˜λŠ” 방식 적용

κ΅¬ν˜„ λ‚΄μš©

μ•„μ΄ν…œ 데이터 κ°±μ‹ 

  • 둜그인 λ˜λŠ” 인벀토리 동기화 μš”μ²­μ΄ λ“€μ–΄μ˜€λ©΄ μ„œλ²„ 데이터와 동기화

  • μ£Όμš” μ½”λ“œ

    void UPTUserData_Inventory::UpdateSlotData(const TArray<FInventoryItem>& ServerInventory)
    {
        if (ServerInventory.IsEmpty())
            return;
    
        InventoryData.Reset();
        ItemIDToGUIDMap.Reset();
    
        for (const FInventoryItem& InvenItem : ServerInventory)
        {
            InventoryData.Add(InvenItem.GUID, InvenItem);
            ItemIDToGUIDMap.FindOrAdd(InvenItem.ItemID).Add(InvenItem.GUID);
        }
    
        UpdateUI();
    }

μ•„μ΄ν…œ 이동 및 병합

  • λ“œλž˜κ·Έ μ•€ λ“œλ‘­μ„ 톡해 μ•„μ΄ν…œμ„ 이동 λ˜λŠ” 병합할 수 μžˆλ„λ‘ κ΅¬ν˜„

  • μ£Όμš”μ½”λ“œ

    void UPTInventoryWidget::OnCellDropped(UPTItemCell_Drag* DraggedCell, UPTItemDragOperation* DragDropOperation)
    {
        if (!DragDropOperation)
            return;
    
        UPTItemCell_Inventory* TargetCell = Cast<UPTItemCell_Inventory>(DraggedCell);
        UPTItemCell_Inventory* SelectCell = Cast<UPTItemCell_Inventory>(DragDropOperation->SourceCell);
        if (TargetCell == SelectCell)
            return;
    
        MergeOrSwapItem(SelectCell, TargetCell);
    }

μ•„μ΄ν…œ λ‚˜λˆ„κΈ°

  • νŠΉμ • 개수만큼 μ•„μ΄ν…œμ„ λΆ„ν• ν•˜λŠ” κΈ°λŠ₯ κ΅¬ν˜„

  • μ£Όμš” μ½”λ“œ

    void UPTUserData_Inventory::DivideItemData(FString ItemGUID, int32 DivideCount)
    {
        if (ItemGUID.IsEmpty() || DivideCount <= 0)
            return;
    
        FInventoryItem* Item = InventoryData.Find(ItemGUID);
        if (!Item || Item->Count < DivideCount)
            return;
    
        Item->Count -= DivideCount;
        FInventoryItem NewItem = *Item;
        NewItem.GUID = FGuid::NewGuid().ToString();
        NewItem.Count = DivideCount;
        InventoryData.Add(NewItem.GUID, NewItem);
    
        UpdateUI();
    }
⚠️ **GitHub.com Fallback** ⚠️