In diesem Thema wird beschrieben, wie Sie Play-Spieldienste-Bestenlisten in Unity-Spielen verwenden.
Vorbereitung
Richten Sie Ihr Unity-Projekt und das Google Play-Spiele-Plug-in für Unity ein. Weitere Informationen finden Sie im Startleitfaden.
Ereignisse erstellen
Sie erstellen Bestenlisten in der Google Play Console. Weitere Informationen finden Sie im Leitfaden zu Bestenlisten für Play-Spieldienste. Nachdem Sie eine Bestenliste erstellt haben, fügen Sie ihre Android-Ressource dem Plug-in hinzu, wie im Startleitfaden beschrieben.
Punktzahl in einer Bestenliste posten
Rufen Sie Social.ReportScore auf, um eine Punktzahl in einer Bestenliste zu posten.
using GooglePlayGames;
using UnityEngine.SocialPlatforms;
...
// Post score 12345 to leaderboard ID "Cfji293fjsie_QA")
Social.ReportScore(12345, "Cfji293fjsie_QA", (bool success) => {
// Handle success or failure
});
Wenn Sie einen Score posten und ein Metadaten-Tag einfügen möchten, verwenden Sie direkt eine PlayGamesPlatform-Instanz:
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
});
Die Plattform und der Server verwerfen automatisch Punktzahlen, die niedriger als der bestehende Highscore des Spielers sind. Sie können also Punktzahlen ohne Überprüfung einreichen, um zu testen, ob die Punktzahl höher als die bestehende Punktzahl des Spielers ist.
Bestenliste anzeigen
Wenn Sie die integrierte Benutzeroberfläche für alle Bestenlisten anzeigen möchten, rufen Sie Social.ShowLeaderboardUI auf.
using GooglePlayGames;
using UnityEngine.SocialPlatforms;
...
// Show leaderboard UI
Social.ShowLeaderboardUI();
Wenn Sie nur ein bestimmtes Leaderboard anstelle aller Leaderboards anzeigen möchten, können Sie eine Leaderboard-ID an die Methode übergeben. Da es sich jedoch um eine Play-Spiele-Erweiterung handelt, muss das Social.Active-Objekt zuerst in ein PlayGamesPlatform-Objekt umgewandelt werden:
using GooglePlayGames;
using UnityEngine.SocialPlatforms;
...
// Show leaderboard UI
PlayGamesPlatform.Instance.ShowLeaderboardUI("Cfji293fjsie_QA");
Auf Bestenlistendaten zugreifen
Es gibt zwei Methoden zum Abrufen der Daten für die Bestenliste.
Social.ILeaderboard verwenden
Bei dieser Methode wird die ILeaderboard-Schnittstelle verwendet, um den Umfang und die Filter für den Abruf der Daten zu definieren. Mit diesem Ansatz können Sie Folgendes konfigurieren: 1. Die Bestenlisten-ID 2. Die Erhebung (sozial oder öffentlich) 3. Der Zeitraum (täglich, wöchentlich, insgesamt) 4. Die Rangposition, ab der Werte abgerufen werden sollen. 5. Die Anzahl der Werte (Standardwert ist 25). 6. Nach Nutzer-ID filtern.
Wenn der Parameter „from“ nicht positiv ist, sind die zurückgegebenen Ergebnisse spielerzentriert. Das bedeutet, dass die Punktzahlen um die Punktzahl des aktuellen Spielers herum zurückgegeben werden.
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() verwenden
Bei dieser Methode wird PlayGamesPlatform direkt verwendet, was beim Zugriff auf die Bestenlistendaten zusätzliche Flexibilität und Informationen bietet.
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;
});
Die Parameter für LoadScores() sind:
- leaderboardId
- Startposition (Bestleistungen oder Spieler im Mittelpunkt)
- Zeilenanzahl
- Bestenlistensammlung (sozial oder öffentlich)
- Zeitspanne (täglich, wöchentlich, insgesamt)
- Callback, der ein LeaderboardScoreData-Objekt akzeptiert.
Die Klasse LeaderboardScoreData wird verwendet, um Informationen an den Aufrufer zurückzugeben, wenn Ergebnisse geladen werden. Die Mitglieder sind:
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;
});
}
Dieser Aufruf kann beim Versuch, Freunde mit ResponseCode.ResolutionRequired
zu laden, fehlschlagen, wenn der Nutzer seine Freundesliste nicht für das Spiel freigegeben hat. Verwenden Sie in diesem Fall AskForLoadFriendsResolution
, um Zugriff anzufordern.
Spielernamen abrufen
Jeder Punktzahl ist die userId des Spielers zugeordnet, der die Punktzahl erreicht hat. Sie können das Spielerprofil mit Social.LoadUsers()
laden. Die Inhalte des Spielerprofils unterliegen den Datenschutzeinstellungen der Spieler.
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);
});
}