【问题标题】:How do I sort and display an array to create a leaderboards in unity C#如何排序和显示数组以在统一 C# 中创建排行榜
【发布时间】:2017-03-13 09:50:22
【问题描述】:

目前我遇到了一些问题,我必须与员工一起使用数据库。这些员工有不同的数据 这些是字符串和整数 数组中的示例是: Naam:Pino |团队:2 | VerkoopA:12 | VerkoopB:12 |核动力源:40 |匡威:10。

这是一个只有一名员工的示例,数据库中有更多员工,我已经在代码中拆分了他们。我想做的事情是用这些数据制作排行榜但是我不知道如何分离数组中的不同项目,如果我已经分离了这个,我如何对数组进行排序以查看谁拥有最多的 saleA 和谁拥有最畅销B,所以我可以将其设为带有过滤器的排行榜。

还有一种简单的方法来制作可以显示一定数量员工的可视化排行榜吗?因为我现在显示它的方式它什么都没有显示。

我正在使用 Unity 和我自己的 Xampp 服务器

致以诚挚的问候,

Dh

脚本:

using UnityEngine;
using UnityEngine.UI;
using System.Collections;

public class Leaderboard : MonoBehaviour
{

    // Array of all the employees
    public string[] leaderboard;

    Text txt;

    IEnumerator Start()
    {


        // Getting the leaderboard data from mySQL.
        WWW leaderboardsData = new WWW("http://localhost/leaderboards.php");
        yield return leaderboardsData;

        // Split every employee in the Array so they are all apart from each other. |
        // an example Message Naam:Pino | Team:2 | VerkoopA:12 | VerkoopB:12 | NPS:40 | Conversie:10 
        string leaderboardsDataString = leaderboardsData.text;
        leaderboard = leaderboardsDataString.Split(';');

        // for every employee in the array print every employee's data.
        foreach (string employee in leaderboard)
        {
            string employeeApart = employee;
            DisplayLeaderboards(employeeApart);
        }

    }

    // Display the leaderboards 1 by 1.
    void DisplayLeaderboards(string employeeApart)
    {
        print(employeeApart);

        txt = gameObject.GetComponent<Text>();
        txt.text = employeeApart;
    }



    string GetDataValue(string data, string index)
    {
        string value = data.Substring(data.IndexOf(index) + index.Length);
        if (value.Contains("|")) value = value.Remove(value.IndexOf("|"));
        return value;
    }

}

PHP:

<?php
$servername = "localhost";
$username =  "root";
$password = "";
$dbName = "test3";

//Make Connection
$conn = new mysqli($servername, $username, $password, $dbName);
//Check Connection
if(!$conn){
    die("Connection Failed. ". mysqli_connect_error());
}

$sql = "SELECT ID, Team, VerkoopA, VerkoopB, NPS, Conversie FROM Leaderboards";
$result = mysqli_query($conn ,$sql);


if(mysqli_num_rows($result) > 0){
    //show data for each row
    while($row = mysqli_fetch_assoc($result)){
        echo "ID:".$row['ID'] . "|Team:".$row['Team']. "|VerkoopA:".$row['VerkoopA']. "|VerkoopB:".$row['VerkoopB'] . "|NPS:".$row['NPS']. "|Conversie:".$row['Conversie'] . ";";
    }
}

?>

编辑:

经过程序员的帮助,我决定使用json

目前我遇到了一些问题,我必须与员工一起使用数据库。这些员工有不同的数据我的 PHP 文件的输出是:

[{"ID":"1","Team":"2","VerkoopA":"35","VerkoopB":"12","NPS":"25","Conversie":" 18"},{"ID":"2","Team":"1","VerkoopA":"55","VerkoopB":"2","NPS":"12","Conversie":" 40"},{"ID":"3","Team":"2","VerkoopA":"12","VerkoopB":"12","NPS":"40","Conversie":" 10"}]

我想做的是用这些数据制作排行榜,但是我不知道如何分隔数组中的不同项目通过使用 JsonHelper 我得到一个错误:ArgumentException:JSON 必须代表一个对象

脚本:

using UnityEngine;
using UnityEngine.UI;
using System.Collections;

public class Leaderboard: MonoBehaviour
{
    // Array of all the employees

    [System.Serializable]
    public class LeaderBoard
    {
        public string ID;
        public string Team;
        public string VerkoopA;
        public string VerkoopB;
        public string NPS;
        public string Conversie;
    }



    Text txt;

    IEnumerator Start()
    {
        // Getting the leaderboard data from mySQL.
        WWW leaderboardsData = new WWW("http://localhost/leaderboards.php");
        yield return leaderboardsData;

        string leaderboardsDataString = leaderboardsData.text;

        print(leaderboardsDataString);
        LeaderBoard[] leaderboard;
        leaderboard = JsonHelper.FromJson<LeaderBoard>(leaderboardsDataString);

        // for every employee in the array print every employee's data.
        foreach (LeaderBoard employee in leaderboard)
        {
            DisplayLeaderboards(employee);
        }

    }


