Как я могу добавить счет из уровня в валюту за пределами указанного уровня, когда уровень заканчивается? - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть переменная типа int под названием "Sta sh". Когда я побью уровень, игра сохранится. Когда это экономит, я хочу, чтобы Sta sh повысился, насколько бы ни был мой результат на этом уровне. В настоящее время мой код не сохраняет мое значение sta sh, а просто устанавливает его на «0 (sta sh default) + Score (независимо от того, каким был мой уровень на этом уровне)». Как я могу написать в этом коде, чтобы моя цель достигла цели?

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

Также относящиеся к делу вещи в моем файле GameData:

    public int Stash { get; set; }
    public int StashNew { get; set; }
    public int Score { get; set; }

StashNew была просто идеей, которую я должен был получить все это работает.

1 Ответ

1 голос
/ 01 апреля 2020

Прежде всего: Никогда просто не используйте + "/" для системных путей к файлам!

У разных целевых устройств могут быть разные файловые системы с разными разделителями пути.

Скорее используйте Path.Combine, который автоматически вставляет правильные разделители пути в зависимости от операционной системы, в которой он работает.

savePath = Path.combine(Application.persistentDataPath, "gamesave.save");

Затем к основной проблеме:

Свойства типа

public int Stash { get; set; }
public int StashNew { get; set; }
public int Score { get; set; }

не де-сериализированы с помощью BinaryFormatter!

Поэтому, когда вы делаете

binaryFormatter.Serialize(fileStream, save);

числа даже не записываются в выходной файл!

Тогда при чтении того же самого не работает, и ваши свойства просто сохраняют значение int по умолчанию 0.


Просто удалите эти { get; set; }, чтобы преобразовать ваши свойства в сериализуемые Поля , и все будет в порядке.

public int Stash;
public int StashNew;
public int Score;

Только для демонстрации Я использовал этот код

public class MonoBehaviourForTests : MonoBehaviour
{
    [SerializeField] private GameData In;
    [SerializeField] private GameData Out;

    [ContextMenu("Test")]
    private void Test()
    {
        var formatter = new BinaryFormatter();

        using (var fs = File.Open(Path.Combine(Application.streamingAssetsPath, "Example.txt"), FileMode.OpenOrCreate, FileAccess.Write))
        {
            formatter.Serialize(fs, In);
        }

        using (var fs = File.Open(Path.Combine(Application.streamingAssetsPath, "Example.txt"), FileMode.Open, FileAccess.Read))
        {
            Out = (GameData)formatter.Deserialize(fs);
        }
    }

    [Serializable]
    private class GameData
    {
        public int Stash;
        public int StashNew;
        public int Score;
    }
}

Как вы можете видеть, это также имеет побочный эффект, что теперь поля фактически появляются в Инспекторе и могут быть отредактированы. Я записываю значения только в экземпляр In и после нажатия Test вы можете видеть их загруженные в экземпляр Out через файл.

enter image description here


Однако в целом я бы не рекомендовал использовать BinaryFormatter здесь вообще ... это добавляет много накладных расходов мусор вам совсем не нужен. Просто go, например, JSON или сопоставимый простой формат файла, такой как XML или CSV, в котором хранятся только соответствующие данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...