using System.Collections; using System.Collections.Generic; using UnityEngine; using TMPro; using PlayFab.ClientModels; using PlayFab; using System; using System.Threading.Tasks; public class StatsScreen : MonoBehaviour { public TextMeshProUGUI levelsCompleted; public TextMeshProUGUI top10Count; public TextMeshProUGUI top3Count; public LevelGroup[] levelGroups; public int getAllTimerLevels() { int allLevels = 0; for (int i = 0; i < levelGroups.Length; i++) { allLevels += levelGroups[i].CompletedLevel_Timer; } return allLevels; } public async void OnScreenOpened() { levelsCompleted.text = getAllTimerLevels().ToString() + "/250"; top10Count.text = "..."; top3Count.text = "..."; Task top10Task = getAllTop10LevelsAsync(); Task top3Task = getAllTop3LevelsAsync(); await Task.WhenAll(top10Task, top3Task); top10Count.text = top10Task.Result.ToString(); top3Count.text = top3Task.Result.ToString(); } private async Task getAllTop3LevelsAsync() { int result = 0; int groupIndex = 0; foreach (var group in levelGroups) { for (int levelIndex = 0; levelIndex < group.CompletedLevel_Timer; levelIndex++) { string statisticName = $"{GameConstants.GameNamePrefix}_{groupIndex + 1}_Level_{levelIndex}_Time"; if (await IsInTop3(statisticName)) { result++; } } groupIndex++; } return result; } private async Task getAllTop10LevelsAsync() { int result = 0; int groupIndex = 0; foreach (var group in levelGroups) { for (int levelIndex = 0; levelIndex < group.CompletedLevel_Timer; levelIndex++) { string statisticName = $"{GameConstants.GameNamePrefix}_{groupIndex + 1}_Level_{levelIndex}_Time"; if (await IsInTop10(statisticName)) { result++; } } groupIndex++; } return result; } public async Task IsInTop3(string statisticsName) { var request = new GetLeaderboardAroundPlayerRequest { StatisticName = statisticsName, MaxResultsCount = 10 }; var tcs = new TaskCompletionSource(); PlayFabClientAPI.GetLeaderboardAroundPlayer(request, result => { string myId = PlayFabSettings.staticPlayer.PlayFabId; var myEntry = result.Leaderboard.Find(entry => entry.PlayFabId == myId); tcs.SetResult(myEntry != null && myEntry.Position <= 2); // 0–2 }, error => { Debug.LogError("Failed to fetch leaderboard: " + error.GenerateErrorReport()); tcs.SetResult(false); }); return await tcs.Task; } public async Task IsInTop10(string statisticsName) { var request = new GetLeaderboardAroundPlayerRequest { StatisticName = statisticsName, MaxResultsCount = 10 }; var tcs = new TaskCompletionSource(); PlayFabClientAPI.GetLeaderboardAroundPlayer(request, result => { string myId = PlayFabSettings.staticPlayer.PlayFabId; var myEntry = result.Leaderboard.Find(entry => entry.PlayFabId == myId); tcs.SetResult(myEntry != null && myEntry.Position <= 9); // 0–9 }, error => { Debug.LogError("Failed to fetch leaderboard: " + error.GenerateErrorReport()); tcs.SetResult(false); }); return await tcs.Task; } }