@Kiryuha161

Как сделать, чтобы предметы в инвентаре сохранились от сессии к сессии?

Пытаюсь сделать так, чтобы от сессии к сессии сохранялись данные инвентаря, а точнее предметов в нём. Не получается. Что я делаю не так?

Вот код с предметами, они потом добавляются в инвентарь.
public class Items : MonoBehaviour
{
    public int[] DefenceItems = new int[] { 5, 10, 15, 20, 25 };
    public bool[] HasItems = new bool[] { false, false, false, false, false };
    public string[] NameItems = new string[] { "Bandit Pants", "Bulletproof cloak", "Bulletproof cloak Elbow", "Bulletproof cloak wrist", "Military Helmet" };
    public int[] Quantity = new int[] { 0, 0, 0, 0, 0 };
public GameObject Character;
    public Sprite[] Sprites;
    public ItemData ItemDataScript;
 
    [SerializeField]private List<ItemData> items = new List<ItemData>();
 
    private int _currentItem;
    private int _currentDefence;
private void Start()
    {
        ItemDataScript.LoadItems();
    }
    public void AddItem(int index)
    {
        HasItems[index] = true;
 
        if (HasItems[index])
        {
            Quantity[index]++;
        }
 
        ItemDataScript = new ItemData(NameItems[index], Quantity[index], DefenceItems[index], this);
        
        items.Add(ItemDataScript);
        items[index].SaveItems();
    }


Вот класс с данными

[System.Serializable]
    public class ItemData
    {
        public string Name;
        public int Quantity;
        public int Defence;
        public Items ItemScript;
        public ItemData(string name, int quantity, int defence, Items itemScript)
        {
            Name = name;
            Quantity = quantity;
            Defence = defence;
            ItemScript = itemScript;
        }

Сохранение
public void SaveItems()
        {
            for (int i = 0; i < ItemScript.HasItems.Length; i++)
            {
                if (ItemScript.HasItems[i])
                {
                    string name = ItemScript.NameItems[i];
                    int quantity = GetQuantity(name);
                    int defence = ItemScript.DefenceItems[i];
                    ItemData data = new ItemData(name, quantity, defence, ItemScript);
                    
                    ItemScript.items.Add(data);//
                }
            }
           
            string json = JsonUtility.ToJson(ItemScript.items);//
            File.WriteAllText(Path.Combine(Application.persistentDataPath, "items.json"), json);
        }

Загрузка
public void LoadItems()
        {
            ItemScript.items.Clear();//
            string filePath = Path.Combine(Application.persistentDataPath, "items.json");
 
            if (File.Exists(filePath))
            {
                string json = File.ReadAllText(filePath);
                
                ItemScript.items = JsonUtility.FromJson<List<ItemData>>(json);
 
                
                foreach(ItemData data in ItemScript.items)//
                {
                    int index = GetIndex(data.Name);
 
                    if (index != -1)
                    {
                        ItemScript.HasItems[index] = true;
                        SetQuantity(data.Name, data.Quantity);
                        Debug.Log("С индексом всё хорошо");
                    }
 
                    else
                    {
                        Debug.Log("Косяк с индексом");
                    }
                }
            }

То, что в цикле foreach не дебажится. В смысле в консоль ничего не попадает
Вот метод GetIndex
private int GetIndex(string name)
        {
            for (int i = 0; i < ItemScript.NameItems.Length; i++)
            {
                if (ItemScript.NameItems[i] == name)
                {
                    return i;
                }
            }
 
            return -1;


Выяснил, что файл json и pathFile почему-то при отладке пустые. Выводит только {}
  • Вопрос задан
  • 155 просмотров
Решения вопроса 1
GavriKos
@GavriKos Куратор тега Unity
Ну судя по всему ваш сериализатор json не умеет сериализовать чистый лист (кстати вроде это по стандарту).
Что можно сделать - заменить List на свой класс, с аттрибутом Serializable, и уже в нем держать List (так кстати намного лучше - потому что легче будет масштабировать в ситуации, когда вам в сейв надо писать что то помимо List).

Т.е. у вас должен быть класс ну например InventoryDataContainer, который вы будете сериализовать (и он с аттрибутом), и уже внутри этого класса будет List items
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы