Как окончательно сохранить ассет Scriptable object в Unity3d?

129
18 апреля 2022, 08:20

В моей игре есть ассет со статистикой. В течение одной сессии всё работает прекрасно, данные спокойно перетекают по сценам. НО! Стоит выключить игру, как все данные сбрасываются к дефолтным.

Может кто-нибудь подсказать, как мне, блин, сохранить это по нормальному?

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using UnityEngine.SceneManagement;

public class SaveLoad: MonoBehaviour
{
    [SerializeField] public Profile profile;
    public string Nickname;
    public int numNoobGames;
    public int noobScore;
    public int noobCombo;
    public int noobDeaths;
    public int numMidGames;
    public int midScore;
    public int midCombo;
    public int midDeaths;
    public int numProGames;
    public int proScore;
    public int proCombo;
    public int proDeaths;
    [SerializeField] public Themes themes;
    public int colorNumber;
    private void Start() {
        Nickname =         profile.Nickname;
        numNoobGames =     profile.numNoobGames;
        noobScore =        profile.noobScore;
        noobCombo =        profile.noobCombo;
        noobDeaths =       profile.noobDeaths;
        numMidGames =      profile.numMidGames;
        midScore =         profile.midScore;
        midCombo =         profile.midCombo;
        midDeaths =        profile.midDeaths;
        numProGames =      profile.numProGames;
        proScore =         profile.proScore;
        proCombo =         profile.proCombo;
        proDeaths =        profile.proDeaths;
        colorNumber =      themes.colorNumber;
        if(SceneManager.GetActiveScene().name == "Main"){
            LoadGame();
        }
    }
    public void SaveGame(){
        SaveData sv = new SaveData();
        sv.SaveGame();
    }
    public void LoadGame(){
        SaveData sv = new SaveData();
        sv.LoadGame();
    }    
    public void LoadData(){
        profile.Nickname =         Nickname;
        profile.numNoobGames =     numNoobGames;
        profile.noobScore =        noobScore;
        profile.noobCombo =        noobCombo;
        profile.noobDeaths =       noobDeaths;
        profile.numMidGames =      numMidGames;
        profile.midScore =         midScore;
        profile.midCombo =         midCombo;
        profile.midDeaths =        midDeaths;
        profile.numProGames =      numProGames;
        profile.proScore =         proScore;
        profile.proCombo =         proCombo;
        profile.proDeaths =        proDeaths;
    }
    public void ResetData(){
        SaveData sv = new SaveData();
        sv.ResetData();
    }
}

[Serializable]
class SaveData
{
    public string Nickname;
    public int numNoobGames;
    public int noobScore;
    public int noobCombo;
    public int noobDeaths;
    public int numMidGames;
    public int midScore;
    public int midCombo;
    public int midDeaths;
    public int numProGames;
    public int proScore;
    public int proCombo;
    public int proDeaths;
    public int colorNumber;
    public void SaveGame(){
        BinaryFormatter bf = new BinaryFormatter();
        FileStream file = File.Create("D:/UDocuments/hc/Save/MySave.dat");
       
        SaveLoad sl = new SaveLoad();
        SaveData data = new SaveData();
        
        data.Nickname =       sl.Nickname;
        data.numNoobGames =   sl.numNoobGames;
        data.noobScore =      sl.noobScore;
        data.noobCombo =      sl.noobCombo;
        data.noobDeaths =     sl.noobDeaths;
        data.numMidGames =    sl.numMidGames;
        data.midScore =       sl.midScore;
        data.midCombo =       sl.midCombo;
        data.midDeaths =      sl.midDeaths;
        data.numProGames =    sl.numProGames;
        data.proScore =       sl.proScore;
        data.proCombo =       sl.proCombo;
        data.proDeaths =      sl.proDeaths;
        data.colorNumber =    sl.colorNumber;
        
        bf.Serialize(file, data);
        file.Close();
        Debug.Log("Save complete");
    }
    public void LoadGame(){
        if(File.Exists("D:/UDocuments/hc/Save/MySave.dat")){
            Debug.Log("File find!");
            BinaryFormatter bf = new BinaryFormatter();
            FileStream file = File.Open("D:/UDocuments/hc/Save/MySave.dat",FileMode.Open);
            SaveData data = (SaveData)bf.Deserialize(file);
            SaveLoad sl = new SaveLoad();
            sl.Nickname =     data.Nickname;
            sl.numNoobGames = data.numNoobGames;
            sl.noobScore =    data.noobScore;
            sl.noobCombo =    data.noobCombo;
            sl.noobDeaths =   data.noobDeaths;
            sl.numMidGames =  data.numMidGames;
            sl.midScore =     data.midScore;
            sl.midCombo =     data.midCombo;
            sl.midDeaths =    data.midDeaths;
            sl.numProGames =  data.numProGames;
            sl.proScore =     data.proScore;
            sl.proCombo =     data.proCombo;
            sl.proDeaths =    data.proDeaths;
            sl.colorNumber = data.colorNumber;
            file.Close();
            sl.LoadData();
            Debug.Log("File load!");
        }
    }

    public void ResetData(){
        if(File.Exists("D:/UDocuments/hc/Save/MySave.dat")){
            File.Delete("D:/UDocuments/hc/Save/MySave.dat");
            SaveLoad sl = new SaveLoad();
            sl.numNoobGames = 0;
            sl.noobScore =    0;
            sl.noobCombo =    0;
            sl.noobDeaths =   0;
            sl.numMidGames =  0;
            sl.midScore =     0;
            sl.midCombo =     0;
            sl.midDeaths =    0;
            sl.numProGames =  0;
            sl.proScore =     0;
            sl.proCombo =     0;
            sl.proDeaths =    0;
            Debug.Log("File delet!");
        }
    }
}

Answer 1

ScriptableObject это способ хранения, а не сохранения и загрузки. Сериализация не так работает.

Вам нужно представление SaveData в виде Json и сохранить через PlayerPrefs.SetString().

READ ALSO
BackgroundService не может корректно завершиться

BackgroundService не может корректно завершиться

Не могу понять, почему мой BackgroundService (NET Core 3

164
C# переписать строку в файле

C# переписать строку в файле

Пользователь создаёт запись в файлеДалее, если нужно, он может переписать нужную запись

141
Вопрос по синтаксису вызова делегата в c# [дубликат]

Вопрос по синтаксису вызова делегата в c# [дубликат]

В общем, имеются в программе события, одно из них-CollectionCountChanged, которое генерируется функцией OnCollectionCountChanged:

123
Как переписать данные файла

Как переписать данные файла

Формат содержимого файла: дата,фамилия сотрудника,кол-во часов роботы,проделанная работа

182