Ranglisten in Unity-Spielen

In diesem Abschnitt wird beschrieben, wie Sie die Bestenlisten der Play-Spieldienste 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. Fügen Sie dem Plug-in nach dem Erstellen einer Bestenliste die entsprechende Android-Ressource hinzu, wie im Startleitfaden beschrieben.

Punktzahl in einer Bestenliste posten

Um eine Punktzahl in einer Bestenliste zu posten, rufen Sie 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
    });

Um eine Punktzahl zu posten und ein Metadaten-Tag einzufügen, 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 unter dem vorhandenen Highscore des Spielers liegen. So können Sie Punktzahlen frei und ohne Überprüfungen einreichen, um zu prüfen, ob die Punktzahl höher als die aktuelle Punktzahl des Spielers ist.

Bestenlisten-Benutzeroberfläche anzeigen

Um die integrierte Benutzeroberfläche für alle Bestenlisten anzuzeigen, rufen Sie Social.ShowLeaderboardUI auf.

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

Wenn statt aller Bestenlisten eine bestimmte Bestenliste angezeigt werden soll, kannst du eine Bestenlisten-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 Leaderboard-Daten zugreifen

Es gibt zwei Methoden, um die Daten der Bestenliste abzurufen.

Social.ILeaderboard verwenden

Bei dieser Methode werden über die Schnittstelle ILeaderboard der Umfang und die Filter für den Datenabruf definiert. Bei diesem Ansatz können Sie Folgendes konfigurieren: 1. Die Bestenlisten-ID 2. Die Sammlung (soziale oder öffentliche) 3. Der Zeitraum (täglich, wöchentlich, All-Time) 4. Die Rangposition für das Abrufen von Punktzahlen. 5. Die Anzahl der Bewertungen (Standardwert ist 25). 6. Nach Nutzer-ID filtern.

Wenn der from-Parameter nicht positiv ist, stehen die Ergebnisse auf den Spieler in der Mitte. Das bedeutet, dass die Punktzahlen rund um die Punktzahl des aktuellen Spielers 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 direkt PlayGamesPlatform verwendet, was zusätzliche Flexibilität und Informationen beim Zugriff auf die Daten der Bestenliste 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:

  1. leaderboardId
  2. Startposition (Top-Spielstände oder Spieler in der Mitte)
  3. Zeilenanzahl
  4. Bestenlisten-Sammlung (soziale oder öffentlich)
  5. Zeitspanne (täglich, wöchentlich, insgesamt)
  6. Callback, der ein LeaderboardScoreData-Objekt akzeptiert

Mit der Klasse LeaderboardScoreData werden beim Laden von Punktzahlen Informationen an den Aufrufer zurückgegeben. Folgende Mitglieder sind aufgeführt: 1. Id: die ID der Bestenliste 2. Gültig – „true“, wenn die zurückgegebenen Daten gültig sind (der Aufruf war erfolgreich). 3. Status: der ResponseStatus des Aufrufs 4. Ungefährer Anzahl: Die ungefähre Anzahl der Punktzahlen in der Bestenliste. 5. Title: Titel der Bestenliste 6. PlayerScore: der Punktestand des aktuellen Spielers 7. Punktzahlen – die Liste der Punktzahlen 8. PrevPageToken – ein Token, mit dem LoadMoreScores() aufgerufen werden kann, um die vorherige Seite mit Punktzahlen abzurufen. 9. NextPageToken – ein Token, mit dem LoadMoreScores() aufgerufen werden kann, um die nächste Seite mit Punktzahlen zu erhalten.

    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, wenn der Nutzer seine Freundesliste nicht für das Spiel freigegeben hat. Fordern Sie in diesem Fall mit AskForLoadFriendsResolution den Zugriff an.

Spielernamen abrufen

Jede Punktzahl enthält die userID des Spielers, der die Punktzahl vergeben hat. Du kannst Social.LoadUsers() verwenden, um das Spielerprofil zu laden. Denken Sie 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);
            });
    }