Unreal Engine 5 TPS Inventory

garden cho·2025년 8월 14일

링크

TPS 프로젝트의 도전 과제로 인벤토리 시스템을 직접 구현하였다.
본 시스템은 게임 아이템의 관리, 인벤토리 UI 연동, 장착·드랍·사용 기능을 포함하며, 유지보수와 확장성을 고려하여 데이터와 로직을 분리하였다.

Inventory
├─ Data
│  ├─ Armor
│  ├─ Attachment
│  └─ Item
├─ Component
│  ├─ InteractionComponent
│  ├─ InventoryComponent
│  └─ ItemDataComponent
└─ UI
   ├─ AttachmentSlot
   ├─ InteractionUI
   ├─ InventoryUI
   ├─ ItemSlotUI
   └─ ItemSlotPreview
Item
├─ InteractiveItem

Data

아이템의 종류와 속성을 정의하는 데이터 폴더

  • Armor: 방어구 데이터
  • Attachment: 부착물 데이터
  • Item: 일반 아이템 데이터

Component

아이템과 인벤토리의 상호작용 로직을 담당

  • InteractionComponent: 플레이어와 아이템 상호작용
  • InventoryComponent: 인벤토리 관리, 아이템 추가/삭제
  • ItemDataComponent: 아이템 데이터 처리

UI

인벤토리와 아이템 표시를 위한 위젯

  • InventoryUI: 메인 인벤토리
  • ItemSlotUI / AttachmentSlot: 아이템 슬롯 / 부착물 슬롯
  • InteractionUI: 아이템 상호작용 표시
  • ItemSlotPreview: 미리보기

이제 주요 기능들을 설명해보겠다.

아이템 줍기

  • Trace 기반 상호작용

  • SweepMultiByChannel()을 사용하여 캐릭터 정면 아이템 감지

  • 여러 오브젝트가 겹칠 수 있으므로 Single 대신 Multi 사용

  • 커스텀 채널을 생성하여 충돌 및 Trace 전용 채널로 활용

  • 가장 가까운 Actor를 우선 저장 후, 줍기 입력 시 해당 아이템과 상호작용

아이템

  • InteractiveItem 클래스에서 Mesh, Physics, Collision 세팅

  • ItemDataComponent를 추가하여 데이터 중심 구조 유지

  • 데이터 테이블을 FDataTableRowHandle로 참조

  • 아이템 수량(ItemQuantity) 지원 → 탄약과 같은 다량 아이템 처리 가능

  • 아이템 획득 시
    캐릭터 HitResult → ItemDataComponent 접근 → InventoryComponent에 전달

인벤토리

인벤토리 데이터 관리의 중심 클래스

담당 기능:

  • 아이템 추가 / 삭제 / 장착 / 해제

  • 인벤토리 정보 → UI 브로드캐스트

  • 아이템 드랍 시 → 월드에 Actor 스폰

  • 탄약(ItemType == Ammo)은 수량을 액터에 직접 반영

  • 인벤토리 변경 발생 시 → UpdateInventory() 호출 → 아이템 정렬 및 UI 갱신

인벤토리UI

InventoryUI 위젯이 메인 UI 역할

  • 인벤토리 변경 발생 시 UpdateInventory 브로드캐스트

아이템 갱신 시:

  • CreateItemSlots() 실행 → 현재 아이템 → WrapBox에 ItemSlotUI 생성

드래그·드랍 기능:

  • NativeOnDragDetected()로 드래그 감지

  • 마우스 포인터에 Preview 이미지 생성

  • 인벤토리 영역 밖으로 드랍 시 → DropFromInventory() 호출 → 인벤토리 삭제 + UI 갱신

방어구 및 부착물

인벤토리 UI 내에 전용 슬롯(Border + UserWidget) 구성

드래그 드랍 이벤트 감지 시:

  • 슬롯 위치에 포인터 진입 → 아이콘 변경

  • InventoryComponent에 장착 함수 호출 → 상태 갱신

다만, 아이템 종류를 한정적으로 설계하여 유연성이 부족했던 점이 아쉬움

기술적 의의

데이터 주도형 설계 (Data-driven design)

아이템 정보 → 데이터 테이블 관리

액터 클래스는 데이터 참조 및 로직 처리에 집중

UI – 로직 분리

  • InventoryComponent (로직) ↔ InventoryUI (표시) → 브로드캐스트 기반 동기화

확장성 고려한 구조화

폴더별 기능 분리로 모듈화 + 유지보수성 강화

개선 방향

방어구/부착물 구조를 열거형 기반으로만 처리 → 새로운 장비 카테고리 확장에 제약

개선 방안:

  • 아이템 타입 추상화 → EItemCategory + SubType 구조

  • 슬롯 매핑 시스템 도입 → 슬롯 타입과 아이템 카테고리를 매핑하여 동적 장착 허용

  • 데이터 테이블 확장을 통해 신규 아이템이 로직 수정 없이 반영 가능하도록 설계

0개의 댓글