icon안동민 개발노트

간단한 인벤토리 시스템 구현


 인벤토리 시스템은 대부분의 게임에서 핵심적인 요소입니다.

 언리얼 엔진의 블루프린트를 사용하여 기본적이면서도 확장 가능한 인벤토리 시스템을 구현하는 방법을 살펴보겠습니다.

1. 아이템 데이터 구조 정의

 먼저 아이템을 표현할 데이터 구조를 정의합니다.

Struct: S_ItemData
Variables:
- ItemID (Integer)
- ItemName (String)
- ItemDescription (String)
- ItemIcon (Texture2D)
- ItemType (Enum: E_ItemType)
- StackSize (Integer)
- MaxStackSize (Integer)

 아이템 타입을 위한 열거형도 정의합니다.

Enum: E_ItemType
Values:
- Weapon
- Armor
- Consumable
- Quest

2. 인벤토리 UI 디자인

 인벤토리 UI는 그리드 레이아웃을 사용하여 구현할 수 있습니다.

 1. 위젯 블루프린트 생성 (WBP_Inventory)

 2. Uniform Grid Panel 추가

 3. 아이템 슬롯 위젯 생성 (WBP_InventorySlot)

  • 이미지 (아이템 아이콘)
  • 텍스트 (수량)
WBP_InventorySlot
Variables:
- ItemData (S_ItemData)
- SlotIndex (Integer)
 
Functions:
- UpdateSlotVisual
- OnSlotClicked

3. 아이템 추가/제거 로직 구현

 인벤토리 관리를 위한 함수들을 구현합니다.

Blueprint: BP_InventoryManager
 
Variables:
- InventoryItems (Array of S_ItemData)
- MaxInventorySize (Integer)
 
Functions:
- AddItem
- RemoveItem
- FindItemById
- UpdateUI

 아이템 추가 로직 예시

Function: AddItem
Input: NewItem (S_ItemData)
 
[Find Existing Item] --> [Branch: Found?]
                           |
    [Increase Stack Size] <-- [True]
                           |
   [Find Empty Slot] <-- [False]
        |
   [Add to Array]
        |
   [Update UI]

4. 아이템 정보 표시

 아이템 위에 마우스를 올렸을 때 툴팁으로 정보를 표시합니다.

WBP_InventorySlot
 
Event: On Mouse Enter
    |
[Create Tooltip Widget] --> [Set Item Info]
                        --> [Add to Viewport]
 
Event: On Mouse Leave
    |
[Remove Tooltip Widget]

5. 드래그 앤 드롭 기능 구현

 드래그 앤 드롭을 구현하여 아이템을 쉽게 이동할 수 있게 합니다.

WBP_InventorySlot
 
Event: On Drag Detected
    |
[Create Drag Drop Operation]
 
Event: On Drop
    |
[Get Dropped Item] --> [Swap Items]
                   --> [Update UI]

6. 아이템 스택킹

 같은 종류의 아이템을 하나의 슬롯에 쌓을 수 있게 합니다.

Function: AddItemToStack
Inputs: ItemToAdd, ExistingItem
 
[Get Current Stack Size] --> [Add New Amount]
                         --> [Clamp to Max Stack Size]
                         --> [Update Item Data]
                         --> [Return Leftover Amount]

7. 인벤토리 크기 제한 설정

 인벤토리의 최대 크기를 설정하고 관리합니다.

Function: CanAddItem
Input: ItemToAdd
 
[Get Current Inventory Size] --> [Compare to Max Size]
                              --> [Return Boolean]

8. 인벤토리 상태 저장 및 로드

 게임 세이브 시스템과 연동하여 인벤토리 상태를 저장하고 로드합니다.

Function: SaveInventory
[Get Inventory Items] --> [Convert to JSON]
                      --> [Save to File]
 
Function: LoadInventory
[Load from File] --> [Parse JSON]
                 --> [Populate Inventory Array]
                 --> [Update UI]

성능 최적화 방안

 1. 지연 로딩

  • 필요한 아이템 정보만 메모리에 로드

 2. 아이템 풀링

  • 자주 사용되는 아이템 위젯을 재사용

 3. 가상화 리스트

  • 대량의 아이템을 다룰 때 보이는 부분만 렌더링
Function: UpdateVisibleItems
[Get Scroll Position] --> [Calculate Visible Range]
                      --> [Update Visible Slots]

UI/UX 개선 팁

 1. 정렬 및 필터링

  • 아이템 타입, 희귀도 등으로 정렬 및 필터링 옵션 제공

 2. 컨텍스트 메뉴

  • 우클릭 시 사용, 장착, 버리기 등의 옵션 제공

 3. 퀵슬롯 연동

  • 자주 사용하는 아이템을 퀵슬롯에 할당 가능하게 구현

 4. 아이템 비교

  • 장비 아이템의 경우 현재 장착 아이템과 비교 기능 제공

예제 : 다목적 인벤토리 시스템

 다음은 여러 기능을 통합한 인벤토리 시스템의 구현 예시입니다.

Blueprint: BP_AdvancedInventoryManager
 
Variables:
- InventoryItems (Array of S_ItemData)
- EquippedItems (Map of E_EquipSlot to S_ItemData)
- MaxInventorySize (Integer)
- CurrentGold (Integer)
 
Functions:
- AddItem
- RemoveItem
- UseItem
- EquipItem
- UnequipItem
- SortInventory
- FilterInventory
- SaveInventoryState
- LoadInventoryState
 
Event Graph:
Event BeginPlay
    |
[Load Saved Inventory] --> [Initialize UI]
 
Event: On Item Dropped
    |
[Get Drop Location] --> [Spawn Item in World]
                    --> [Remove from Inventory]
 
Event: On Shop Opened
    |
[Load Shop Items] --> [Show Shop UI]
                  --> [Enable Trading Functions]

 이 고급 인벤토리 시스템은 기본적인 아이템 관리 기능뿐만 아니라, 장비 시스템, 상점 연동, 월드 아이템 스폰 등의 기능을 포함합니다.

추가 고려사항

 1. 네트워크 동기화

  • 멀티플레이어 게임의 경우 인벤토리 상태 동기화 구현

 2. 아이템 내구도

  • 장비 아이템의 경우 사용에 따른 내구도 감소 및 수리 시스템 구현

 3. 제작 시스템 연동

  • 인벤토리 아이템을 사용한 제작 시스템 구현

 4. 퀘스트 아이템 관리

  • 특별한 퀘스트 아이템에 대한 별도 관리 로직 구현

 5. 아이템 강화/인챈트

  • 아이템 속성 향상을 위한 강화 또는 인챈트 시스템 연동

 인벤토리 시스템은 게임의 핵심 메커니즘 중 하나로, 사용자 경험에 직접적인 영향을 미칩니다.

 따라서 기능성뿐만 아니라 사용 편의성과 시각적 매력도 중요하게 고려해야 합니다.

 초기에는 기본적인 기능으로 시작하여 점진적으로 고급 기능을 추가하는 것이 좋습니다.