Не работает скрипт сохранения

    public double BuyForCoins;

    public TMP_Text BuyForCoinstext;
    public MasterSc coin;
    public ZoomPan ZoomPan;
    public GameObject PanelBuy;
    public GameObject CloseZavod;
    public static DataBasePanel dataBasePanel;
    [SerializeField]
    private string dataName;

    public void Start()
    {
        if (string.IsNullOrEmpty(dataName)) dataName = gameObject.name;

        if (dataBasePanel == null) dataBasePanel = DataBasePanel.Load();
       
        Save();
    }
    public void Update()
    {
        BuyForCoinstext.text = "" + BuyForCoins.ToString("F0");
    }
    
    public void Buy()
    {

        if (coin.Coin >= BuyForCoins)
        {

            coin.Coin -= BuyForCoins;
            PanelBuy.SetActive(false);
            Destroy(PanelBuy);
            Destroy(CloseZavod);

            ZoomPan.enabled = true;
        }
        Save();
    }
    private void Save()
    {
        
        DataBasePanel.Save(dataBasePanel);
    }
}
[System.Serializable]
public class DataBasePanel
{
   
    public static void Save(DataBasePanel data)
    {
        BinaryFormatter binaryFormatter = new BinaryFormatter();

        FileStream stream = new FileStream(Application.persistentDataPath + "/Panelbuy.bin", FileMode.Create);

        binaryFormatter.Serialize(stream, data);

        stream.Dispose();
        stream.Close();
    }

    public static DataBasePanel Load()
    {
        if (File.Exists(Application.persistentDataPath + "/Panelbuy.bin"))
        {

            BinaryFormatter binaryFormatter = new BinaryFormatter();

            FileStream stream = new FileStream(Application.persistentDataPath + "/Panelbuy.bin", FileMode.OpenOrCreate);

            DataBasePanel database = binaryFormatter.Deserialize(stream) as DataBasePanel;

            stream.Dispose();
            stream.Close();

            return database;
        }
        else
        {
            return new DataBasePanel();
        }
    }
}

Так а не работает как именно, выдает какие-то ошибки или что?


При выкладывании кода надо нажимать кнопку Код.

Ошибки не выдает, просто не сохраняет

Может сохраняет, но не загружает?)

Panelbuy.bin создается?

Кстати, про это забыл, да, создается. Как сделать загрузку теперь?)

Определить вызывается ли это

и сама загрузка внутри Load, с помощью отладчика или отладочного вывода.
Unity - Scripting API: Debug.Log
http://blog.algoprog.ru/how-to-debug-small-programs/

проверил, все работает, мне кажется все-таки проблема в переменных GameObject’ах

А сохраняется-то что? В классе DataBasePanel тут нет никаких свойств.

По сути, ну как я думал все что происходит тут

BinaryFormatter сохраняет тот объект, что ему передан.

Не подскажешь, как именно эти переменные передать в виде кода?)

Хранить данные для сохранения в отдельном объекте, передавать его BinaryFormatter.

Как тут Using BinaryFormatter in Unity to Save and Load Game Data – Digital Ephemera

Еще такой вопрос, я понял как сохраняют GameObject, через Position обычно, но если есть функция Destroy(GameObject), и мне нужно сохранить именно уничтожение объекта, то есть ли смысл сохранять объект через его позицию?

Сохраняют то, что надо сохранить.
Тут, например, позиция, поворот, патроны, состояние и т.д. (состояние воина — стоит/идет/атакует/умер/…).

Так с уничтоженным объектом же нельзя работать ) Юнити ошибку выдаст если попытаться обратиться к свойствам уничтоженного объекта.

Ну точнее оно не совсем сразу уничтожает, но все равно уничтожение нужно только для случаев когда объект больше не нужен в программе.

Так что можно например

  • Не уничтожать, а просто помечать как уничтоженный с помощью какого-нибудь своего отдельного свойства. Заодно можно сделать отображение уничтоженных/убитых объектов в игре.

или

  • Создавать только сохраненные объекты при загрузке сохранения (ну или уничтожать все остальные).

То есть можно перевести в объект в bool и сохранять уже эту переменную?

Да, но смотря как сделано сохранение/загрузка.

Если хранить всё сохраняемое в отдельных своих классах (как в туториале выше), то должно быть не сложно. Сделать в классе два свойства (позиция и уничтожен ли), и при загрузке проверять.

Как я понял, мне позиция не нужна
Могу ли я создать переменную bool и в старте написать bool = true;
а в public void Buy if(Destroy(GameObject)){bool = false};
И сохранять именно значение bool?

Что именно вы пытаетесь сохранить-то?

У меня уничтожаются объекты при нажатии кнопки, при новом запуске они остаются, мне же нужно чтобы их не было

какие объекты?

при запуске чего?