이번에 추가한 기능은 바로 Inventory 기능 및 Item Ui 입니다.
개발 과정에서 발견한 문제점 및 개선
우선 이제까지 생각했던 설계가 다음과 같은 문제가 발생하여 잘못되었음을 판단했습니다.

| 항목 | 구버전(Khazan Project) | 신버전(Neverness) |
| InventoryComponent 위치 | KZCharacterPlayer에 직접 부착 | IHPlayerState에 부착 |
| 데이터 생존성 | Character 사망 시 소멸 | PlayerState는 살아있으므로 유지 |
| UI 생성 관리 | PlayerController의 BeginPlay()에서 생성 | HUD가 MainUiWidget 생성 |
| 인벤토리 열기 흐름 | Character의 내부에서 처리 | Character->Controller->HUD->UIWidget흐름으로 인벤토리 처리 |
| PlayerController 역할 | IMC 생성 및 UI Widget 생성 | UI 열기/닫기 및 InputMode변경, MouseCusror 제어 |
| HUD 역할 | 없음 | PlayerUIWidget 생성 및 OpenInventoryWidget() 담당 |
| 슬롯 초기화 | 매번 생성 방식 | Init_Slot()으로 미리 5x5 = 20개 생성 |
| UI 업데이트 방식 | 전체 재생성 | SlotArray 인덱스로 데이터만 교체 |
구현 결과

기능 구현 순서
기능 구현 순서는 다음과 같습니다.
1. Item Actor와 다른 Actor가 충돌했을 때, 먼저 ActorHasTag를 사용하여 충돌한 대상이 Player인지 확인했습니다.
이후 Player의 PlayerState에 접근하기 위해 OtherActor를 APawn 으로 Cast 하였습니다.
Cast가 완료되면 Pawn이 가지고 있는 PlayerState를 가져오고, PlayerState 내부에서 관리 중인
InventoryComponent에 접근하여 아이템을 추가하는 방식으로 구현했습니다.

DataTable을 활용한 아이템 데이터 관리

아이템의 이름, 설명, 이미지, 최대 중첩 개수, 아이템 타입과 같은 속성들은 DataTable 을 사용하여 관리 했습니다.
이를 통해 아이템 데이터를 코드에 직접 작성하지 않고 에디터에서 수정할 수 있으며, 새로운 아이템이 추가되더라도 DataTable에 Row를 추가하는 방식으로 쉽게 확장할 수 있게 구현했습니다.
아이템 획득 시에는 RowName을 기준으로 인벤토리에 아이템을 추가하고, 이후 UI에서는 해당 RowName을 통해 DataTable의
정보를 참조하여 아이템 정보를 표시하도록 구성했습니다.
2. Item, Inventory UI 구현



인벤토리의 UI는 단순히 슬롯을 화면에 배치하는 것 뿐만 아니라, 실제 인벤토리 데이터와 연결되어야 했습니다.
처음에는 슬롯마다 직접 이미지를 넣는 방식도 생각했지만, 이 방식은 아이템이 추가되거나 변경될 때 마다
UI를 직접 수정해야 하므로 유지보수에 좋지 않다고 판단했습니다.
그래서 인벤토리 UI는 아이템 데이터를 직접 소유하기 보다는, 인벤토리 컴포넌트가 가지고 있는 데이터를 읽어와
표시하는 역할을 담당하도록 했습니다.

개발 중 겪은 문제점과 학습한 내용
인벤토리 슬롯과 아이템 획득 기능을 구현하면서 단순히 아이템을 추가하는 것뿐만 아니라, 아이템 데이터를 어디서 관리할지, UI 슬롯과 어떻게 연동할지, PlayerState와 Component 구조를 어떻게 나눌지에 대해 여러 고민이 있었습니다.
처음에는 기능이 동작하는 것에만 집중했지만, 구현을 진행하면서 데이터 관리 방식과 클래스 간 역할 분리가 중요하다는 것을 느끼게 되었습니다.
1. PlayerState 접근 방식에 대한 이해 부족
아이템 Actor에서 플레이어의 인벤토리에 접근하기 위해 PlayerState를 가져와야 했습니다.
하지만 처음에는 일반 Actor에서 바로 GetPlayerState()를 호출하려고 했고, 이 과정에서 nullptr이 발생했습니다.
GetPlayerState()는 기본적으로 APawn 또는 AController 쪽에서 접근하는 함수이기 때문에, 아이템 Actor에서 바로 사용할 수 있는 구조가 아니었습니다.
그래서 충돌한 OtherActor를 먼저 APawn으로 캐스팅한 뒤, 해당 Pawn을 통해 PlayerState를 가져오는 방식으로 수정했습니다.

2. 아이템 데이터를 코드가 아닌 DataTable로 관리
처음에는 아이템 이름이나 이미지 같은 정보를 코드에서 직접 설정하는 방식도 생각했습니다.
하지만 아이템 종류가 늘어날수록 코드가 복잡해지고, 새로운 아이템을 추가할 때마다 C++ 코드를 수정해야 하는 문제가 생길 수 있다고 판단했습니다.
그래서 아이템의 이름, 설명, 이미지, 최대 중첩 개수, 아이템 타입과 같은 정보는 DataTable을 통해 관리하도록 변경했습니다.
이 방식으로 구현하면 코드에서는 RowName만 기준으로 아이템을 구분하고, 실제 아이템 정보는 DataTable에서 가져올 수 있습니다.

마무리
이번 작업에서는 아이템 획득부터 인벤토리 데이터 저장, 슬롯, UI 표시까지 이어지는 기본적인 인벤토리 시스템을 구현했습니다.
구현 과정에서 가장 중요하게 생각한 부분은 아이템 데이터, 인벤토리 로직, UI 표시를 각각 분리하는 것이 있었습니다.
이를 통해 아이템이 추가되더라도 DataTable을 수정하는 방식으로 확장할 수 있고, 인벤토리 UI 역시 데이터 기반으로 갱신할 수 있는 구조를 만들 수 있었습니다.
아직 아이템 사용,장착,버리기,슬롯 이동 같은 기능은 추가되지 않았지만, 이번 구조를 기반으로 이후 기능들을 확장해 나갈 수 있을 것 같습니다.
'Unreal Project > 이환 모작 포토폴리오 개발일지' 카테고리의 다른 글
| [개발일지] 이환 모작_03 Stamina Animation 및 InterAction Ui 구현 (0) | 2026.05.14 |
|---|---|
| [개발일지] 이환 모작_02 ( Hp Bar Widget ) (0) | 2026.05.08 |
| [개발일지] 이환 모작_01 ( Character, GameMode, PlayerController) (2) | 2026.04.30 |