Ranglisten in Unity-Spielen

In diesem Thema wird beschrieben, wie Sie Bestenlisten von Play Spiele-Diensten 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

Bestenlisten werden in der Google Play Console erstellt. Weitere Informationen finden Sie im Leitfaden zu Bestenlisten für Play-Spieldienste. Nachdem du eine Bestenliste erstellt hast, füge dem Plug-in die Android-Ressource hinzu, wie im Einstiegsleitfaden beschrieben.

Punktzahl in einer Bestenliste posten

Wenn du einen Wert in einer Bestenliste posten möchtest, rufe Social.ReportScore auf.

    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 du eine Bewertung posten und ein Metadaten-Tag einfügen möchtest, verwende 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
    });

Hinweis: Die Plattform und der Server verwerfen automatisch Punkte, die niedriger sind als der bestehende Highscore des Spielers. Sie können also Punkte frei einreichen, ohne zu prüfen, ob der Wert höher als der bestehende Wert des Spielers ist.

Bestenlisten-Benutzeroberfläche anzeigen

Wenn du die integrierte Benutzeroberfläche für alle Bestenlisten anzeigen möchtest, ruf Social.ShowLeaderboardUI auf.

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

Wenn Sie anstelle aller Leaderboards ein bestimmtes Leaderboard anzeigen möchten, können Sie der Methode eine Leaderboard-ID ü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, um die Bestenliste-Punktedaten abzurufen.

Social.ILeaderboard verwenden

Bei dieser Methode wird die ILeaderboard-Schnittstelle verwendet, um den Umfang und die Filter für das Abrufen der Daten zu definieren. Mit diesem Ansatz können Sie Folgendes konfigurieren: 1. Die Bestenlisten-ID 2. Die Sammlung (sozial oder öffentlich) 3. Der Zeitraum (täglich, wöchentlich, seit Beginn) 4. Die Rangposition, ab der die Bewertungen abgerufen werden sollen. 5. Die Anzahl der Bewertungen (Standardwert: 25). 6. Nach Nutzer-ID filtern.

Wenn der Parameter „from“ nicht positiv ist, sind die zurückgegebenen Ergebnisse spielerzentriert, d. h., es werden die Ergebnisse um den Wert des aktuellen Spielers zurückgegeben.

    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. Das bietet zusätzliche Flexibilität und Informationen beim Zugriff auf die Bestenlistendaten.

    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:

  1. leaderboardId
  2. Startposition (Top-Punkte oder Spielerzentriert)
  3. Zeilenanzahl
  4. Bestenlistensammlung (sozial oder öffentlich)
  5. Zeitraum (täglich, wöchentlich, seit Beginn)
  6. Callback, der ein LeaderboardScoreData-Objekt akzeptiert.

Die Klasse LeaderboardScoreData wird verwendet, um beim Laden von Bewertungen Informationen an den Aufrufer zurückzugeben. Die Mitglieder sind: 1. ID: die Bestenlisten-ID 2. Valid: „true“, wenn die zurückgegebenen Daten gültig sind (der Aufruf war erfolgreich) 3. Status: Der ResponseStatus des Anrufs. 4. ApproximateCount – die ungefähre Anzahl der Punkte in der Bestenliste 5. Titel: Der Titel der Bestenliste. 6. „PlayerScore“ – der Punktestand des aktuellen Spielers 7. „Punkte“ – Liste der Punkte 8. PrevPageToken: Ein Token, mit dem LoadMoreScores() aufgerufen werden kann, um die vorherige Seite mit Ergebnissen abzurufen. 9. NextPageToken: Ein Token, mit dem LoadMoreScores() aufgerufen werden kann, um die nächste Seite mit Bewertungen abzurufen.

    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 fehlschlagen, wenn versucht wird, Freunde mit ResponseCode.ResolutionRequired zu laden, der Nutzer seine Freundesliste aber nicht für das Spiel freigegeben hat. Verwenden Sie in diesem Fall AskForLoadFriendsResolution, um Zugriff anzufordern.

Spielernamen abrufen

Jede Punktzahl enthält die userId des Spielers, der den Punkt erzielt hat. Mit Social.LoadUsers() kannst du das Spielerprofil laden. Denk daran, dass die Inhalte des Spielerprofils den Datenschutzeinstellungen der Spieler unterliegen.

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