После загрузки из файла json все объекты scriptableobject в главном объекте scriptableobject отсутствуют

#c# #unity3d

Вопрос:

У меня есть сценарий объекта для моего инвентаря, который сохраняет там некоторые товары. Товары тоже являются объектами сценариев, и они не меняются.

Сценарий инвентаризации:

 public class InventoryList : ScriptableObject 
{
    public List<KeyObject> keys;
    public List<HealthPotion> healingGoods;
    public List<ScrollObject> scrolls;

    private string path {
        get { return Application.persistentDataPath   @"/Inventory.IO"; }
    } 

    public void Save() {
        string json = JsonUtility.ToJson(this);
        File.WriteAllText(path, json);
    }

    public void Load() {
        string json = File.ReadAllText(path);
        JsonUtility.FromJsonOverwrite(json, this);
    }
}
 

Сценарий лечебного зелья:

 public class HealthPotion : ScriptableObject, IItemsCollect 
{
    [SerializeField] private InventoryList InventoryList;
    [SerializeField] private Sprite Sprite;
    [SerializeField] private string Description;
    [SerializeField] private int Cost = 200;
    private bool willdestroy { get; set; }

    bool IItemsCollect.DestroyOnUse => willdestroy;
    string IItemsCollect.Description => Description;
    int IItemsCollect.Cost => Cost;
    Sprite IItemsCollect.Sprite => Sprite;

    public void AddToInventoryList() {
        InventoryList.healingGoods.Add(this);
        InventoryList.Save();
    }

    public void Use(SpiritController spiritController, ControllerCanvas controllerCanvas) {
        willdestroy = spiritController.HealthAdd();
        if (willdestroy) {
            InventoryList.healingGoods.Remove(this);
            InventoryList.Save();
        }
    }
}
 

Ключевой сценарий:

 public class KeyObject : ScriptableObject, IItemsCollect 
{
    [SerializeField] private InventoryList InventoryList;
    [SerializeField] private Sprite Sprite;
    [SerializeField] private string Description;
    [SerializeField] private int Cost = 400;

    public string KeyCode;

    bool IItemsCollect.DestroyOnUse => false;
    string IItemsCollect.Description => Description;
    int IItemsCollect.Cost => Cost;
    Sprite IItemsCollect.Sprite => Sprite;

    public void AddToInventoryList() {
        if (!InventoryList.keys.Contains(this)) {
            InventoryList.keys.Add(this);
            InventoryList.Save();
        }
    }

    public void Use(SpiritController spiritController, ControllerCanvas controllerCanvas) {
        return;
    }
}
 

Scroll script:

 public class ScrollObject : ScriptableObject, IItemsCollect 
{
    [SerializeField] private InventoryList InventoryList;
    [SerializeField] private Sprite Sprite;
    [SerializeField] private string Description;
    [SerializeField] private int Cost = 400;

    public string Text;
    public Sprite SpriteForScroll;

    bool IItemsCollect.DestroyOnUse => false;
    string IItemsCollect.Description => Description;
    int IItemsCollect.Cost => Cost;
    Sprite IItemsCollect.Sprite => Sprite;

    public void AddToInventoryList() {
        if (!InventoryList.scrolls.Contains(this)) {
            InventoryList.scrolls.Add(this);
            InventoryList.Save();
        }
    }

    public void Use(SpiritController spiritController, ControllerCanvas controllerCanvas) {
        if (SpriteForScroll != null) controllerCanvas.ShowScrollAndImage(SpriteForScroll);
        else controllerCanvas.ShowScrollAndText(Text);
    }
}
 

После сохранения у меня есть это:

Но если я перезапущу Unity и перезагрузю объект сценария инвентаризации, у меня будет это:

Я что-то не так делаю? Моя версия unity-2020.2.2 f.

Комментарии:

1. Привет. Вы пробовали использовать PlayerPrefs?

2. Вы не можете (де)сериализовать UnityEngine.Object ссылки! Вы не могли бы предоставить более подробную информацию о том , что именно KeyObject , HealthPotion и ScrollObject что именно, и почему они должны быть объектами сценариев?

3. Привет. Я пытался использовать PlayerPrefs, но мне нужно сохранить много данных, что проще с помощью скриптовых объектов

4. Я обновил вопрос и добавил еще один сценарий. Они должны быть объектами для сценариев, чтобы я мог сохранять их во время игры.

5. Я думаю, что ответ будет в файле json, который вы сохраняете и загружаете.