C# 当水平结束时,我如何将分数从水平添加到所述水平之外的货币?
我有一个名为“Stash”的int变量。当我击败关卡时,游戏将保存。当它扑救的时候,我希望不管我的分数是多少,我的躲藏量都会上升。目前,我的代码没有保存我的隐藏值,它只是将其设置为“0(隐藏默认值)+分数(无论我的分数是什么级别)。”我如何在这段代码中编写代码以实现我的目标C# 当水平结束时,我如何将分数从水平添加到所述水平之外的货币?,c#,unity3d,C#,Unity3d,我有一个名为“Stash”的int变量。当我击败关卡时,游戏将保存。当它扑救的时候,我希望不管我的分数是多少,我的躲藏量都会上升。目前,我的代码没有保存我的隐藏值,它只是将其设置为“0(隐藏默认值)+分数(无论我的分数是什么级别)。”我如何在这段代码中编写代码以实现我的目标 using System.Collections; using System.Collections.Generic; using UnityEngine; using System.IO; using System.Run
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
[RequireComponent(typeof(GameData))]
public class SaveScript : MonoBehaviour
{
private GameData gameData;
private string savePath;
void Start()
{
gameData = GetComponent<GameData>();
savePath = Application.persistentDataPath + "/gamesave.save";
}
public void SaveData()
{
var save = new Save()
{
SavedStash = gameData.Stash + gameData.Score //<------ (This code)
};
var binaryFormatter = new BinaryFormatter();
using (var fileStream = File.Create(savePath))
{
binaryFormatter.Serialize(fileStream, save);
}
Debug.Log("Data Saved");
}
public void LoadData()
{
if (File.Exists(savePath))
{
Save save;
var binaryFormatter = new BinaryFormatter();
using (var fileStream = File.Open(savePath, FileMode.Open))
{
save = (Save)binaryFormatter.Deserialize(fileStream);
}
gameData.Stash = save.SavedStash; //<---------- (and this code)
gameData.ShowData();
Debug.Log("Data Loaded");
}
else
{
Debug.LogWarning("Save file doesn't exist");
}
}
}
“隐藏新文件”只是一个让整个工作正常进行的想法。首先:不要简单地将
+“/”
用于系统文件路径强>
不同的目标设备可能具有具有不同路径分隔符的不同文件系统
而是使用它自动插入正确的路径分隔符,这取决于它运行的操作系统
savePath=Path.combine(Application.persistentDataPath,“gamesave.save”);
然后转到主要问题: 属性,如
public int Stash{get;set;}
public int StashNew{get;set;}
公共整数分数{get;set;}
不是由二进制格式化程序反序列化的
所以当你这样做的时候
binaryFormatter.Serialize(文件流,保存);
这些数字甚至没有写入输出文件
然后,当读取同一内容时,该内容不起作用,您的属性只需保留int
默认值0
只需删除这些{get;set;}
,即可将属性转换为可序列化的字段,这样就可以了
public-int-Stash;
公共int StashNew;
公众智力得分;
只是为了演示,我使用了这段代码
公共类MonoBehavior测试:MonoBehavior
{
[SerializeField]中的私有游戏数据;
[SerializeField]私人游戏数据输出;
[上下文菜单(“测试”)]
专用无效测试()
{
var formatter=新的二进制格式化程序();
使用(var fs=File.Open(Path.Combine(Application.streamingassetpath,“Example.txt”)、FileMode.OpenOrCreate、FileAccess.Write)
{
序列化(fs,In);
}
使用(var fs=File.Open(Path.Combine(Application.streamingassetpath,“Example.txt”)、FileMode.Open、FileAccess.Read)
{
Out=(GameData)格式化程序。反序列化(fs);
}
}
[可序列化]
私有类游戏数据
{
公共储藏室;
公共int StashNew;
公众智力得分;
}
}
正如您所见,这也有一个副作用,即现在字段实际上出现在检查器中,并且可以编辑。我只将值写入In
实例中,点击Test
后,您可以看到它们通过文件加载到Out
实例中
但是,一般来说,我不建议在这里使用二进制格式化程序
。。。它会增加很多你根本不需要的开销垃圾。只需选择一种类似的简单文件格式,如XML或CSV,它只存储相关数据。感谢您提供的提示,我肯定会使用它们,但我的问题仍然没有答案。如何在保存时将分数添加到存储中?答案是您已经在这里执行了gameData.stash+gameData.score
但您的问题是从未存储int值。。。现在它被序列化了,因此现在它应该被存储并正确加载=>添加到现有加载的scoreah!我现在明白你的意思了。谢谢。我用这个视频来解释我的问题。当关卡结束时,我点击任一按钮,游戏将保存。这会将分数添加到您在水平选择左侧看到的隐藏编号中。但是它只是返回它,我认为这是因为它没有正确地保存隐藏值。我遵循了你的提示,但是没有用。你似乎在加载到现有文件之前保存了隐藏值,所以覆盖了现有文件。在您的代码中,我看不到在何时何地调用您的方法。。。您应该设置断点,并在加载值之前找出它写入值的原因。您似乎只通过按钮加载,对吗?
public int Stash { get; set; }
public int StashNew { get; set; }
public int Score { get; set; }