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

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

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

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

Создавайте события

Вы создаете таблицы лидеров в консоли Google Play. Подробную информацию см. в руководстве по таблицам лидеров для игровых сервисов Play. После создания таблицы лидеров добавьте в плагин ее ресурс 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.ILaderboard

Этот метод использует интерфейс 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. Идентификатор таблицы лидеров
  2. стартовая позиция (лучшие результаты или по центру игрока)
  3. количество строк
  4. коллекция лидеров (социальная или общедоступная)
  5. временной интервал (ежедневно, еженедельно, постоянно)
  6. обратный вызов, принимающий объект LeaderboardScoreData.

Класс LeaderboardScoreData используется для возврата информации вызывающему объекту при загрузке результатов. Членами являются: 1. Id — идентификатор таблицы лидеров. 2. Valid — true, если возвращенные данные действительны (вызов был успешным). 3. Status — ResponseStatus вызова. 4. ApproximateCount — приблизительное количество очков в таблице лидеров. 5. . Title — заголовок таблицы лидеров 6. PlayerScore — результат текущего игрока 7. Scores — список результатов 8. PrevPageToken — токен, который можно использовать для вызова LoadMoreScores() для получения предыдущей страницы результатов. 9. NextPageToken — токен, который можно использовать для вызова LoadMoreScores() для получения следующей страницы результатов.

    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);
            });
    }