    // Display the leaderboards 1 by 1.
    void DisplayLeaderboards(LeaderBoard employeeApart)
    {
        Debug.Log("ID: " + employeeApart.ID);
        Debug.Log("Team: " + employeeApart.Team);
        Debug.Log("VerkoopA: " + employeeApart.VerkoopA);
        Debug.Log("VerkoopB: " + employeeApart.VerkoopB);
        Debug.Log("NPS: " + employeeApart.NPS);
        Debug.Log("Conversie: " + employeeApart.Conversie);
    }
}

PHP:

<?php
$servername = "localhost";
$username =  "root";
$password = "";
$dbName = "test3";

//Make Connection
$conn = new mysqli($servername, $username, $password, $dbName);
//Check Connection
if(!$conn){
    die("Connection Failed. ". mysqli_connect_error());
}


$sql = "select * from Leaderboards";
$result = mysqli_query($conn, $sql) or die("Error in Selecting " . mysqli_error($conn));

//create an array
$emparray = array();
while($row =mysqli_fetch_assoc($result))
{
    $emparray[] = $row;
}

echo json_encode($emparray);    
?>

【问题讨论】:

  • 您可能知道GPG已经有一个完整的排行榜系统。 developers.google.com/games/services/common/concepts/…
  • 好吧,我将它用于一家拥有自己安全数据库的公司,他们有很多限制和安全性,这是我最终在他们的空间中重新创建的本地数据库。不过谢谢

标签: c# php sorting unity3d leaderboard


【解决方案1】:

由于您可以访问服务器和服务器脚本 (php),因此您应该使用 jsonxml 执行此操作,而不是使用 | 分隔数据。

从数据库中以 json 格式发送数据。在 Unity 端,使用 WWW 类接收数据,然后将 json 转换回使用 JsonUtility 的类。

Unity 的JsonUtility 不支持数组,因此您需要一个针对它的包装器。你可以得到JsonHelper类,它允许json数组here

这就是我上面描述的样子:

[System.Serializable]
public class LeaderBoard
{
    public string ID;
    public string Team;
    public string VerkoopA;
    public string VerkoopB;
    public string NPS;
    public string Conversie;
}

Text txt;

IEnumerator _Start()
{


    // Getting the leaderboard data from mySQL.
    WWW leaderboardsData = new WWW("http://localhost/leaderboards.php");
    yield return leaderboardsData;


    string leaderboardsDataString = leaderboardsData.text;
    LeaderBoard[] leaderboard = JsonHelper.FromJson<LeaderBoard>(leaderboardsDataString);

    // for every employee in the array print every employee's data.
    foreach (LeaderBoard employee in leaderboard)
    {
        DisplayLeaderboards(employee);
    }

}

// Display the leaderboards 1 by 1.
void DisplayLeaderboards(LeaderBoard employeeApart)
{
    Debug.Log("ID: " + employeeApart.ID);
    Debug.Log("Team: " + employeeApart.Team);
    Debug.Log("VerkoopA: " + employeeApart.VerkoopA);
    Debug.Log("VerkoopB: " + employeeApart.VerkoopB);
    Debug.Log("NPS: " + employeeApart.NPS);
    Debug.Log("Conversie: " + employeeApart.Conversie);
}

在 php 方面,您必须使用 json_encode 函数将您的数据库信息编码为 json 数组,然后再将其发送到 Unity。不是 php 专家,但您可以了解更多关于 herehere 的信息。

对结果进行排序

从服务器接收到数据后可以按ID排序

leaderboard = leaderboard.OrderBy(c => c.ID).ToArray();

NPS

leaderboard = leaderboard.OrderBy(c => c.NPS).ToArray();

这必须在foreach 循环之前完成。

编辑:

你的 php 生成的 json 不能直接在 Unity 中准备好。不擅长php,无法修复php端的json数据。虽然,我可以在 Unity 端修复它。

在接收到的字符串前面添加{"Items":,然后在末尾添加}

我为此做了一个简单的函数:

string fixJson(string value)
{
    value = "{\"Items\":" + value + "}";
    return value;
}

将该函数包含到您的脚本中,然后简单地替换

string leaderboardsDataString = leaderboardsData.text;

string leaderboardsDataString = fixJson(leaderboardsData.text);

现在一切都应该正常了。

【讨论】:

  • 您好,谢谢您的回复。我设法通过 PHP 在 Unity 中正确获取所有数据,但是当我尝试使用代码将其发送到 JsonHelper 时,它给了我这个错误:ArgumentException: JSON must代表一个对象类型我一直在努力让它正确,但它没有帮助。
  • 编辑您的问题并添加您从服务器获取的字符串。
  • 你快到了。向下滚动到我的答案,上面写着 EDIT 并继续阅读。那应该可以解决您的问题。不要忘记accept 回答您的问题已解决。我让它在我身边工作。
  • 非常感谢,这对我帮助很大,而且很有效。我对这个网站很熟悉,但我自己从未真正发布过任何东西,但我很高兴再次感谢你。
猜你喜欢
  • 2011-10-29
  • 2018-07-18
  • 1970-01-01
  • 1970-01-01
  • 2021-03-09
  • 1970-01-01
  • 2021-03-04
  • 2023-03-17
相关资源
最近更新 更多