我有一个问答游戏,在游戏结束时,我想以他们的名字和分数显示排名前十的人的排行榜:例如:Ioue 500。
现在我每次用户得分时都会加分,我正在检查高分。但是我不确定如何做排行榜。有人可以指导我吗?
此脚本是用户注册的地方,它是一个不同的场景。
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using System.Linq;
using System.Text.RegularExpressions;
using System.IO;
using System;
public class Registration : MonoBehaviour
{
public Text name;
public static Registration _instace;
private void Awake()
{
_instace = this;
}
/// <summary>
/// Performs data validation and registers user
/// </summary>
public void Register()
{
string data;
string currentUser = string.Empty;
string userName;
data = GetData(name);
if (data == null || string.IsNullOrEmpty(data))
{
Recolor(name, errorColor);
return;
}
else
{
userName = data;
currentUser += data + ";";
}
string previousDirectory = Directory.GetCurrentDirectory();
Directory.SetCurrentDirectory(Application.persistentDataPath);
if (File.Exists("Users.csv"))
{
string[] users = File.ReadAllLines("Users.csv");
foreach (string user in users)
{
string[] parts = user.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
}
}
File.AppendAllText("Users.csv", currentUser + Environment.NewLine);
Directory.SetCurrentDirectory(previousDirectory);
SceneManager.LoadScene(nextScene);
}
// Gets input data from control group provided
string GetData(Graphic group)
{
InputField inputField = group.GetComponentInChildren<InputField>();
if (inputField != null)
{
return inputField.text;
}
return null;
}
// Gets input data from control group provided
string GetDataD(Graphic group)
{
Dropdown inputField = group.GetComponentInChildren<Dropdown>();
if (inputField != null)
{
return inputField.captionText.text;
}
return null;
}
}
我添加得分的地方是玩家获得正确答案
if (isCorrect)
{
theAnswerIsCorrect = true;
playerScore += 20;
scoreDisplayText.text = "Score: " + playerScore.ToString();
}
这是我比较旧分数和新分数的地方:
public void submitNewPlayerScore(int newScore)
{
if (newScore > playerProgress.highestScore)
{
playerProgress.highestScore = newScore;
SavePlayerProgress();
}
}
现在我需要的是我会有很多用户在玩,我只想显示前10名用户的名字和高分。谢谢!
答案 0 :(得分:1)
好的第一件事:为什么在离线时甚至需要注册?
您可以省略注册,并在测验结束后询问玩家姓名(如果您想要离线高分)。
由于您已经有highestScore
种类,因此您只需使用Linq
订购即可。我假设您的代码可以访问所有玩家(因为它在csv文件中),所以我建议做这样的事情:
List<Player> playerList = new List<Player>();
foreach(string user in File.ReadAllLines("Users.csv"))
{
playersList.Add(Player.Parse(user)); // If you have such method...
}
现在,由于您在一个列表中包含所有Player
,因此您可以使用Linq
对其进行排序,并仅显示x
:
int x = 10; // how many records to take
IEnumerable<Player> highestX = playerList.OrderBy(player => player.highestScore).Take(x);
highestX
现在拥有10个得分最高的记录。您可以遍历它们并显示highestX.ElementAt(0).Name
之类的详细信息。