Ranglisten in Unity-Spielen

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:

  1. leaderboardId
  2. Startposition (Bestleistungen oder Spieler im Mittelpunkt)
  3. Zeilenanzahl
  4. Bestenlistensammlung (sozial oder öffentlich)
  5. Zeitspanne (täglich, wöchentlich, insgesamt)
  6. 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);
            });
    }