Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当水平结束时,我如何将分数从水平添加到所述水平之外的货币?_C#_Unity3d - Fatal编程技术网

C# 当水平结束时,我如何将分数从水平添加到所述水平之外的货币?

C# 当水平结束时,我如何将分数从水平添加到所述水平之外的货币?,c#,unity3d,C#,Unity3d,我有一个名为“Stash”的int变量。当我击败关卡时,游戏将保存。当它扑救的时候,我希望不管我的分数是多少,我的躲藏量都会上升。目前,我的代码没有保存我的隐藏值,它只是将其设置为“0(隐藏默认值)+分数(无论我的分数是什么级别)。”我如何在这段代码中编写代码以实现我的目标 using System.Collections; using System.Collections.Generic; using UnityEngine; using System.IO; using System.Run

我有一个名为“Stash”的int变量。当我击败关卡时,游戏将保存。当它扑救的时候,我希望不管我的分数是多少,我的躲藏量都会上升。目前,我的代码没有保存我的隐藏值,它只是将其设置为“0(隐藏默认值)+分数(无论我的分数是什么级别)。”我如何在这段代码中编写代码以实现我的目标

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; }