Mehr Bestenlisten
In diesem Tutorial werden erweiterte Features behandelt, die der Dienst zu bieten hat, z. B. das Erstellen von mehrspaltigen Bestenlisten, erweiterte Verknüpfungen und mehrere Möglichkeiten zum Abfragen der Bestenliste.
In diesem Beispiel gehen wir davon aus, dass alles, was hier in Create Basic Leaderboard dargestellt wird, vertraut ist. Wir beginnen mit einem stark kompetitiven Shooter als Beispiel dafür, wie uns diese neuen Features helfen könnten, einige Probleme zu lösen. In diesem Spiel gibt es einen Modus namens Team Death Match, der aus zwei Teams besteht, die sich gegenüberstehen. Wer zuerst zu 75 Ausscheidungen kommt, ist der Gewinner. Jetzt basiert dieses Spiel nicht auf einer einzelnen Punktzahl, um Spieler zu bewerten. stattdessen basiert es auf der Anzahl der Eliminierungen, Hilfen und Todesfälle, um zu definieren, wer der Beste ist.
Erstellen einer Mehrspalten-Bestenlistendefinition
Um mit diesem Beispiel zu beginnen, müssen wir eine komplexere Leaderboard-Definition erstellen als die zuvor. Wir definieren mehrere Spalten, um die wichtigsten Aspekte des Spiels zuzuordnen: Eliminierungen, Hilfen und Todesfälle. Das folgende Beispiel zeigt, wie Sie die Bestenlistendefinition mithilfe des C#-SDK erstellen.
public static async Task CreateLeaderboardDefinitionAsync(PlayFabAuthenticationContext context, string leaderboardName)
{
PlayFabProgressionInstanceAPI leaderboardsAPI = new PlayFabProgressionInstanceAPI(context);
CreateLeaderboardDefinitionRequest leaderboardDefinitionRequest = new CreateLeaderboardDefinitionRequest()
{
AuthenticationContext = context,
Name = leaderboardName,
SizeLimit = 1000,
EntityType = "title_player_account",
VersionConfiguration = new VersionConfiguration()
{
MaxQueryableVersions = 1,
ResetInterval = ResetInterval.Manual,
},
Columns = new List<LeaderboardColumn>()
{
new LeaderboardColumn()
{
Name = "Eliminations",
SortDirection = LeaderboardSortDirection.Descending,
},
new LeaderboardColumn()
{
Name = "Assists",
SortDirection = LeaderboardSortDirection.Descending,
}
new LeaderboardColumn()
{
Name = "Deaths",
SortDirection = LeaderboardSortDirection.Ascending,
}
}
};
PlayFabResult<PlayFab.LeaderboardsModels.EmptyResponse> createLbDefinitionResult = await leaderboardsAPI.CreateLeaderboardDefinitionAsync(leaderboardDefinitionRequest);
}
Lassen Sie uns nun einige wichtige Elemente dieses Beispiels erläutern:
-
SizeLimit
: Dieser Parameter wird verwendet, um die Anzahl der Zeilen einzuschränken, die die Bestenliste enthalten kann. Der Wert hier ist nur ein Beispiel. -
VersionConfiguration
: Dieser Parameter ermöglicht die Versionsverwaltung in unseren Bestenlisten. Weitere Informationen finden Sie auf dieser Seite: Saisonale Bestenlisten -
Columns
: Mit diesem Parameter können wir mehrere Spalten definieren. Wie Sie sehen können, richten wir Eliminierungen, Hilfen und Todesfälle ein. Ein wichtiges Element ist hier derSortDirection
Parameter, mit dem wir die Sortierung der Bestenliste bestimmen können. In diesem Beispiel wird ein Spieler höher eingestuft, wenn er mehr Eliminierungen und Assists (SortDirection = Absteigend) und weniger Todesfälle (SortDirection = Ascending) hat.
Weitere Informationen zu anderen Parametern oder zum Verwalten von Bestenlistendefinitionen finden Sie unter Erstellen einer einfachen Bestenliste.
Externe Entitäten einbinden
Der Leaderboard-Dienst kann als eigenständige Komponente verwendet werden, die externe Entitäten unterstützt, die nur im Kontext des Spiels sinnvoll sind. Wenn Ihre Spieleridentitäten nicht an die PlayFab-Anmeldung gebunden sind, können Sie trotzdem den Bestenlistendienst verwenden. Der Entitätstyp für die Einträge auf der Bestenliste außerhalb des PlayFab-Systems muss extern sein. Die entityId ist dann die Identität des Spielers in Ihrem System. In diesen Fällen müssen alle Einträge in der Bestenliste externe Entitäten sein.
Hinzufügen von Daten zu einer Bestenliste
Nachdem wir nun unsere Bestenliste erstellt haben, fügen wir Daten hinzu. Der Standard Unterschied zu unserem vorherigen Tutorial zu diesem Thema besteht darin, dass wir jetzt drei verschiedene Bewertungen in derselben Zeile hinzufügen müssen. Das folgende Beispiel zeigt, wie Sie unserer Bestenliste mithilfe des C#-SDK Daten hinzufügen.
public static async Task UpdateLeaderboardForPlayer(PlayFabAuthenticationContext context, string leaderboardName, string entityId, int score)
{
PlayFabProgressionInstanceAPI leaderboardsAPI = new PlayFabProgressionInstanceAPI(context);
UpdateLeaderboardEntriesRequest updateLeaderboardRequest = new UpdateLeaderboardEntriesRequest()
{
Entries = new List<LeaderboardEntryUpdate>()
{
new LeaderboardEntryUpdate()
{
EntityId = entityId,
Scores = new List<string> { score.ToString(), (score + 1).ToString(), (score + 2).ToString() },
Metadata = "metadata",
}
},
AuthenticationContext = context,
LeaderboardName = leaderboardName,
};
PlayFabResult<PlayFab.LeaderboardsModels.EmptyResponse> updateResult = await leaderboardsAPI.UpdateLeaderboardEntriesAsync(updateLeaderboardRequest);
}
Wichtig zu beachten ist, dass der Scores-Parameter drei Werte erhält. Die Länge der Liste der Bewertungen, die für einen Eintrag angegeben wird, muss mit der Anzahl der Spalten der Bestenlistendefinition übereinstimmen. Jeder der Werte muss eine gültige 64-Bit-Ganzzahl sein (die Zeichenfolgendarstellung dient nur dazu, sicherzustellen, dass alle Clients 64-Bit-Werte verarbeiten können).
Abrufen von Daten aus einer Bestenliste
Nun lernen wir verschiedene Möglichkeiten zum Abfragen einer Bestenliste kennen. Alle von ihnen haben einen bestimmten Zweck mit der Absicht, Entwicklern zu helfen, die Spieler, die sie benötigen, im Spiel anzuzeigen.
Abrufen einer Bestenliste um eine Entität
Diese spezielle Methode zum Abfragen der Bestenliste ermöglicht es uns, einen Abschnitt der Bestenliste in der Nähe einer bestimmten Entität zu erhalten. Eine praktische Möglichkeit, dieses Szenario zu sehen, ist, wenn wir eine riesige Bestenliste haben und nur dem Spieler, der im Spiel aktiv ist, relevante Informationen anzeigen möchten. Wenn sich der Spieler an position 1000 befindet, können wir die nahen Nachbarn anstelle der Top-Spieler anzeigen. Das folgende Beispiel zeigt, wie Sie eine Bestenliste um eine Entität mithilfe des C#-SDK abfragen.
public static async Task<List<EntityLeaderboardEntry>> GetLeaderboardAroundEntity(PlayFabAuthenticationContext context, string leaderboardName, string entityId)
{
PlayFabProgressionInstanceAPI leaderboardsAPI = new PlayFabProgressionInstanceAPI(context);
GetLeaderboardAroundEntityRequest getLbRequest = new GetLeaderboardAroundEntityRequest()
{
LeaderboardName = leaderboardName,
AuthenticationContext = context,
Entity = new PlayFab.LeaderboardsModels.EntityKey()
{
Id = entityId,
Type = EntityType
},
MaxSurroundingEntries = 20,
};
PlayFabResult<GetEntityLeaderboardResponse> lbResponse = await leaderboardsAPI.GetLeaderboardAroundEntityAsync(getLbRequest);
return lbResponse.Result.Rankings;
}
Das wichtigste Element ist hier das MaxSurroundingEntries
, mit dem wir Entitäten, die um eine bestimmte Entität ranken, aus der Bestenliste extrahieren können. Wenn wir beispielsweise einen Spieler an der Position 100 haben und die MaxSurroundingEntries
= 20 verwenden, werden Spieler von der Position 90 bis 110 abgerufen. Wenn sich der Spieler ganz oben in der Bestenliste befindet, ruft er die besten 20 Ergebnisse ab. Wenn sich der Spieler unten befindet, ruft er die letzten 20 Ergebnisse ab. Wenn die Positionen oben und unten in der Bestenliste nicht angezeigt werden, versucht die API sicherzustellen, dass sich die Entität, um die die Rangfolge angefordert wird, in der Mitte der abgerufenen Positionen befindet.
Abrufen der Bestenliste für Entitäten
Diese API bietet eine weitere Möglichkeit zum Abfragen der Bestenliste. Dies funktioniert immer dann, wenn wir einen Fall haben, in dem wir mehrere Entitäten in der Bestenliste durchsuchen und sortieren möchten. Das folgende Beispiel zeigt, wie Sie eine Bestenliste für eine Liste von Entitäten mithilfe des C#-SDK abfragen.
public static async Task<List<EntityLeaderboardEntry>> GetLeaderboardForEntities(PlayFabAuthenticationContext context, string leaderboardName, List<string> entityIds)
{
PlayFabProgressionInstanceAPI leaderboardsAPI = new PlayFabProgressionInstanceAPI(context);
GetLeaderboardForEntitiesRequest getLbRequest = new GetLeaderboardForEntitiesRequest()
{
LeaderboardName = leaderboardName,
AuthenticationContext = context,
EntityIds = entityIds,
};
PlayFabResult<GetEntityLeaderboardResponse> lbResponse = await leaderboardsAPI.GetLeaderboardForEntitiesAsync(getLbRequest);
return lbResponse.Result.Rankings;
}
Bestenlisten für Freunde erhalten
Es kann Fälle geben, in denen einige Gelegenheitsspieler kommen und ein Spiel spielen. Sie sind vielleicht weit weg von der Spitze der Bestenliste, aber unter ihren Freunden haben sie einen Wettbewerb im Gange. Mit dieser API können wir die Bestenliste abfragen und die Freunde des Spielers finden.
public static async Task<List<EntityLeaderboardEntry>> GetFriendLeaderboardForEntity(PlayFabAuthenticationContext context, string leaderboardName, string entityId)
{
PlayFabProgressionInstanceAPI leaderboardsAPI = new PlayFabProgressionInstanceAPI(context);
GetFriendLeaderboardForEntityRequest getLbRequest = new GetFriendLeaderboardForEntityRequest()
{
LeaderboardName = leaderboardName,
Entity = new PlayFab.LeaderboardsModels.EntityKey()
{
Id = entityId,
Type = EntityType
},
};
PlayFabResult<GetEntityLeaderboardResponse> lbResponse = await leaderboardsAPI.GetFriendLeaderboardForEntityAsync(getLbRequest);
return lbResponse.Result.Rankings;
}
Es gibt mehrere Möglichkeiten, Freunde aus den PlayFab-Diensten zu erhalten. Weitere Informationen zu den verfügbaren Parametern finden Sie in der API-Referenz.
Verbessern des Tiebreaks
In unserem Beispiel eines stark kompetitiven Shooters gibt es Fälle, in denen mehrere Spieler die gleiche Anzahl von Ausscheidungen haben könnten. Für diese Szenarien müssen wir eine andere Möglichkeit haben, diese Fälle zu verknüpfen. In diesem Szenario kommt die erweiterte Tiebreak-Funktionalität ins Spiel.
Wenn Sie eine Bestenlistendefinition erstellen, können Mehrere Spalten vorhanden sein. Die Art und Weise, wie Sie sie hinzufügen, bestimmt, wie einige Szenarien sortiert und miteinander verknüpft werden. Es gibt eine Rangfolge, in der die erste hinzugefügte Spalte die wichtigste ist, dann die zweite usw. Dieses Szenario übersetzt sich in unserem Beispiel, dass das zweite Kriterium die Anzahl der Hilfen und das letzte Kriterium todesfälle ist, wenn es eine Gleichschaltung gibt. Im Extremfall, dass das Unentschieden weiterhin besteht, wird standardmäßig der Zeitstempel verwendet, wer zuerst die Punktzahl erreicht hat.
Rang | Entitäts-ID | Eliminierungen | Unterstützt | Todesfälle | LastUpdated |
---|---|---|---|---|---|
1 | "Spieler 3" | 103 | 24 | 15 | "2024-08-27T20:24:36.738Z" |
2 | "Spieler 2" | 102 | 30 | 20 | "2024-08-27T20:24:29.251Z" |
3 | "Spieler 1" | 100 | 25 | 18 | "2024-08-27T19:52:26.642Z" |
4 | "Spieler 4" | 100 | 25 | 18 | "2024-08-27T20:24:44.552Z" |
4 | "Spieler 5" | 100 | 25 | 19 | "2024-08-27T20:25:47.552Z" |
In diesem Beispiel haben wir eine Unentschiedenheit zwischen drei Spielern:
- "Spieler 5": Obwohl sie die gleiche Anzahl von Eliminierungen und Assists haben, haben sie mehr Todesfälle, was bedeutet, dass sie am ende der Bestenliste stehen.
- "Spieler 4": Dieser Spieler hat weniger Todesfälle als "Spieler 5" und den gleichen Betrag wie "Spieler 1", aber Spieler 1 hat zuerst diese Zahlen erhalten.
- "Spieler 1": Obwohl dieser Spieler die gleichen Zahlen wie "Spieler 4" hatte, war er der erste, der diese Punktzahl im Spiel erreicht hat, daher wird er in diesem Tie-Break-Szenario höher eingestuft.
Schlüsse
In diesem Tutorial haben wir gelernt, wie die folgenden Vorgänge ausgeführt werden:
- Erstellen Sie eine mehrspaltige Bestenliste.
- Überprüfen Sie die verschiedenen Abfragemöglichkeiten.
- Machen Sie sich mit dem Mechanismus zum Verbessern des Verbindungsbruchs vertraut.