首页 > 解决方案 > 试图建立一个保存/加载系统,需要帮助将值从一个类加载到另一个

问题描述

所以我正在保存和加载特定类的值。我正在调用保存值并使用它们的类。但是由于某种原因,当值被加载到保存值的类中时,调用具有值的类的类不会获得这些值。如何解决这个问题?

检查是否加载了值,它们是(显示在 SaveSystem 类中) 检查是否在 Shop 类中接收到值,它们不是(显示)

public class AllData {
    public double bucketProg;
    public double milk;
    public double totalMilk;
    public double milkPrice;
    public double totalClicks;
    public double coins;
    public double totalCoins;
    public double upgradeBucketCost = 10;
    public double qualityMilkCost = 1000;
    public double BucketLevel = 1;
    public double milkLevel = 1;
    public double multiplier = 1;
}

public class SaveSystem {
    AllData allData = new AllData();
    public void Save(AllData allData) {

        BinaryFormatter bf = new BinaryFormatter();
        FileStream file = new FileStream(Application.persistentDataPath + "/allData.hey", FileMode.Create);
        bf.Serialize(file, allData);
        file.Close();
    }
    public void Load() {

        if (File.Exists(Application.persistentDataPath + "/allData.hey")) {

            BinaryFormatter bf = new BinaryFormatter();
            FileStream file = File.Open(Application.persistentDataPath + "/allData.hey", FileMode.Open);
            allData = (AllData) bf.Deserialize(file);
            file.Close();
            //here I made sure to check if the data is being loaded, which it did
            Debug.Log(allData.milk);

        }

    }

}

public class Shop: MonoBehaviour {
    AllData allData = new AllData();
    private SaveSystem saveSystem = new SaveSystem();

    public Text milkText;

    public void Start() {
        saveSystem.Load();
    }

    public void Update() { 
        //output is 0
        milkText.text = allData.milk;
        saveSystem.Save(this.allData);
    }

}

标签: c#unity3d

解决方案


似乎问题是您忘记标记AllDataSystem.Serializable;
此外,使Load函数返回AllData已加载的函数。

经过一些修改,我最终测试了它,它似乎可以工作。
(在 上测试过Unity 2019.1.12f1

这是我用来测试的代码

商店.cs

public class Shop : MonoBehaviour {
    AllData allData = new AllData();
    private SaveSystem saveSystem = new SaveSystem();

    public Text milkText;

    public void Start() {
        // assigns '-1' if data was not found;
        var loadedData = saveSystem.Load();
        allData.milk = (int) (loadedData == null ? -1 : loadedData.milk);

        milkText.text = allData.milk.ToString();
    }

    public void Update() {
        if (Input.GetKeyDown(KeyCode.K)){
            TestSaving();
        }

        if (Input.GetKeyDown(KeyCode.J)) {
            TestAddingMilkValue();
        }

        if (Input.GetKeyDown(KeyCode.I)) {
            TestLoadingMilkValue();
        }

        #region Local_Function
        void TestSaving() {
            Debug.Log("SAVING...");
            saveSystem.Save(this.allData);
        }

        void TestAddingMilkValue() {
            Debug.Log("ADD...");
            ++allData.milk;
            milkText.text = allData.milk.ToString();
        }

        void TestLoadingMilkValue() {
            Debug.Log("LOADING...");
            var loadedData = saveSystem.Load();
            allData.milk = (int)(loadedData == null ? -1 : loadedData.milk);

            milkText.text = allData.milk.ToString();
        }
        #endregion
    }

}

保存系统.cs

[System.Serializable]
public class AllData {
    public double bucketProg = 0;
    public double milk = 0;
    public double totalMilk = 0;
    public double milkPrice = 0;
    public double totalClicks = 0;
    public double coins = 0;
    public double totalCoins = 0;
    public double upgradeBucketCost = 10;
    public double qualityMilkCost = 1000;
    public double BucketLevel = 1;
    public double milkLevel = 1;
    public double multiplier = 1;
}

public class SaveSystem {
    AllData allData = new AllData();
    public void Save(AllData allData) {

        BinaryFormatter bf = new BinaryFormatter();
        FileStream file = new FileStream(Application.persistentDataPath + "/allData.hey", FileMode.Create);
        bf.Serialize(file, allData);
        file.Close();
    }
    public AllData Load() {

        if (File.Exists(Application.persistentDataPath + "/allData.hey")) {

            BinaryFormatter bf = new BinaryFormatter();
            FileStream file = File.Open(Application.persistentDataPath + "/allData.hey", FileMode.Open);
            allData = (AllData)bf.Deserialize(file);
            file.Close();
            return allData;
        }

        return null;
    }

(^ 可能想要分离AllData成不同的源文件。)

虽然这只是我个人的偏好,但你也可以重构Load为:

// Returns true if the data exists; False if the data did not.
public bool TryLoad(out AllData allData) {
    allData = null;
    if (File.Exists(Application.persistentDataPath + "/allData.hey")) {

        BinaryFormatter bf = new BinaryFormatter();
        FileStream file = File.Open(Application.persistentDataPath + "/allData.hey", FileMode.Open);
        allData = (AllData)bf.Deserialize(file);
        file.Close();
    }
    return allData != null;
}

这样,您不必AllData在获取它时手动检查是否为 null,因为该功能会为您“自动检查”。


推荐阅读