TPS 프로젝트의 도전 과제로 인벤토리 시스템을 직접 구현하였다.
본 시스템은 게임 아이템의 관리, 인벤토리 UI 연동, 장착·드랍·사용 기능을 포함하며, 유지보수와 확장성을 고려하여 데이터와 로직을 분리하였다.
Inventory
├─ Data
│ ├─ Armor
│ ├─ Attachment
│ └─ Item
├─ Component
│ ├─ InteractionComponent
│ ├─ InventoryComponent
│ └─ ItemDataComponent
└─ UI
├─ AttachmentSlot
├─ InteractionUI
├─ InventoryUI
├─ ItemSlotUI
└─ ItemSlotPreview
Item
├─ InteractiveItem
아이템의 종류와 속성을 정의하는 데이터 폴더
아이템과 인벤토리의 상호작용 로직을 담당
인벤토리와 아이템 표시를 위한 위젯
이제 주요 기능들을 설명해보겠다.

Trace 기반 상호작용
SweepMultiByChannel()을 사용하여 캐릭터 정면 아이템 감지
여러 오브젝트가 겹칠 수 있으므로 Single 대신 Multi 사용
커스텀 채널을 생성하여 충돌 및 Trace 전용 채널로 활용
가장 가까운 Actor를 우선 저장 후, 줍기 입력 시 해당 아이템과 상호작용

InteractiveItem 클래스에서 Mesh, Physics, Collision 세팅
ItemDataComponent를 추가하여 데이터 중심 구조 유지
데이터 테이블을 FDataTableRowHandle로 참조
아이템 수량(ItemQuantity) 지원 → 탄약과 같은 다량 아이템 처리 가능
아이템 획득 시
캐릭터 HitResult → ItemDataComponent 접근 → InventoryComponent에 전달
인벤토리 데이터 관리의 중심 클래스
담당 기능:
아이템 추가 / 삭제 / 장착 / 해제
인벤토리 정보 → UI 브로드캐스트
아이템 드랍 시 → 월드에 Actor 스폰
탄약(ItemType == Ammo)은 수량을 액터에 직접 반영
인벤토리 변경 발생 시 → UpdateInventory() 호출 → 아이템 정렬 및 UI 갱신

InventoryUI 위젯이 메인 UI 역할
아이템 갱신 시:
드래그·드랍 기능:
NativeOnDragDetected()로 드래그 감지
마우스 포인터에 Preview 이미지 생성
인벤토리 영역 밖으로 드랍 시 → DropFromInventory() 호출 → 인벤토리 삭제 + UI 갱신
인벤토리 UI 내에 전용 슬롯(Border + UserWidget) 구성
드래그 드랍 이벤트 감지 시:
슬롯 위치에 포인터 진입 → 아이콘 변경
InventoryComponent에 장착 함수 호출 → 상태 갱신
다만, 아이템 종류를 한정적으로 설계하여 유연성이 부족했던 점이 아쉬움

데이터 주도형 설계 (Data-driven design)
아이템 정보 → 데이터 테이블 관리
액터 클래스는 데이터 참조 및 로직 처리에 집중
UI – 로직 분리
확장성 고려한 구조화
폴더별 기능 분리로 모듈화 + 유지보수성 강화
방어구/부착물 구조를 열거형 기반으로만 처리 → 새로운 장비 카테고리 확장에 제약
개선 방안:
아이템 타입 추상화 → EItemCategory + SubType 구조
슬롯 매핑 시스템 도입 → 슬롯 타입과 아이템 카테고리를 매핑하여 동적 장착 허용
데이터 테이블 확장을 통해 신규 아이템이 로직 수정 없이 반영 가능하도록 설계