Ranglisten in Unity-Spielen

In diesem Artikel wird beschrieben, wie Sie 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 in der Anleitung zu Bestenlisten für die Play-Spieldienste. Fügen Sie nach dem Erstellen einer Bestenliste die zugehörige Android-Ressource zum Plug-in hinzu, wie im Startleitfaden 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 dies jedoch eine Play Spiele-Erweiterung ist, 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, insgesamt) 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. Mitglieder: 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. 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 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

Jeder Score enthält die userId des Spielers, der den Score erstellt hat. Mit Social.LoadUsers() kannst du das Spielerprofil laden. Denk daran, dass der Inhalt des Spielerprofils den Datenschutzeinstellungen der Spieler unterliegt.

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