상황 1. 상점에서 아이템을 구매후 저장후 종료
상황 2. 다시 실행후 인벤토리 가보면 아이템이 잘 불러와짐.
상황 3. 같은종류의 아이템을 사면 수량이 더해져야 하는데 새로운 슬롯에 동일 아이템이 사짐.
상황 4. 게임시작시 불러와졌던 아이템을 사용하면 사용이 안되고 새로 산 아이템은 정상 사용됨.
궁굼증 ) 인벤토리 저장후 불러와진 아이템은 인스펙터상에서 모든게 새로산 아이템과 동일한데 왜 다른 아이템처럼 취급이 되는건지.
그 불러와진 아이템은 존재만 하고 사용 기능등 완전 상실된 상태입니다 ㅠㅠ 미치겠네요 혹시몰라 스크립트 올려볼게요.
public void SaveData()
{
Data data = new Data();
data._playerName = NameFlip.instance.playerNameText.text;
data._feed = feed;
data._money = coins;
data._ext = exp;
data._korLanguage = korLanguage;
data._isBlueCap = isBlueCap;
data._isPlaying = isPlaying;
data._onPlayerNameMadePanel = onPlayerNameMadePanel;
// 인벤토리 저장
for (int i = 0; i < Inventory.instance.slots.Count; i++)
{
if (!Inventory.instance.slots[i].isEmpty)
{
data._item.Add(Inventory.instance.slots[i].item);
}
}
// 퀵슬롯 저장
for (int i = 0; i < AllQuickSlot.instance.quickSlots.Count; i++)
{
if (!AllQuickSlot.instance.quickSlots[i].isEmpty)
{
data._quickItem.Add(AllQuickSlot.instance.quickSlots[i].item);
}
}
string saveData = JsonUtility.ToJson(data);
File.WriteAllText(path, saveData);
}
public void LoadData()
{
string loadData = File.ReadAllText(path);
Data data = JsonUtility.FromJson<Data>(loadData);
NameFlip.instance.playerNameText.text = data._playerName;
feed = data._feed;
coins = data._money;
exp = data._ext;
korLanguage = data._korLanguage;
isBlueCap = data._isBlueCap;
isPlaying = data._isPlaying;
onPlayerNameMadePanel = data._onPlayerNameMadePanel;
for (int i = 0; i < Inventory.instance.slots.Count; i++)
{
if (i < data._item.Count)
{
Inventory.instance.GetItem(data._item[i], 0);
}
}
for (int i = 0; i < AllQuickSlot.instance.quickSlots.Count; i++)
{
if (i < data._quickItem.Count)
{
AllQuickSlot.instance.SetItem(data._quickItem[i], 0);
}
}
}
public class Inventory : MonoBehaviour
{
public static Inventory instance;
public List<InventorySlot> slots;
public SellItemInfo sellItemInfo;
public GameObject sellItemInfoPanel; // 판매 정보 패널
public GameObject inputQuickSlotPanel; // 퀵슬롯 장착 패널
public GameObject howManySell; // 몇개를 파시겠습니까 패널
public PutSlot putSlot;
private void Awake()
{
if (instance == null)
{
instance = this;
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(gameObject);
}
for (int i = 0; i < slots.Count; i++)
{
if (slots[i].isEmpty)
{
slots[i].gameObject.SetActive(false);
}
}
}
private void Update()
{
for (int i = 0; i < slots.Count; i++)
{
if (!slots[i].isEmpty && slots[i].item.itemCount == 0)
{
slots[i].ClearSlot();
slots[i].gameObject.SetActive(false);
}
}
for (int i = 0; i < slots.Count-1; i++)
{
if (slots[i].isEmpty && i + 1 < slots.Count && !slots[i+1].isEmpty)
{
slots[i].gameObject.SetActive(true);
slots[i].GetItem(slots[i+1].item, 0);
slots[i+1].ClearSlot();
slots[i+1].gameObject.SetActive(false);
return;
}
}
}
public void GetItem(Item _item, int _count)
{
for (int i = 0; i < slots.Count; i++)
{
if (slots[i].isEmpty)
{
slots[i].gameObject.SetActive(true);
slots[i].GetItem(_item, _count);
return;
}
if (!slots[i].isEmpty && slots[i].item == _item)
{
slots[i].item.itemCount += _count;
return;
}
}
}
public void SellItem(Item _item, int _count)
{
for (int i = 0; i < slots.Count; i++)
{
if (_item == slots[i].item && _item.itemCount > 0)
{
slots[i].item.itemCount -= _count;
if (slots[i].item.itemCount == 0)
{
slots[i].ClearSlot();
if (i + 1 < slots.Count && slots[i+1].isEmpty)
{
slots[i].gameObject.SetActive(false);
}
}
return;
}
}
}
public void OpenShopButton(GameObject _panel)
{
_panel.SetActive(true);
}
public void InventorySlotButton(int _index)
{
for (int i = 0; i < slots.Count; i++)
{
if (_index == i)
{
sellItemInfoPanel.SetActive(true);
inputQuickSlotPanel.SetActive(true);
howManySell.SetActive(true);
if (slots[_index].item.itemType != Item.ItemType.USE)
{
inputQuickSlotPanel.SetActive(false);
howManySell.SetActive(false);
}
if (slots[_index].item.itemType == Item.ItemType.EQUIP)
{
sellItemInfo.equippedPanel.SetActive(true);
sellItemInfo.slotIndex = _index;
}
sellItemInfo.GetItemInfo(slots[_index].item);
putSlot.GetItem(slots[_index].item);
return;
}
}
}
}
인벤토리에 아이템을 저장하기전에 구매한 아이템이 기존의 아이템과 동일한지 체크하는걸 넣은 뒤에 동일하면 아이템 갯수 변수만 수정하고 다르면 새 아이템 추가하는걸로 로직을 분리해서 작성하셔야죠
public void GetItem(Item _item, int _count) 혹시 이부분에 if (!slots[i].isEmpty && slots[i].item == _item) { slots[i].item.itemCount += _count; return; } 이걸론 안되는건가여.. 유니티 독학으로 배운지 얼마 안대서 이해력이 딸려요 ㅠ
코딩어려웡..
불러온 data._item이 추가할때 item이랑 다르게 인식되는거 같은데 아이템에 string 이나 고유 index값을줘서 if (!slots[i].isEmpty && slots[i].item == _item) 이 코드의 item == item 검사 부분을 다른 방식으로 해보셔요
답글 달아주신분들 너무 감사합니다. 일단 해결했습니다.