【问题标题】:Unity: offline top 10 leaderboardUnity:离线前10排行榜
【发布时间】:2017-01-18 10:49:08
【问题描述】:

我有一个问答游戏,在游戏结束时,我想显示前 10 名的排行榜及其姓名和得分,例如: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 名用户的名字和高分。谢谢!

【问题讨论】:

  • 用户的分数是否保存在文件中?
  • 有点题外话,但是这个项目来自教程吗?我最近看到很多关于具有类似名称变量的问答游戏的问题。
  • 是的,它来自 Unity 实时会话教程
  • 只有用户保存在文件中。使用 playerPerfs 保存分数

标签: c# unity3d


【解决方案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...
}

现在由于您将所有Players 放在一个列表中,您可以使用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 或类似的内容。

【讨论】:

  • 我需要注册,因为我需要收集用户信息。是的,它处于离线状态。而且我不太了解 int x 部分和 higestX 部分,你能演示更多吗?
  • @Alex 我可以演示更多,但您主要展示了代码中不相关的部分。这种注册很容易“破解”,您在 .exe 文件所在的同一文件夹中有纯文本文件,因此我不会基于此进行任何数据挖掘。
  • idc 关于任何黑客现在...没有人会破解它..这只是为了一件小事而不是为了发布..我只需要显示前 10 人的排行榜...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-22
  • 2021-09-07
  • 2021-10-22
  • 2015-03-01
  • 1970-01-01
  • 2016-01-16
相关资源
最近更新 更多