인벤토리/퀵슬롯 시스템 개발

This commit is contained in:
2026-01-18 15:54:42 +09:00
parent 9b13f439e3
commit bbd156ac03
21 changed files with 905 additions and 152 deletions

View File

@@ -97,9 +97,7 @@ public class DroppedItem : NetworkBehaviour, IInteractable
if (playerObj.TryGetComponent<PlayerInventory>(out var inventory))
{
_isProcessed = true;
ItemData data = ItemDatabase.Instance.GetItemByID(_itemDataID.Value);
inventory.AddItem(data); // 인벤토리에 추가
inventory.AddItemRpc(_itemDataID.Value, 1); // 인벤토리에 추가
// 3. 획득 성공 시 네트워크 상에서 제거합니다.
GetComponent<NetworkObject>().Despawn();

View File

@@ -5,7 +5,9 @@ public class ItemData : ScriptableObject
{
public int itemID;
public string itemName;
public Sprite icon;
public Sprite icon;
public float weight; // 아이템 개당 무게
public int maxStack = 99; // 최대 중첩 개수
[Header("Visual Source")]
public GameObject originalBlockPrefab; // 이제 이것만 있으면 됩니다!

View File

@@ -1,12 +1,46 @@
using UnityEngine;
using System.Collections.Generic;
public class ItemDatabase : MonoBehaviour
[CreateAssetMenu(menuName = "Inventory/Item Database")]
public class ItemDatabase : ScriptableObject
{
public static ItemDatabase Instance;
private static ItemDatabase _instance;
// 전역 어디서든 접근 가능한 Instance 프로퍼티
public static ItemDatabase Instance
{
get
{
if (_instance == null)
{
// Resources 폴더 안에 있는 "ItemDatabase"라는 이름의 파일을 찾습니다.
_instance = Resources.Load<ItemDatabase>("ItemDatabase");
if (_instance == null)
{
Debug.LogError("ItemDatabase 에셋을 찾을 수 없습니다! Resources 폴더 안에 이름이 'ItemDatabase'인 에셋이 있는지 확인하세요.");
}
}
return _instance;
}
}
public List<ItemData> allItems;
private Dictionary<int, ItemData> _itemCache;
void Awake() => Instance = this;
public ItemData GetItemByID(int id)
{
if (_itemCache == null) InitCache();
return _itemCache.GetValueOrDefault(id);
}
public ItemData GetItemByID(int id) => allItems.Find(x => x.itemID == id);
private void InitCache()
{
_itemCache = new Dictionary<int, ItemData>();
foreach (var item in allItems)
{
if (item != null)
_itemCache[item.itemID] = item;
}
}
}