Обнуление целочисленного значения после вызова функции (Playfab-Unity) - PullRequest
0 голосов
/ 06 мая 2020

Мне нужно набрать наивысший балл из списка лидеров Playfab и показать его в Unity. Я могу получить наивысший балл и затем присвоить его глобальной переменной. Моя функция возвращает эту переменную, но всегда возвращается как ноль. Наивысшее значение в таблице лидеров - 50.

// GETS THE QUIZ'S, THAT THE USER HAS CLICKED, HIGHEST SCORE VALUE FROM THE PLAYFAB LEADERBOARD.
    public int GetLeaderboardList()
    {
        var request = new GetLeaderboardRequest();
        request.StartPosition = 0;
        request.StatisticName = QuizButtonClicked.clickedButtonQuiz.name; // the button that the user has clicked.
        request.MaxResultsCount = 20;
        PlayFabClientAPI.GetLeaderboard(request, (result) =>
        {
            topScoreOnLeaderboard = result.Leaderboard.ElementAt(0).StatValue;
            Debug.LogError(result.Leaderboard.ElementAt(0).StatValue); // 1- Result is 50.
            Debug.LogError(topScoreOnLeaderboard); // 2- Result is 50.

        }, (error) =>
        {
            Debug.LogError(error.GenerateErrorReport());
        });
        Debug.LogError(topScoreOnLeaderboard); // 3- But here it gives 0.
        return topScoreOnLeaderboard;
    }

Изменить: порядок журнала отладки - 3-1-2.

1 Ответ

0 голосов
/ 06 мая 2020

Debug log order is 3-1-2.

Похоже, что PlayFabClientAPI.GetLeaderboard() выполняется asyn c или в фоновом потоке.

строки

Debug.LogError(topScoreOnLeaderboard); // 3- But here it gives 0.
return topScoreOnLeaderboard;

просто достигнуто до того, как результат действительно пришел.


Вам нужно подождать, пока результат не будет достигнут, чтобы продолжить.

Я бы использовал его, например, через Action<int> как

public void GetLeaderboardListAsync(Action<int> onResult)
{
    var request = new GetLeaderboardRequest();
    request.StartPosition = 0;
    request.StatisticName = QuizButtonClicked.clickedButtonQuiz.name; // the button that the user has clicked.
    request.MaxResultsCount = 20;
    PlayFabClientAPI.GetLeaderboard(request, (result) =>
    {
        var resultValue = result.Leaderboard.ElementAt(0).StatValue;
        Debug.Log(resultValue);
        onResult?.Invoke(resltValue);
    }, (error) =>
    {
        Debug.LogError(error.GenerateErrorReport());
    });
}

А затем вместо этого измените свой код, в котором вы его вызываете, на что-то вроде

GetLeaderboardListAsync(OnLeaderBoardTopAvailable);


private void OnLeaderBoardTopAvailable(int topValue)
{
    // Whatever should happen once you have the index
}

Кстати: будьте осторожны с Debug.LogError, так как это также может помешать выполнению кода в дальнейшем . Скорее используйте Debug.LogWarning, который всегда продолжает выполнение кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...