Leaderboard Sorting
I need a little bit of help on how can I sort the leaderboard with having a realtime update.
Like highest to lowest score.
(Game is like IO games)
here's the leaderboard entry code
Here's the Leaderboard Code itself
Like highest to lowest score.
(Game is like IO games)
here's the leaderboard entry code
Code:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Networking;
public class LeaderboardEntry : MonoBehaviour
{
public int id;
public Text placement, playerName, playerScore;
private void Update()
{
UpdateInfo();
}
public void UpdateInfo()
{
placement.text = (id + 1).ToString();
playerName.text = Leaderboard.Instance.pInfo[id].name;
playerScore.text = Leaderboard.Instance.pInfo[id].score.ToString("0");
}
}
Here's the Leaderboard Code itself
Code:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.Networking;
public class Leaderboard : NetworkBehaviour
{
public static Leaderboard Instance;
public List<LeaderboardEntry> entries;
PlayerInfo[] LBoard = new PlayerInfo[5];
public struct PlayerInfo
{
public string name;
public float score;
public PlayerInfo(string name, float score)
{
this.name = name;
this.score = score;
}
}
//make sure that the class name starts with SyncList
public class SyncListInfo : SyncListStruct<PlayerInfo> { }
public SyncListInfo pInfo = new SyncListInfo();
private void Awake()
{
Instance = this;
//Disable all the leaderboard entries
for (int i = 0; i < entries.Count; i++)
entries[i].gameObject.SetActive(false);
}
[Command]
public void CmdAddPlayerInfo(string name, float score)
{
Debug.Log(string.Format("adding info: {0} & {1}", name, score));
pInfo.Add(new PlayerInfo(name, score));
Debug.Log("There are " + pInfo.Count + " elements in the struct list.");
//enable the entry
EnableEntry(pInfo.Count);
//make sure that enable entry is also called on all connected clients
RpcEnableEntry(pInfo.Count);
}
[Command]
public void CmdUpdatePlayerInfo(string name, float score)
{
for(int i = 0; i < pInfo.Count; i++)
{
if(pInfo[i].name == name)
{
pInfo[i] = new PlayerInfo(name, score);
}
Array.Sort(LBoard, (x, y) => x.score.CompareTo(y.score));
Array.Sort(LBoard, delegate (PlayerInfo p1, PlayerInfo p2)
{
return p1.score.CompareTo(p2.score);
});
}
}
[ClientRpc]
void RpcEnableEntry(int count)
{
EnableEntry(count);
}
private void EnableEntry(int count)
{
for (int i = 0; i < count; i++)
{
entries[i].gameObject.SetActive(true);
}
}
}