c# - 试图建立一个保存/加载系统,需要帮助将值从一个类加载到另一个
问题描述
所以我正在保存和加载特定类的值。我正在调用保存值并使用它们的类。但是由于某种原因,当值被加载到保存值的类中时,调用具有值的类的类不会获得这些值。如何解决这个问题?
检查是否加载了值,它们是(显示在 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);
}
}
解决方案
似乎问题是您忘记标记AllData
为System.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,因为该功能会为您“自动检查”。
推荐阅读
- c++ - 你可以为堆上已经存在的数组分配内存吗
- php - 如何仅查询(月和年)之前的日期?(拉拉维尔)
- android - 错误:尝试在空对象引用上调用虚拟方法“java.lang.String android.os.Bundle.getString(java.lang.String)”
- python - 如何在我的网站上表示数据框?
- java - 如何修复返回值未显示在我的一种方法中
- php - 有没有更好的方法来为我的页脚轮播数据对象编写函数
- reporting-services - 一个数据集控制 SSRS *.rdl 中的其他数据集?
- r - R:在 Ubuntu 18.04 上带有安装箭头的箭头
- java - Spring调度程序未按计划启动
- docker - 运行 docker 容器错误:找不到可服务模型的基本路径 /models/model