Локальная таблица рекордов
Хочу реализовать таблицу рекордов формата "имя - рекорд" в игре, используя json. А сортировать при помощи LINQ. Но не совсем понимаю как это сделать.
Идея такая:
- В главном меню перед началом игры игроку нужно ввести имя (3 символа) - это имя сохраняется. (Думаю использовать InputField и из него извлечь введённое имя)
- В ходе игры сохраняется рекорд этого игрока, или перезаписывается старый, если рекорд был побит.
- Ну и в главном меню также будет кнопка перехода на сцену, где будут все игроки с их рекордами отображаться отсортированные при помощи 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);
}
}