В этой теме описывается, как использовать таблицы лидеров Play Games Services в играх Unity.
Прежде чем начать
Настройте свой проект Unity и плагин Google Play Games для Unity. Подробности см. в руководстве по началу работы .
Создавать события
Таблицы лидеров создаются в Google Play Console. Подробнее см. в руководстве по таблицам лидеров для игровых сервисов 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.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():
- LeaderboardId
- начальная позиция (лучшие результаты или игрок в центре)
- количество строк
- сбор рейтингов (социальных или публичных)
- временной промежуток (ежедневно, еженедельно, за все время)
- обратный вызов, принимающий объект 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);
});
}