Таблицы лидеров в играх Unity

В этой теме описывается, как использовать таблицы лидеров Play Games Services в играх Unity.

Прежде чем начать

Настройте свой проект Unity и плагин Google Play Games для Unity. Подробности см. в руководстве по началу работы .

Создать события

Вы создаете таблицы лидеров в Google Play Console. Подробности см. в руководстве по таблицам лидеров для Play Games Services. После создания таблицы лидеров добавьте ее ресурс Android в плагин, как описано в руководстве по началу работы .

Опубликовать счет в таблице лидеров

Чтобы опубликовать результат в таблице лидеров, вызовите Social.ReportScore .

    using GooglePlayGames;
    using UnityEngine.SocialPlatforms;
    ...
    // Post score 12345 to leaderboard ID "Cfji293fjsie_QA")
    Social.ReportScore(12345, "Cfji293fjsie_QA", (bool success) => {
        // Handle success or failure
    });

Чтобы опубликовать счет и включить тег метаданных, используйте экземпляр PlayGamesPlatform напрямую:

    using GooglePlayGames;
    using UnityEngine.SocialPlatforms;
    ...
    // Post score 12345 to leaderboard ID "Cfji293fjsie_QA" and tag "FirstDaily")
    PlayGamesPlatform.Instance.ReportScore(12345, "Cfji293fjsie_QA", "FirstDaily", (bool success) => {
        // Handle success or failure
    });

Обратите внимание, что платформа и сервер автоматически отбрасывают результаты, которые ниже текущего рекорда игрока, поэтому вы можете отправлять результаты свободно, без каких-либо проверок на предмет того, превышает ли результат текущий рекорд игрока.

Показать пользовательский интерфейс таблицы лидеров

Чтобы отобразить встроенный пользовательский интерфейс для всех таблиц лидеров, вызовите Social.ShowLeaderboardUI .

    using GooglePlayGames;
    using UnityEngine.SocialPlatforms;
    ...
    // Show leaderboard UI
    Social.ShowLeaderboardUI();

Если вы хотите показать определенную таблицу лидеров вместо всех таблиц лидеров, вы можете передать идентификатор таблицы лидеров в метод. Однако это расширение Play Games, поэтому объект Social.Active сначала нужно привести к объекту PlayGamesPlatform :

    using GooglePlayGames;
    using UnityEngine.SocialPlatforms;
    ...
    // Show leaderboard UI
    PlayGamesPlatform.Instance.ShowLeaderboardUI("Cfji293fjsie_QA");

Доступ к данным таблицы лидеров

Существует 2 метода получения данных о результатах таблицы лидеров.

Используйте Social.ILeaderboard

Этот метод использует интерфейс ILeaderboard для определения области действия и фильтров для получения данных. Этот подход позволяет вам настроить: 1. Идентификатор таблицы лидеров 2. Коллекцию (социальную или публичную) 3. Временные рамки (ежедневно, еженедельно, за все время) 4. Позицию рейтинга для начала получения баллов. 5. Количество баллов (по умолчанию 25). 6. Фильтр по идентификатору пользователя.

Если параметр from неположительный, то возвращаемые результаты будут ориентированы на игрока, то есть будут возвращены результаты, близкие к текущему результату игрока.

    ILeaderboard lb = PlayGamesPlatform.Instance.CreateLeaderboard();
    lb.id = "MY_LEADERBOARD_ID";
    lb.LoadScores(ok =>
        {
            if (ok) {
                LoadUsersAndDisplay(lb);
            }
            else {
                Debug.Log("Error retrieving leaderboardi");
            }
        });

Используйте PlayGamesPlatform.LoadScores()

Этот метод напрямую использует PlayGamesPlatform , что обеспечивает дополнительную гибкость и информацию при доступе к данным таблицы лидеров.

    PlayGamesPlatform.Instance.LoadScores(
            GPGSIds.leaderboard_leaders_in_smoketesting,
            LeaderboardStart.PlayerCentered,
            100,
            LeaderboardCollection.Public,
            LeaderboardTimeSpan.AllTime,
            (data) =>
            {
                mStatus = "Leaderboard data valid: " + data.Valid;
                mStatus += "\n approx:" +data.ApproximateCount + " have " + data.Scores.Length;
            });

Параметры для LoadScores():

  1. leaderboardId
  2. начальная позиция (лучшие результаты или игрок в центре)
  3. количество строк
  4. сбор рейтинга (социальный или публичный)
  5. временной промежуток (ежедневно, еженедельно, за все время)
  6. обратный вызов, принимающий объект LeaderboardScoreData.

Класс LeaderboardScoreData используется для возврата информации обратно вызывающей стороне при загрузке результатов. Членами являются:

1. Id - the leaderboard id
2. Valid - true if the returned data is valid (the call was successful)
3. Status - the ResponseStatus of the call
4. ApproximateCount - the approximate number of scores in the leaderboard
5. Title - the title of the leaderboard
6. PlayerScore - the score of the current player
7. Scores - the list of scores
8. PrevPageToken - a token that can be used to call `LoadMoreScores()` to
    get the previous page of scores.
9. NextPageToken - a token that can be used to call `LoadMoreScores()` to
    get the next page of scores.
    void GetNextPage(LeaderboardScoreData data)
    {
        PlayGamesPlatform.Instance.LoadMoreScores(data.NextPageToken, 10,
            (results) =>
            {
                mStatus = "Leaderboard data valid: " + data.Valid;
                mStatus += "\n approx:" +data.ApproximateCount + " have " + data.Scores.Length;
            });
    }

Этот вызов может завершиться неудачей при попытке загрузить друзей с помощью ResponseCode.ResolutionRequired , если пользователь не поделился своим списком друзей с игрой. В этом случае используйте AskForLoadFriendsResolution для запроса доступа.

Получить имена игроков

Каждый счет имеет идентификатор пользователя игрока, который сделал счет. Вы можете использовать Social.LoadUsers() для загрузки профиля игрока. Помните, что содержимое профиля игрока зависит от настроек конфиденциальности игроков.

    internal void LoadUsersAndDisplay(ILeaderboard lb)
    {
        // Get the user ids
        List<string> userIds = new List<string>();

        foreach(IScore score in lb.scores) {
            userIds.Add(score.userID);
        }
        // Load the profiles and display (or in this case, log)
        Social.LoadUsers(userIds.ToArray(), (users) =>
            {
                string status = "Leaderboard loading: " + lb.title + " count = " +
                    lb.scores.Length;
                foreach(IScore score in lb.scores) {
                    IUserProfile user = FindUser(users, score.userID);
                    status += "\n" + score.formattedValue + " by " +
                        (string)(
                            (user != null) ? user.userName : "**unk_" + score.userID + "**");
                }
                Debug.log(status);
            });
    }