как создать рекорд с помощью сериализованного двоичного файла - PullRequest
0 голосов
/ 28 октября 2019

Я строю игру с высоким счетом. данные внутри рекорда - это количество убийств, время и имя пользователя, которые есть у игрока, которые хранятся в списке. В настоящее время у меня есть работающая система, использующая двоичный форматировщик и сериализованный текстовый файл, однако, когда я загружаю список и его содержимое из двоичного файла, только первая созданная запись в двоичном файле отображается в списке с высокой оценкой. Похоже, что двоичный файл читает только первую строку файла.

Вопрос 1: почему я могу прочитать только первую запись из двоичного файла? Вопрос 2: как мне вставить все данные из двоичного файла в список?

 using System;
 using System.Collections;
 using System.Collections.Generic;
 using System.Linq;
 using UnityEngine;


public class HighscoreManager : MonoBehaviour
{
 Dictionary<string, Dictionary<string, int> > PlayerScore;

 private int Time;
 private int Kills;
 private int Kills2;
 private int Kills3;
 private int Kills4;
 private int Kills5;
 private int Kills6;
 private string userName = "User01";

 public GameObject SL;
 //public ArrayList savedDatas = new ArrayList();
 public List<string> loadedstats = new List<string>();

 // Start is called before the first frame update
 void Start()
 {
     SetScore("Rick", "Time", 500);
     SetScore("Rick", "Kills", 9);

     SetScore("BOB", "Time", 1500);
     SetScore("BOB", "Kills", 50);
     SetScore("BBB", "Deaths", 3);
     SetScore("CCC", "Time", 6);

     //GetComponent<PlayerController>().LoadPlayer();
     //SaveSystems.LoadPlayer();
     //savedData.Add(data.savedData);

     loadedstats = SaveSystems.LoadPlayer();

     int.TryParse(loadedstats[0], out Kills);
     int.TryParse(loadedstats[1], out Time);
     //int.TryParse(loadedstats[2], out Kills2);
     //int.TryParse(loadedstats[3], out Kills3);
     //int.TryParse(loadedstats[4], out Kills4);
     //int.TryParse(loadedstats[5], out Kills5);

     //Kills = (int)data[0];
     //Time = (int)data[1];
     //userName = "" + data[2];

     SetScore(userName, "Time", Time);
     SetScore(userName, "Kills", Kills);

     Debug.Log("data loaded" + " Time : " + Time + ", Kills : " + Kills + ", username : " + userName);
     Debug.Log("List Counted objects = " + loadedstats.Count);
     Debug.Log("List capacity = " + loadedstats.Capacity);
 }
 void Init()
 {
     if (PlayerScore != null)
     {
         return;
     }
     else
     {
         PlayerScore = new Dictionary<string, Dictionary<string, int>>();
     }
 }
 public int GetScore(string userName, string scoreType)
 {
     Init();
     if (PlayerScore.ContainsKey(userName) == false)
     {
         return 0;
     }
     if(PlayerScore[userName].ContainsKey(scoreType) == false)
     {
         return 0;
     }
     return PlayerScore[userName][scoreType];
 }
 public void SetScore(string userName, string scoreType, int value)
 {
     Init();
     if (PlayerScore.ContainsKey(userName) == false)
     {
         PlayerScore[userName] = new Dictionary<string, int>();
     }
     PlayerScore[userName][scoreType] = value;
 }
 public void ChangeScore(string userName, string scoreType, int amount)
 {
     Init();
     int currScore = GetScore(userName, scoreType);
     SetScore(userName, scoreType, currScore + amount);
 }
 public string[] GetPlayerNames(string sortingScoreType)
 {
     Init();
     return PlayerScore.Keys.OrderByDescending( n => GetScore(n, sortingScoreType) ).ToArray();
 }


 }

выше - класс highscoreManager, который создает список рекордов. ниже приведен класс saveSystem, который сохраняет и загружает данные в двоичном файле.

 using UnityEngine;                                                             
 using System.IO;                                                               
 using System.Runtime.Serialization.Formatters.Binary;               
 using System;
 using System.Collections;
 using System.Collections.Generic;

 public static class SaveSystems
 {
 public static ArrayList savedData = new ArrayList();


 public static void SavePlayer(PlayerController player)
 {

     BinaryFormatter formatter = new BinaryFormatter();                                                           

     FileStream stream = new FileStream(Application.persistentDataPath + "/player.savedData", 
     FileMode.Append);         

     PlayerData data = new PlayerData(player);                                                                               

     formatter.Serialize(stream, data);
     stream.Close();

     Debug.Log(Application.persistentDataPath + "/player.savedData");
 }
 public static List<string> LoadPlayer()
 {
     if (File.Exists(Application.persistentDataPath + "/player.savedData"))                                                             
     {
         BinaryFormatter formatter = new BinaryFormatter();                                                                  
         FileStream stream = new FileStream(Application.persistentDataPath + "/player.savedData", FileMode.Open);            

         PlayerData data = formatter.Deserialize(stream) as PlayerData;                                                      

         stream.Close();                                                                                                     
         return data.stats;                                                                                                 
     }
     else
     {
         return null;
     }
 }
 }
 [Serializable]
 public class PlayerData
 {
 public List<string> stats = new List<string>();

 public PlayerData(PlayerController player)
 {
     //stats[0] = player.Kills;
     stats.Add("" + player.Kills);
     //stats[1] = player.Time;
     stats.Add("" + player.Time);
 }
 }
...