🧠 오늘의 핵심 정리
- fix: 인벤토리 슬롯 줄이기 + 인벤 토글 입력(Tab) 연결
- 아이템 관련 Enum을 EnumTypes로 분리해서 프로젝트 전반에서 재사용 가능하게 정리
- feat: json 아이템 읽어오기 (무기/방어구/소비) → ScriptableObject 자동 생성 툴 추가
- Equipment 시스템 추가 + 인벤토리에서 장착 시 장비창으로 이동하는 흐름 연결
- feat: 아이템 이미지 넣음 (임시로 랜덤 적용, 추후 에셋 정리 예정) + 버튼 눌림 문제 수정
- ItemDataCreator Editor 폴더로 이동 + 프리팹화 작업 진행
🧩 인벤토리 품질 개선 (슬롯/입력/Enum 정리)
오늘은 인벤토리 기능을 조금 더 “게임처럼” 보이게 다듬는 작업부터 시작했습니다.
기존에는 UIManager에서 인벤토리 패널이 시작하자마자 켜져 있었는데, 실제 플레이 흐름에서는 기본 비활성 → 필요할 때 열기가 자연스러워서 기본 상태를 꺼두고, Tab 입력으로 토글되도록 붙였습니다.
UIManager.cs - Tab으로 인벤토리 토글
void Start()
{
inventoryPanel.SetActive(false);
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Tab))
{
ToggleInventory();
}
}
그리고 UIManager는 기존의 직접 싱글톤 구현을 걷어내고 Singleton<UIManager>를 상속받는 형태로 정리했습니다. 이제부터 다른 UI도 붙을 텐데, 이런 부분은 초반에 깔끔하게 정리해두는 게 확실히 낫다고 느꼈습니다.
📦 EnumTypes로 아이템 Enum 분리
초기에 ItemData.cs 안에 enum들을 다 넣어두었는데, 프로젝트가 커질수록 여러 곳에서 참조하게 되다 보니 EnumTypes 네임스페이스로 옮겨서 공용으로 관리하도록 바꿨습니다.
Enums.cs - Item 관련 Enum 추가
namespace EnumTypes
{
public enum ItemType { Weapon, Armor, Consumable }
public enum WeaponType { Melee, Ranged }
public enum ItemGrade { Normal, Rare, Epic, Unique }
public enum EquipSlotType { None, Head, Body, Arm, Leg, Weapon }
public enum DoubleClickAction { None, Use, Equip }
}
그에 맞춰 Inventory.cs / ItemData.cs에서도 using EnumTypes;로 참조하도록 수정했습니다. 작은 정리지만, 이런 게 쌓이면 나중에 유지보수할 때 정말 편해지는 것 같습니다.
⚔️ Equipment 시스템 추가 + 인벤토리 장착 흐름 연결
장비창까지 엮으려면 결국 “인벤토리에서 장착”이 자연스럽게 이어져야 해서, Equipment.cs를 새로 만들고 장착/해제 흐름을 먼저 붙였습니다.
장착 아이템은 EquipSlotType 기준 Dictionary로 관리해서 “같은 부위에 또 장착하면 교체”가 가능하도록 구현했습니다.
Equipment.cs - 장착/교체/해제
private Dictionary<EquipSlotType, Item> equippedItems
= new Dictionary<EquipSlotType, Item>();
public bool EquipItem(Item item)
{
if (!item.data.IsEquipable) return false;
```
EquipSlotType slot = item.data.EquipSlotType;
if (slot == EquipSlotType.None) return false;
if (equippedItems.ContainsKey(slot))
{
inventory.AddItem(equippedItems[slot].data, equippedItems[slot].currentAmount);
equippedItems[slot].IsEquipped = false;
equippedItems[slot] = item;
item.IsEquipped = true;
}
else
{
equippedItems.Add(slot, item);
item.IsEquipped = true;
}
OnEquipmentChanged?.Invoke();
return true;
```
}
인벤토리의 UseItem도 더블클릭 액션 기반에서 “아이템 타입” 기반으로 정리했습니다. 소비 아이템이면 사용(수량 감소), 무기/방어구면 장착 처리로 분기되도록 수정했습니다.
Inventory.cs - 아이템 타입 기반 사용/장착 분기
public void UseItem(Item item)
{
if (item.data.ItemType == ItemType.Consumable)
{
item.currentAmount--;
if (item.currentAmount <= 0)
RemoveItem(item);
}
else if (item.data.ItemType == ItemType.Weapon || item.data.ItemType == ItemType.Armor)
{
Equipment equipment = FindObjectOfType<Equipment>();
if (equipment != null)
{
bool isEquip = equipment.EquipItem(item);
if (isEquip)
RemoveItem(item);
}
}
OnInventoryChanged?.Invoke();
}
여기서 중요한 포인트는, EquipItem이 성공했을 때만 인벤에서 제거되도록 bool 반환으로 바꾼 부분입니다. 이렇게 해두면 “장착 실패했는데 인벤에서 사라지는” 최악의 상황을 막을 수 있어서 안정성이 좋아졌습니다.
🖥️ UIEquipment 추가 (장비 UI 표시 + 클릭 해제)
장비 UI도 같이 추가했습니다. 각 슬롯(머리/몸/팔/다리/무기)에 해당하는 Image를 Dictionary로 묶어두고, 장비 변경 이벤트가 오면 한 번에 갱신되도록 구성했습니다.
또 슬롯 버튼을 눌렀을 때는 바로 UnEquip 되도록 연결해서, 장착/해제 흐름이 UI까지 이어지게 만들었습니다.
UIEquipment.cs - 버튼 클릭으로 해제
headBtn.onClick.AddListener(() => OnClickUnEquip(EquipSlotType.Head));
bodyBtn.onClick.AddListener(() => OnClickUnEquip(EquipSlotType.Body));
armBtn.onClick.AddListener(() => OnClickUnEquip(EquipSlotType.Arm));
legBtn.onClick.AddListener(() => OnClickUnEquip(EquipSlotType.Leg));
weaponBtn.onClick.AddListener(() => OnClickUnEquip(EquipSlotType.Weapon));
public void OnClickUnEquip(EquipSlotType type)
{
equipment.UnEquipItem(type);
}
📄 feat: JSON 아이템 읽어오기 (SO 자동 생성 툴)
오늘 작업 중에서 제일 “와 드디어 게임 개발 느낌 난다” 싶었던 부분은 이거였습니다.
무기/방어구/소비 아이템 데이터를 JSON으로 받아서, ScriptableObject(ItemData)를 자동 생성하는 Editor 툴을 만들었습니다. 이제 수작업으로 아이템을 하나씩 만들지 않아도 되는 방향이 생긴 느낌이었습니다.
Json 데이터 클래스 추가
[System.Serializable]
public class WeaponJsonData { /* ... */ }
[System.Serializable]
public class ArmorJsonData { /* ... */ }
[System.Serializable]
public class ConsumableJsonData { /* ... */ }
ItemData.cs - JSON 데이터를 ItemData로 세팅
public void SetWeaponData(WeaponJsonData weapon)
{
itemId = weapon.ItemID;
itemName = weapon.ItemName;
grade = (ItemGrade)weapon.ItemGrade;
itemType = (ItemType)weapon.ItemType;
canMultiHit = weapon.CanMultiHit == "TRUE";
itemDamage = weapon.ItemDamage;
itemAttackSpeed = weapon.ItemAttackSpeed;
attackRange = weapon.ItemAttackRange;
durability = weapon.Durability == "null" ? 0 : int.Parse(weapon.Durability);
maxStack = weapon.InventoryMaxStack;
attackSoundRange = weapon.AttackSoundRange;
isEquipable = true;
weaponType = (WeaponType)weapon.WeaponType;
equipSlotType = (EquipSlotType)weapon.EquipSlotType;
}
ItemDataCreator - JSON → SO 생성
[MenuItem("Tool/Create Weapon Items From JSON")]
public static void CreateItems()
{
TextAsset jsonFile = Resources.Load<TextAsset>("AtkItemDataProto");
WeaponJsonDataList weaponDataList = JsonUtility.FromJson<WeaponJsonDataList>(jsonFile.text);
```
foreach (var weapon in weaponDataList.items)
{
ItemData item = ScriptableObject.CreateInstance<ItemData>();
item.name = weapon.ItemName;
item.SetWeaponData(weapon);
AssetDatabase.CreateAsset(item, $"Assets/05_Prefabs/Items/Weapons/{weapon.ItemName}.asset");
}
// Armor, Consumable도 동일 흐름...
AssetDatabase.SaveAssets();
```
}
그리고 ItemDataCreator 파일은 Editor 폴더로 이동시켜서, 빌드에 포함되지 않도록 정리했습니다. 이런 작은 습관이 나중에 프로젝트 커졌을 때 진짜 중요해지는 것 같습니다.
🖼️ 아이템 이미지(아이콘) 임시 적용 + 버튼 눌림 수정
아이템이 텍스트로만 보이면 재미가 너무 없어서, 오늘은 아이콘 이미지도 넣기 시작했습니다.
다만 아직 에셋이 완전히 정리된 상태가 아니라서, 무작위로 임시 아이콘을 넣어둔 상태이고 추후에 실제 에셋을 찾아서 제대로 교체할 예정입니다.
그리고 UI 쪽에서 텍스트 버튼이 의도치 않게 눌리는 문제도 같이 수정했습니다. 이런 자잘한 UX 문제는 초반에 잡아두는 게 정신 건강에 좋습니다… (진짜루요)
📌 오늘의 회고
오늘은 “인벤토리만 만들기”에서 끝나는 게 아니라, 장비 시스템 + 데이터 파이프라인(JSON → SO)까지 연결되면서 작업 범위가 확 커졌습니다.
특히 JSON 기반으로 아이템을 찍어낼 수 있게 되니까, 앞으로 콘텐츠가 늘어나도 “노가다로 SO 만들기”에 시간을 빼앗기지 않을 것 같아서 정말 마음이 놓였습니다.
이제 남은 건… 결국 제가 걱정하던 그거입니다. 드래그 앤 드롭으로 인벤/장비/퀵슬롯/드롭창을 전부 엮는 것…
오늘처럼 기반을 탄탄하게 깔아두면 다음 단계에서도 덜 흔들릴 거라고 믿고, 내일도 차근차근 이어가보려고 합니다.
'내일배움캠프 본캠프' 카테고리의 다른 글
| [내일배움캠프 47일차 TIL] 프로토타입 5일차 '대사창 리팩토링' (0) | 2025.12.04 |
|---|---|
| [내일배움캠프 46일차 TIL] 프로토타입 4일차 '대사창' (0) | 2025.12.03 |
| [내일배움캠프 44일차 TIL] 프로토타입 2일차 '인벤토리 시작' (0) | 2025.12.01 |
| [내일배움캠프 43일차 TIL] 프로토타입 1일차 '팀 편성' (0) | 2025.11.28 |
| [내일배움캠프 42일차 TIL] 인벤토리 완성 (0) | 2025.11.27 |