Локальная таблица рекордов

Хочу реализовать таблицу рекордов формата "имя - рекорд" в игре, используя json. А сортировать при помощи LINQ. Но не совсем понимаю как это сделать.

Идея такая:

  1. В главном меню перед началом игры игроку нужно ввести имя (3 символа) - это имя сохраняется. (Думаю использовать InputField и из него извлечь введённое имя)
  2. В ходе игры сохраняется рекорд этого игрока, или перезаписывается старый, если рекорд был побит.
  3. Ну и в главном меню также будет кнопка перехода на сцену, где будут все игроки с их рекордами отображаться отсортированные при помощи LINQ.

Вот такой код у меня сейчас имеется:

    [System.Serializable]
    class SaveData
    {
        public int record;
        public string playerName;
    }

    public void SaveRecord()
    {
        SaveData data = new SaveData
        {
            record = _highScore,
            playerName = PLAYER_NAME
        };

        string json = JsonUtility.ToJson(data);

        File.WriteAllText(Application.persistentDataPath + "/savefile.json", json);
    }

    public void LoadRecord()
    {
        string path = Application.persistentDataPath + "/savefile.json";
        if (File.Exists(path))
        {
            string json = File.ReadAllText(path);
            SaveData data = JsonUtility.FromJson<SaveData>(json);

            _highScore = data.record;
            PLAYER_NAME = data.playerName;
        }
    }

Ответы (1 шт):

Автор решения: Yaroslav

LiderboardResult.cs

using System;
using System.Globalization;

[Serializable]
public struct LiderboardResult
{
    public string Name;
    public int Score;
    public long DateLong;

    public LiderboardResult (string name, int score, DateTime date)
    {
        Name = name;
        Score = score;
        DateLong = date.ToFileTimeUtc();
    }

    public DateTime Date => DateTime.FromFileTimeUtc(DateLong);

    public override string ToString ()
    {
        return Name+" "+Score+" "+Date.ToString("G", CultureInfo.GetCultureInfo("de-DE"));
    }
}

LiderboardTable.cs

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

[Serializable]
public struct LiderboardTable
{
    public LiderboardResult[] Results;

    public LiderboardTable (IEnumerable<LiderboardResult> results)
    {
        Results = results.ToArray();
    }

    public override string ToString ()
    {
        string[] rows = new string[Results.Length];
        for (int i = 0; i < Results.Length; i++)
            rows[i] = i+" "+Results[i].ToString();
        return string.Join(Environment.NewLine, rows);
    }
}

Liderboard.cs

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

public class Liderboard
{
    private const int Capacity = 10;

    public IList<LiderboardResult> Results;
    private List<LiderboardResult> _results;
    private ISaveLoadJson _saveLoad;

    public Liderboard ()
    {
        _results = new List<LiderboardResult>();
        Results = _results.AsReadOnly();

        _saveLoad = new SaveLoadJsonPlayerPrefs("Liderboard");
        Load();
    }

    public void AddResult (string name, int score)
    {
        _results.Add(new LiderboardResult(name, score, DateTime.Now));
        SortAndCrop();
        Save();
    }

    private void SortAndCrop ()
    {
        _results.Sort((x, y) => y.Score.CompareTo(x.Score));
        if (_results.Count > Capacity)
            _results.RemoveRange(Capacity, _results.Count-Capacity);
    }

    private void Load ()
    {
        _results.Clear();
        string json = _saveLoad.Load();
        if (json != "")
        {
            var Table = JsonUtility.FromJson<LiderboardTable>(json);
            _results.AddRange(Table.Results);
            SortAndCrop();
        }
    }

    private void Save ()
    {
        var Table = new LiderboardTable(_results);
        Debug.Log(Table.ToString());
        string json = JsonUtility.ToJson(Table);
        _saveLoad.Save(json);
    }
}

ISaveLoadJson.cs

public interface ISaveLoadJson
{
    void Save (string json);
    string Load ();
}

SaveLoadJsonPlayerPrefs.cs

using UnityEngine;

public class SaveLoadJsonPlayerPrefs : ISaveLoadJson
{
    private string _key;

    public SaveLoadJsonPlayerPrefs (string key)
    {
        _key = key;
    }

    public void Save (string json)
    {
        PlayerPrefs.SetString(_key, json);
        PlayerPrefs.Save();
    }
    public string Load ()
    {
        return PlayerPrefs.GetString(_key);
    }
}
→ Ссылка