Übersicht
Über Steam-Statistiken und -Errungenschaften können Spieler mühelos Statistiken und Errungenschaften für Ihr Spiel nachverfolgen. Nutzerdaten sind mit dem entsprechenden Steam-Account verknüpft. Die Statistiken und Errungenschaften jedes Nutzers können in dessen Steam-Communityprofil formatiert und angezeigt werden.
Verwendungszweck
Neben hochwertigen Belohnungen für Ihre Spieler sind Errungenschaften gut geeignet, anspornende und lohnende Spielerinteraktionen zu schaffen, da sie die Spielziele um neue Dimensionen erweitern und Benutzer dafür belohnen, dass sie mehr Zeit im Spiel verbringen.
Mit den Statistiken werden detaillierte Informationen erfasst, zum Beispiel die Spielzeit, die Anzahl verwendeter Powerups etc. Sie haben auch die Wahl, diese Informationen lediglich zum Aufzeichnen interner Spieldaten zu verwenden. Sie können beispielsweise Errungenschaften basierend auf Spielstatistiken vergeben, die ein Benutzer über mehrere Sitzungen und verschiedene Computer hinweg erzielt hat.
Übersicht zur Implementierung
Definieren von Statistiken und Errungenschaften für Ihr Spiel
Errungenschaften sind anwendungsspezifisch und werden in der Appverwaltung des Steamworks-Partners eingerichtet.
Sie können drei Typen von Statistiken für Ihr Spiel speichern:
- INT: Eine 32-Bit-Ganzzahl (mit Vorzeichen) (z. B. Anzahl von gespielten Spielen).
- FLOAT: Ein 32-Bit Gleitkommawert (z. B. Anzahl von gefahrenen Kilometern).
- AVGRATE: Ein gleitender Durchschnitt. Siehe: Der Statistik-Datentyp AVGRATE.
Die Steamworks-Partnerwebsite bietet eine Schnittstelle zum Definieren und Aktualisieren der Statistiken und Errungenschaften für Ihr Spiel. Sie ermöglicht Folgendes:
- Definition der Statistiken und Errungenschaften zu Beginn
- Hinzufügen weiterer Statistiken und Errungenschaften
- Aktualisieren der Namen, Beschreibungen und Symbole von Errungenschaften
- Aktualisieren von Parametern und Beschränkungen für Statistiken (Höchst-/Mindestwerte, Bereichsgrößen für gleitende Durchschnitte etc.)
Statistiken haben folgende Eigenschaften:
- ID: Eine automatisch generierte numerische ID für jede Statistik.
- Type: Der Typ dieser Statistik – INT, FLOAT, oder AVGRATE.
- API Name Der verwendete String zum API-Zugriff auf diese Statistik.
- Set By: Legt fest, wer die Statistik verändern darf. Der Standardwert ist „Client“. Weitere Informationen finden Sie unter Spielserverstatistiken.
- Increment Only: Wenn diese Eigenschaft gesetzt wurde, darf der Wert dieser Statstik nur im Verlauf der Zeit erhöht werden.
- Max Change: Wenn diese Eigenschaft gesetzt wurde, wird eine maximale Anzahl von Änderungen des Statistikwerts von einem SetStat-Aufruf zum nächsten festgelegt.
- Min Value: Wenn diese Eigenschaft gesetzt wurde, wird der minimale numerische Wert festgelegt, den diese Statistik annehmen kann. Standardmäßig entspricht dieser dem minimalen Wert des zugrunde liegenden numerischen Datentyps (INT_MIN oder -FLT_MAX).
- Max Value: Wenn diese Eigenschaft gesetzt wurde, wird der maximale numerische Wert festgelegt, den diese Statistik annehmen kann. Standardmäßig entspricht dieser dem maximalen Wert des zugrunde liegenden numerischen Datentyps (INT_MAX oder FLT_MAX).
- Default Value: Wenn diese Eigenschaft gesetzt wurde, ist dies der Standardwert, auf den diese Statistik für einen neuen Benutzer festgelegt wird. Wenn nicht gesetzt, ist der Standardwert null.
- Aggregated: Wenn diese Eigenschaft gesetzt wurde, speichert Steam einen globalen Gesamtwert für diese Statistik. Weitere Informationen finden Sie unter „Globale Statistiken“.
- Display Name Der Name dieser Statistik, wenn in Ihrer Anwendung angezeigt.
AVGRATE Statistiken haben folgende zusätzlichen Eigenschaften:
- Window: Größe des „gleitenden Bereichs“ zur Durchschnittsermittlung Ihrer Daten.
Steam bildet automatisch einen Durchschnittswert für eine
AVGRATE-Statistik. Weitere Information finden Sie im Abschnitt
AVGRATE unten.
Errungenschaften haben folgende Eigenschaften:
- ID: Eine automatisch generierte numerische ID für jede Errungenschaft.
- API Name: Der verwendete String zum API-Zugriff auf diese Errungenschaft.
- Progress Stat: Gibt eine Statistik an, die in der Community als Fortschrittsbalken für diese Errungenschaft angezeigt wird. Außerdem wird die Errungenschaft automatisch freigeschaltet, sobald die Statistik den Freischaltwert erreicht.
- Display Name: Der Name der Errungenschaft, wie er in Client-Benachrichtigungen und in der Community angezeigt wird. Dieser kann lokalisiert werden.
- Description: Eine Beschreibung dieser Errungenschaft zur Anzeige in der Community. Dieser kann lokalisiert werden.
- Set By: Legt fest, wer die Errungenschaft verändern darf. Der Standardwert ist „Client“. Weitere Informationen finden Sie unter Spielserverstatistiken.
- Hidden? Wenn „true“, ist eine „verborgene“ Errungenschaft auf der Communityseite des Benutzers erst sichtbar, wenn er sie freigeschaltet hat.
- Achieved Icon: Das Symbol der erreichten Errungenschaft.
- Unachieved Icon: Das bei Nichterreichen der Errungenschaft angezeigte Symbol.
Im Folgenden finden Sie die Liste der Errungenschaften aus
Steamworks-API-Beispielanwendung (SpaceWar):
.
Besondere Hinweise
- Namen und Symbole von Errungenschaften sollten für alle Altersstufen angemessen sein.
- Standardmäßig sind Spiele zunächst auf 100 Errungenschaften beschränkt. Sobald Ihre Anwendung die Schwelle für Profilfunktionen erreicht, können Sie weitere Errungenschaften hinzufügen.
Verwendung
Aufrufen der Statistiken und Errungenschaften aus dem Spiel heraus:
- Nach der Initialisierung der Steamworks-API können Sie die API für Statistiken und Errungenschaften verwenden, die in ISteamUserStats enthalten sind.
- Rufen Sie zu Beginn der Spielsitzung ISteamUserStats::RequestCurrentStats auf, um die Daten zu Statistiken und Errungenschaften des Benutzers aus dem Steam-Backend zu laden. Wenn die Daten verfügbar sind, erhalten Sie einen ISteamUserStats::UserStatsReceived_t-Rückruf.
- Verwenden Sie ISteamUserStats::GetStat und ISteamUserStats::GetAchievement, um die Daten zu durchlaufen und den Spielstatus zu initialisieren.
- Wenn Sie die Errungenschaften in Ihrem Spiel anzeigen möchten, können Sie mit ISteamUserStats::GetAchievementDisplayAttribute die lesbaren Eigenschaften der Errungenschaft abrufen, zum Beispiel den Namen („name“) und die Beschreibung („desc“). Diese Eigenschaften können auf der Steamworks-Partnerwebsite lokalisiert werden. Die zurückgegebenen Daten hängen von der Sprache ab, in der der Benutzer das Spiel ausführt. Sie können außerdem mit ISteamUserStats::GetAchievementIcon das Symbol der Errungenschaft abrufen oder mit ISteamUserStats::GetAchievementAndUnlockTime den Zeitpunkt abrufen, zu dem die jeweilige Errungenschaft freigeschaltet wurde.
- Rufen Sie bei jeder Änderung einer Statistik, insbesondere bevor die Änderungen dem Benutzer angezeigt werden, ISteamUserStats::SetStat oder ISteamUserStats::UpdateAvgRateStat auf. Diese Aufrufe ändern nur den speicherinternen Zustand von Steam und sind sehr ressourcenschonend. Dadurch kann Steam die Änderungen zwischen Sitzungen synchron halten, selbst wenn das Spiel abstürzt.
- Rufen Sie an bestimmten Punkten in Ihrem Spiel (z. B. an Checkpoints, Level-Übergängen) ISteamUserStats::StoreStats auf, um die Änderungen hochzuladen. Wenn die Daten verfügbar sind, erhalten Sie einen ISteamUserStats::UserStatsStored_t-Rückruf.
- Bei Errungenschaften mit Fortschrittsbalken verwenden Sie an signifikanten Punkten ISteamUserStats::IndicateAchievementProgress, um ein Popup mit dem Fortschritt anzuzeigen. Beispiel: Wenn 20 Siege benötigt werden, können Sie diesen Aufruf nach dem zehnten Sieg ausführen, um anzuzeigen, dass der Benutzer die Hälfte geschafft hat.
- Sobald eine oder mehrere Errungenschaften freigeschaltet wurden, rufen Sie für jede freigeschaltete Errungenschaft ISteamUserStats::SetAchievement und anschließend ISteamUserStats::StoreStats auf, um sie sofort hochzuladen. Ihr Spiel empfängt eine ISteamUserStats::UserStatsStored_t-Rückruf sowie eine ISteamUserStats::UserAchievementStored_t-Rückruf für jede freigeschaltete Errungenschaft. Im Steam-Overlay wird dem Benutzer eine Benachrichtigung angezeigt.
Der Statistik-Datentyp AVGRATE
Dieser Typ von Statistik bietet eine Reihe einmaliger und sehr nützlicher Funktionen, muss aber etwas detaillierter erläutert werden.
Angenommen, Sie möchten einen Durchschnittswert verfolgen, zum Beispiel „Verdiente Punkte pro Stunde“. Eine Methode wäre die Verwendung von zwei Statistiken: einmal „INT TotalPoints“ und einmal FLOAT „TotalPlayTimeHours“. Dann könnten Sie die Punkte durch die Stunden teilen und hätten die Punkte pro Stunde.
Der Nachteil besteht darin, dass der berechnete Durchschnittswert sich extrem langsam ändern wird, wenn der Spieler eine erhebliche Spielzeit angehäuft hat. Tatsächlich wird der Durchschnitt immer langsamer, je mehr Zeit der Benutzer im Spiel verbringt. Wenn der Benutzer 100 Stunden im Spiel verbracht hat, wird der berechnete Durchschnitt um etwa 50 Stunden „nachgehen“. Wenn er seine Fertigkeiten verbessert, fällt die Zunahme der Punkte pro Stunde nicht so hoch wie erwartet aus.
Mit dem Statistiktyp AVGRATE können Sie den Effekt eines „gleitenden Bereichs“ auf den Durchschnitt anwenden. Beispielsweise können Sie nur die letzten Stunden Spielzeit berücksichtigen, damit die Statistik die aktuelle Fertigkeitsstufe des Spielers genauer widerspiegelt.
Richten wir nun eine AVGRATE-Statistik für „Punkte pro Stunde“ ein, bei der nur die letzten 20 Stunden Spielzeit den Wert beeinflussen. Gehen Sie hierfür folgendermaßen vor:
- Hinweis: Da dieser Durchschnitt „pro Stunde“ gilt, sind die Zeiteinheiten aller mit dieser Statistik verknüpften Parameter „hours“. Dies gilt sowohl für die Bereichseigenschaft in der Statistik selbst als auch für den „dSessionLength“-Parameter, der unten an
UpdateAvgRateStat
übergeben wird.
- Erstellen Sie eine AVGRATE-Statistik namens „AvgPointsPerHour“ und eine Bereichseigenschaft 20.0 (diese Angabe ist in „hours“ (Stunden)).
- Rufen Sie nun an geeigneten Punkten im Spiel ISteamUserStats::UpdateAvgRateStat mit folgenden Parametern auf:
- pchName: „AvgPointsPerHour“
- flCountThisSession: Anzahl der Punkte, die der Spieler seit dem letzten Aufruf von UpdateAvgRateStat erzielt hat.
- dSessionLength: Die Spielzeit seit dem letzten Aufruf von UpdateAvgRateStat. Die Einheit muss dieselbe sein wie die Einheit in der Bereichseigenschaft der Statistik. In diesem Fall ist es „hours“ (Stunden).
- Beispiel: Wenn der Spieler in der letzten Runde, die 0,225 Stunden (13,5 Minuten) gedauert hat, 77 Punkte erzielt hat, ergibt sich
SteamUserStats()->UpdateAvgRateStat( "AvgPointsPerHour", 77, 0.225 )
.
Im Beispiel oben verwendet Steam den aktuellen Rundendurchschnitt von 342,2 Punkten pro Stunde (77 geteilt durch 0,225) und kombiniert ihn mit dem vorherigen Wert. Das Ergebnis gibt den Gesamtdurchschnitt für die letzten 20 Stunden Spielzeit des Spielers wieder. Wenn die Statistik für diesen Spieler zum ersten Mal erhoben würde, wäre der aktuelle Wert 342,2.
In diesem Beispiel wird „hours“ als Zeiteinheit verwendet, Sie können jedoch auch beliebige andere Zeiteinheiten verwenden. Beachten Sie aber, dass Sie diese Zeiteinheit konsistent als Basis sowohl für „dSessionLength“ als auch für die Bereichseigenschaft verwenden müssen.
Abrufen von Statistiken für andere Benutzer
Sie können mit
ISteamUserStats::RequestUserStats Statistiken für einen anderen Benutzer abrufen. Anschließend können Sie mit
ISteamUserStats::GetUserStat,
ISteamUserStats::GetUserAchievement, und
ISteamUserStats::GetUserAchievementAndUnlockTime die Daten für diesen Benutzer abrufen. Diese Daten werden nicht automatisch aktualisiert, wenn der andere Benutzer neue Statistiken hochlädt. Rufen Sie daher zum Aktualisieren der Daten
ISteamUserStats::RequestUserStats erneut auf.
Um nicht zu viel Speicher zu verbrauchen, wird ein LRU-Cache (Least Recently Used) verwendet und die Statistiken anderer Benutzer gelegentlich entfernt. In diesem Fall wird die
ISteamUserStats::UserStatsUnloaded_t-Rückruf gesendet. Nach dem Senden dieses Rückrufs sind die Statistiken des entsprechenden Benutzers erst wieder verfügbar, wenn
ISteamUserStats::RequestUserStats erneut aufgerufen wird.
Offlinemodus
Steam speichert einen lokalen Cache mit den Daten zu Statistiken und Errungenschaften, sodass die APIs auch im Offlinemodus normal verwendet werden können. Alle Statistiken, die nicht festgeschrieben werden können, werden gespeichert, bis der Benutzer das nächste Mal online ist. Falls auf mehreren Geräten Änderungen aufgetreten sind, führt Steam die Errungenschaften automatisch zusammen und wählt den Satz der Statistiken, bei dem mehr Fortschritt erzielt wurde. Da Steam einen lokalen Cache der Statistikdaten speichert, braucht das Spiel keinen lokalen Cache, um die Daten auf dem Laufwerk zu speichern. Solche Caches können häufig zu Konflikten führen. In diesem Fall kann es für Benutzer den Anschein haben, als sei ihr Fortschritt zurückgesetzt worden, was eine frustrierende Erfahrung ist.
Spielserverstatistiken
Neben
ISteamUserStats gibt es
ISteamGameServerStats für Spielserver. Diese können Statistiken für Benutzer auf dieselbe Art abrufen wie Clients (siehe oben). Außerdem können sie Statistikänderungen und das Erreichen von Errungenschaften einstellen, aber nur, wenn „Set by“ auf „GS“ (Spielserver) oder „Official GS“ eingestellt ist. Der Unterschied zwischen Spielservern und offiziellen Spielservern liegt darin, dass offizielle Spielserver von Ihnen gehostete und gesteuerte Server sind. Die Beschränkung auf offizielle Spielserver zur Festlegung von Statistiken bietet besseren Schutz vor Cheats, da Benutzer anderenfalls ihre eigenen Spielserver modifizieren oder vortäuschen können, ein Spielserver zu sein. Um offizielle Spielserver zu definieren, geben Sie
hier die IP-Bereiche der Server ein.
Statistiken und Errungenschaften, die von Spielservern eingestellt werden können, können nicht von Clients eingestellt werden. Spielserver können nur Statistiken und Errungenschaften von Spielern einstellen, die derzeit auf dem Server spielen. Wenn der Benutzer den Server verlässt, gibt es eine kurze „Gnadenfrist“, in der noch ausstehende Statistiken eingestellt werden können. Anschließend werden sämtliche neue Uploads abgewiesen. Dies soll Konsistenz gewährleisten und ausschließen, dass betrügerische Spielserver jederzeit beliebige Statistiken einstellen können. Aufgrund dieser Einschränkung ist es wichtig, mit dem Einstellen von Statistiken nicht bis zum Ende einer Runde zu warten. Stellen Sie sie regelmäßig ein, damit Sie sie speichern können, wenn ein Benutzer die Sitzung verlässt.
Clients erhalten automatische Updates, wenn sich ihre Statistiken auf dem Spielserver ändern. Allerdings werden, wie bei Clients, Statistiken, die vom Server für andere Benutzer geladen werden, nicht automatisch aktualisiert und können veralten.
Statistiken zurücksetzen
Während der Entwicklung tritt häufig der Fall ein, dass Sie zu Testzwecken die Statistiken und Errungenschaften für einen oder alle Accounts vollständig zurücksetzen müssen. Um Statistiken für einen Account zurückzusetzen, rufen Sie
ISteamUserStats::ResetAllStats auf und setzen Sie
bAchievementsToo
auf
true, um Errungenschaften ebenfalls zurückzusetzen. Vergessen Sie nicht, nach dem Aufruf die Statistiken und Errungenschaften zu reiterieren und den Spielstatus im Speicher zurückzusetzen. Es gibt keine Möglichkeit, Statistiken und Errungenschaften für alle Benutzer global zurückzusetzen. Einer der Gründe hierfür ist, dass selbst im Fall eines globalen Zurücksetzens alle zu dieser Zeit noch ausgeführten Spiele nicht vom Zurücksetzen betroffen wären und Speicherwerte wieder überschrieben würden. Sie können ein System zum globalen Zurücksetzen jedoch auch auf einfachere Weise in Ihr Spiel integrieren. Gehen Sie hierzu wie folgt vor:
- Definieren Sie eine Statistik mit einem Namen wie „Version“.
- Fügen Sie eine hartcodierte Versionsnummer für die Statistik im Spiel ein.
- Vergleichen Sie nach dem Laden der Statistiken die „Version“-Statistik mit Ihrer hartcodierten Versionsnummer.
- Wenn diese nicht übereinstimmen, rufen Sie ISteamUserStats::ResetAllStats auf und stellen Sie die „Version“-Statistik auf die hartcodierte Nummer ein.
Wenn Sie global zurücksetzen möchten, müssen Sie lediglich die hartcodierte Versionsnummer der Statistik ändern. Sobald die Benutzer den neuen Build erhalten, erfolgt das globale Zurücksetzen.
Konsistente Statistiken
Denken Sie stets darüber nach, in welchen Fällen zusammengehörige Statistiken inkonsistent werden könnten. Angenommen, Sie haben drei Statistiken „GamesWon“, „GamesLost“ und „GamesPlayed“. Trotz aller Bemühungen kann und wird es vorkommen, dass Statistiken nicht mehr synchron sind. In diesem Beispiel könnte dies dazu führen, dass die Anzahl der gewonnenen und verlorenen Spiele als Summe nicht mehr der Gesamtzahl der Spiele entspricht. Wenn Sie dieses Problem nun beheben, indem Sie die „GamesLost“-Statistik entfernen und sie stattdessen als „GamesPlayed“–„GamesWon“ berechnen, kann dies im Fall einer Inkonsistenz dazu führen, dass „GamesLost“ ein negativer Wert ist. Entfernen Sie in diesem Fall lieber die „GamesPlayed“-Statistik und berechnen Sie den Wert als „GamesWon“ + „GamesLost“.
Globale Statistiken
Sie können Statistiken auf der Admin-Seite als aggregiert kennzeichnen, damit Steam einen Gesamtwert aller durch den Benutzer erzielten Werte für diese Statistik speichert. So können Sie beispielsweise Daten wie insgesamt im Wirtschaftssystem ausgegebenes Geld, Gesamtfertigkeiten, beliebteste Waffen, beliebteste Karten, bestes Team usw. abrufen. Andererseits sollten Sie dies nicht für Statistiken wie „MostKills“ verwenden, da hier eine Summe der Werte mehrerer Benutzer sinnlos wäre. Da Benutzer Zugriff auf diese Statistiken haben, kann es zu Manipulationen dieser Daten kommen. Daher ist es bei Verwendung aggregierter Statistiken wichtig sinnvolle Grenzen festzulegen, wie zum Beispiel Mindestwerte, Höchstwerte, nur ansteigend (falls zutreffend) und maximale Änderung. Die maximale Änderung hat eine besondere Bedeutung für aggregierte Statistiken. Wenn ein neuer Wert hochgeladen wird, ändert sich der globale Wert höchstens um den Betrag der maximalen Änderung. So wird eingeschränkt, wie schnell ein Cheater die globalen Gesamtwerte beeinflussen kann.
Um auf die globalen Gesamtwerte zuzugreifen, rufen Sie
ISteamUserStats::RequestGlobalStats und anschließend
ISteamUserStats::GetGlobalStat für jede globale Statistik auf. Sie können auch
ISteamUserStats::RequestGlobalStats für eine bestimmte Anzahl von Tagen im Verlauf aufrufen. Der Verlauf ist der Betrag um den sich diese Statistik jeden Tag geändert hat. Auf diesen Verlauf können Sie mit
ISteamUserStats::GetGlobalStatHistory zugreifen.
Weiterhin können Sie die globale prozentuale Vollständigkeit von Errungenschaften vom Client abrufen. Hierfür rufen Sie zunächst
ISteamUserStats::RequestGlobalAchievementPercentages auf. Iterieren Sie die Errungenschaften anschließend in der Reihenfolge von der größten zur geringsten Vollständigkeit mit
ISteamUserStats::GetMostAchievedAchievementInfo und
ISteamUserStats::GetNextMostAchievedAchievementInfo. Mit
ISteamUserStats::GetAchievementAchievedPercent, können Sie auch die prozentuale Vollständigkeit einer bestimmten Errungenschaft abrufen.
Testen
Sie können verdiente Errungenschaften nicht vor Veröffentlichung Ihrer Anwendung in der Steam Community oder Bibliothek einsehen. Ihre Anwendung benötigt daher einen Weg, die Errungenschaften eines Nutzers sichtbar zu machen.
Über die Steam-Client-Konsole können Sie eine Errungenschaft oder Statistik entfernen, ohne Ihrem Spiel Code hinzuzufügen. Starten Sie Steam mit „steam.exe -console“ und geben Sie dann die folgenden Befehle ein:
- achievement_clear <appid> <achievement name>
- reset_all_stats <appid>
Die Steam Community
Sobald Ihr Spiel veröffentlicht ist, werden Informationen zu individuellen und globalen Errungenschaftsfortschritten in der Steam Community angezeigt. Jeder Spieler hat einen Link in seinem Community-Profil, der auf eine Seite mit bereits erreichten und noch freizuschaltenden Errungenschaften führt.
HINWEIS: Die Errungenschaften werden erst angezeigt, wenn Ihre Anwendung zu einem gewissen Grad für die Community sichtbar ist.
Jede Errungenschaft wird mit dem in der Steamworks-Systemsteuerung festgelegten Symbol, Namen und Beschreibung aufgelistet. Wenn Name und Beschreibung der Errungenschaft in die vom Benutzer ausgewählte Sprache lokalisiert wurden, werden sie in der entsprechenden Sprache angezeigt.
Auf dieser Seite und auf der Hauptseite Ihres Spiels auf Steam wird außerdem ein Link angezeigt, mit dem Sie globale Statistiken zu Errungenschaften aus Ihrem Spiel einstellen können. Dort wird für jede Errungenschaft der prozentuale Anteil der Steam-Spieler angegeben, der diese Errungenschaft erreicht hat. Die Sortierung erfolgt von der am häufigsten bis zur am seltensten erreichten Errungenschaft. Dies ist interessant für die Spieler und außerdem eine gute Infoquelle für Sie als Entwickler: Sind die von Ihnen gestellten besonderen Herausforderungen anspruchsvoll genug? Oder vielleicht zu anspruchsvoll? (Diese Information ist auch über die Seite für Verkaufs- und Aktivierungsberichte erhältlich.)
Noch Fragen?
Wir freuen uns auf Ihre Fragen im
Diskussionsforum zu Errungenschaften und Statistiken.