Таблицы лидеров в играх 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 для запроса доступа.

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

Каждый результат имеет идентификатор пользователя (userId), который его заработал. Вы можете использовать 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);
            });
    }