Unity:脱机前10名排行榜

时间:2017-01-18 10:49:09

标签: c# unity3d

我有一个问答游戏,在游戏结束时,我想以他们的名字和分数显示排名前十的人的排行榜:例如: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名用户的名字和高分。谢谢!

1 个答案:

答案 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之类的详细信息。