Steamworks dokumentáció
Statisztikák és teljesítmények

Áttekintés

A Steam „Statisztikák és teljesítmények” egyszerű módot kínál a játékodnak maradandó, átvihető teljesítmények és statisztikák követésére felhasználóid számára. A felhasználók adatai a saját Steam fiókjukhoz vannak társítva, és az egyes felhasználók teljesítményei és statisztikái formázhatók és megjeleníthetők a Steam közösségi profiljukban.

Mire jók

Amellett, hogy nagyra értékelt jutalmakat adnak a játékaiddal játszóknak, a teljesítmények használatával ösztönözhető és jutalmazható a csapatmunka és a játékosok közötti interakciók, plusz dimenzió adható a játékcélokhoz és jutalmazhatók a felhasználók, amiért több időt töltenek játékban.

A statisztikák olyan részletes információkat követnek, mint a játékidő, a felhasznált erősítések száma stb. Dönthetsz úgy, hogy egyszerűen belső játékadatok nyomon követésére használod őket, például, hogy a felhasználótól több számítógépen, több munkamenet alatt összegyűjtött statisztikák alapján adhass meg teljesítményeket.

A megvalósítás áttekintése

Határozd meg játékod statisztikáit és teljesítményeit

A teljesítmények alkalmazás-specifikusak, és a Steamworks partneroldalad alkalmazás-adminisztrációs oldalán vannak beállítva.

Három fajta statisztika van, amit a játékod tárolni tud:
  • INT – 32 bites (előjeles) egész szám (pl. a játszott játékmenetek száma).
  • FLOAT – 32 bites lebegőpontos érték (pl. a megtett kilométerek száma).
  • AVGRATE – Mozgóátlag. Lásd: Az AVGRATE statisztikatípus

A Steamworks partner weboldal kezelőfelületet biztosít játékod statisztikáinak és teljesítményeinek meghatározásához és frissítéséhez. Ennek használatával:
  • Meghatározhatod a kezdeti statisztikákat és teljesítményeket.
  • További statisztikákat és teljesítményeket adhatsz hosszá.
  • Frissítheted a teljesítmények neveit, leírásait és ikonjait.
  • Frissítheted a statisztikaparamétereket és -korlátokat (max./min. értékek, mozgóátlag-ablakméretek stb.).
A statisztikáknak az alábbi tulajdonságaik vannak:
  • Azonosító – Automatikusan generált numerikus azonosító minden egyes statisztikához.
  • Típus – E statisztika típusa – INT, FLOAT vagy AVGRATE.
  • API-név – A statisztikához az API-n keresztüli hozzáféréshez használt karakterlánc.
  • Beállító: – Beállítja, hogy ki tudja módosítani a statisztikát. Az alapértelmezett a Client / Kliens. További információ: Játékszerver-statisztikák.
  • Csak növekvő – Ha be van állítva, e statisztika értéke idővel csak növekedhet.
  • Max. változás – Ha be van állítva, korlátozza, mennyivel változhat a statisztika értéke egy-egy SetStat hívás során.
  • Min. érték – Ha be van állítva, akkor ez a statisztika minimálisan ezt az értéket veheti fel. Alapesetben a minimum az adott numerikus típus minimuma (INT_MIN vagy -FLT_MAX).
  • Max. érték – Ha be van állítva, akkor ez a statisztika maximálisan ezt az értéket veheti fel. Alapesetben a maximum az adott numerikus típus maximuma (INT_MAX vagy FLT_MAX).
  • Alapérték – Ha be van állítva, az az alapérték, amire ez a statisztika kezdetben lesz beállítva egy új felhasználónak. Ha nincs beállítva, az alapérték a nulla.
  • Összesített – Ha be van állítva, a Steam globális összesítést tárol erről a statisztikáról. További információkért lásd alább a Globális statisztikákat.
  • Megjelenítési név – E statisztika neve, amikor megjelenik az alkalmazásodban.
Az AVGRATE statisztikáknak az alábbi további tulajdonságaik vannak:
  • Ablak – Az adataid átlagolásához használt „csúszóablak” mérete.
Az AVGRATE statisztikát a Steam automatikusan átlagolja. További információkért lásd alább az AVGRATE szakaszt.

A teljesítményeknek az alábbi tulajdonságaik vannak:
  • Azonosító – Automatikusan generált numerikus azonosító minden egyes teljesítményhez.
  • API-név – A teljesítményhez az API-n keresztüli hozzáféréshez használt karakterlánc.
  • Haladási statisztika – Megadja azt a statisztikát, amely a Közösségben folyamatjelző sávként van használva ehhez a teljesítményhez. A teljesítmény automatikusan fel is oldódik, amikor a statisztika eléri a feloldási értéket.
  • Megjelenítési név – Ez lesz a teljesítmény neve a kliens felugró ablakaiban és a Közösségben. Lokalizálható.
  • Leírás – E teljesítmény leírása a Közösségben való megjelenítéshez. Lokalizálható.
  • Beállító: – Beállítja, hogy ki tudja feloldani a teljesítményt. Az alapértelmezett a Client / Kliens. További információ: Játékszerver-statisztikák.
  • Rejtett? – Ha értéke igaz, egy „rejtett” teljesítmény (egyáltalán) nem jelenik meg egy felhasználó közösségi oldalán, amíg el nem érte azt.
  • Elért ikon – A teljesítmény elért állapotában mutatott ikon.
  • Eléretlen ikon – A teljesítmény el nem ért állapotában mutatott ikon.

Alább látható a Steamworks API Example Application (SpaceWar) teljesítménylistája:
achievements_spacewar.png

Különleges megfontolások

  • A teljesítményneveknek és -ikonoknak minden korosztály számára megfelelőnek kell lenniük.
  • A játékok kezdetben alapértelmezetten 100 teljesítményre vannak korlátozva. Miután alkalmazásod elérte a Profilfunkciók használatához szükséges küszöböt, további teljesítményeket tudsz hozzáadni.

Hogyan használd őket

Statisztikák és teljesítmények elérése a játékodból:

Az AVGRATE statisztikatípus

Ez a statisztikatípus néhány egyedi és nagyon hasznos funkciót biztosít, de egy kicsit részletesebb magyarázatot igényel.

Vegyük azt az esetet, amikor egy átlag statisztikát szeretnél nyomon követni, mint az „Óránként szerzett pont”. Az egyik megközelítés két statisztika használata volna: egy „ÖsszesPont” INT és egy „ÖsszesJátékidő” FLOAT, majd az óránkénti pontokhoz elosztanánk a pontokat az órákkal.

Ennek a megvalósításnak az a hátránya, hogy miután a játékos jelentős mennyiségű játékidőt halmozott fel, a számított átlag rendkívül lassan változna. Valójában minél többet játszik a felhasználó a játékkal, annál kevésbé fog reagálni az átlag. Ha a felhasználó 100 órát töltött a játékot játszva, a számított átlag ebből nagyjából 50 órában „késni” fog. Ha nő az ügyessége, nem fogja látni az elvárt növekedést az óránkénti pontszámban.

Az AVGRATE statisztikatípus lehetővé teszi, hogy „csúszóablak” hatást valósíts meg az átlagon. Használhatod például csak az utóbbi néhány órányi játékmenetet, így a statisztika pontosabban fogja tükrözni a játékos aktuális ügyességszintjét.

Állítsunk be egy AVGRATE statisztikát az „óránkénti pontszám” megvalósítására úgy, hogy csak a megelőző húsz órányi játékmenet hasson az értékre. Ennek megtételéhez:
  • Vedd figyelembe, hogy mivel az átlag „óránkénti” lesz, az ehhez a statisztikához tartozó összes időparaméter időegysége „óra” lesz. Ez vonatkozik magának a statisztikának az Ablak tulajdonságára, valamint az alább az UpdateAvgRateStat-nak átadott "dSessionLength" paraméterre is.
  • Hozz létre egy "AvgPointsPerHour" nevű AVGRATE statisztikát és egy 20.0 értékű Ablak tulajdonságot (ne feledd, hogy ez órában értendő).
  • A játék megfelelő pontjain hívd meg az ISteamUserStats::UpdateAvgRateStat-ot a következő paraméterekkel:
    • pchName - "AvgPointsPerHour"
    • flCountThisSession – A játékos által az UpdateAvgRateStat legutóbbi hívása óta szerzett pontok száma.
    • dSessionLength – Az UpdateAvgRateStat legutóbbi hívása óta eltelt játékidő. A mértékegységnek meg kell egyeznie a statisztika Ablak tulajdonságáéval. Ebben az esetben "óra".
  • Például, ha a játékos 77 pontot szerzett a legutóbbi körben, amely 0,225 órán át (13,5 percig) tartott, az SteamUserStats()->UpdateAvgRateStat( "AvgPointsPerHour", 77, 0.225 ) lenne.
A fenti példában a Steam venné az aktuális kör átlagát, ami 342,2 pont óránként (77 osztva 0,225-tel), és összeolvasztaná az előző értékkel. Az eredmény a játékos legutóbbi 20 óra játékidejének teljes átlagát fogja tükrözni. Ha ez lenne az első alkalom, amikor a statisztika frissült ennél a játékosnál, akkor az aktuális érték 342,2 lenne.

Ez a példa órát használ időegységként, de bármilyen kívánt időegységet használhatsz. Csak tartsd észben, hogy következetesen ezt az egységet kell használnod alapként a "dSessionLength" és az Ablak tulajdonság esetében is.

Más felhasználók statisztikáinak lekérése

Az ISteamUserStats::RequestUserStats használatával lekérheted egy másik felhasználó statisztikáit. Ezután az ISteamUserStats::GetUserStat, az ISteamUserStats::GetUserAchievement és az ISteamUserStats::GetUserAchievementAndUnlockTime használatával kinyerheted a felhasználó adatait. Ezek az adatok nem frissülnek automatikusan, amikor a másik felhasználó új statisztikákat tölt fel, ezért az adatok frissítéséhez hívd meg újra az ISteamUserStats::RequestUserStats-t.

A túl nagy memóriahasználat elkerülésére a rendszer egy „legrégebben használt” (LRU) gyorsítótárat tart fenn, és más felhasználók statisztikái időnként ki lesznek ürítve. Amikor ez történik, automatikusan ISteamUserStats::UserStatsUnloaded_t callback lesz elküldve. Ilyen callback küldése után a megadott felhasználó statisztikái az ISteamUserStats::RequestUserStats újbóli meghívásáig nem lesznek elérhetők.

Offline mód

A Steam helyi gyorsítótárat tart fenn a statisztika- és teljesítményadatokból, hogy az API-k offline módban a szokásos módon legyenek használhatók. Minden nem véglegesíthető statisztika mentve lesz a következő alkalomig, amikor a felhasználó online. Abban az esetben, ha egynél több gépen voltak módosítások, a Steam automatikusan egyesíti a teljesítményeket, és azt a statisztikakészletet választja, amelyiknél nagyobb volt a haladás. Mivel a Steam helyi gyorsítótárat tart fenn a statisztikaadatokból, nem szükséges a játéknak is helyi gyorsítótárat tartania lemezen. Az ilyen gyorsítótárak gyakran ütköznek egymással, és ekkor úgy tűnik a felhasználóknak, mintha visszaállították volna a haladást, ami bosszantó élmény.

Játékszerver-statisztikák

Az ISteamUserStats-szal párhuzamosan létezik az ISteamGameServerStats játékszerverekhez. Ezek ugyanúgy tudnak statisztikákat beszerezni a játékosokról, mint a kliensek (a fent leírt módon). Be is tudnak állítani statisztikákat, és meg tudnak adni teljesítményeket, de csak ha a „Beállító” „GS” / „JSZ” (játékszerver) vagy „Official GS” / „Hivatalos JSZ”. A játékszerverek és a hivatalos játékszerverek közötti különbség az, hogy a hivatalos játékszerverek olyan szerverek, amelyeket te üzemeltetsz és irányítasz. Hivatalos játékszerverek használata statisztikák beállításához fokozott biztonságot nyújt csalás ellen, mivel a felhasználók módosíthatják saját játékszervereiket, vagy játékszervernek tettethetik magukat. Hivatalos játékszerverek meghatározásához add meg itt a szerverek IP-tartományát.

A játékszerverek által beállítható statisztikákat és teljesítményeket kliensek nem tudják beállítani. Játékszerverek csak a szerveren jelenleg játszó felhasználók statisztikáit és teljesítményeit tudják beállítani. Ha a felhasználó elhagyja a szervert, van egy rövid türelmi idő a végső statisztikák beállítására, de utána minden új feltöltés meg lesz tagadva. Ennek célja a következetesség biztosítása, és annak elkerülése, hogy egy rosszindulatú játékszerver bármikor bárki statisztikáját be tudja állítani. Tekintettel a korlátozásra, fontos, hogy ne várj egy kör végéig a statisztikák beállításával. Folyamatosan állítsd be azokat, hogy a felhasználó kilépésekor tárolhatók legyenek.

A kliensek automatikus frissítéseket kapnak, amikor egy játékszerver megváltoztatja a statisztikáikat. Azonban a kliensekhez hasonlóan a szerver által más felhasználókról betöltött statisztikák nem frissülnek automatikusan, és elavulhatnak.

Statisztikák nullázása

A fejlesztés során gyakran előfordul, hogy teszteléshez kívánatos egy vagy az összes fiók statisztikáinak és teljesítményeinek teljes törlése. Egy fiók statisztikáinak törléséhez hívd meg az ISteamUserStats::ResetAllStats-t; és hogy a teljesítmények is törlődjenek, az bAchievementsToo-t állítsd true-ra. A hívás után ne felejts újra végigléptetni a statisztikáidon és teljesítményeiden, és nullázni a memóriabeli játékállapotot. Minden játékos statisztikáinak és teljesítményeinek globális törlésére nincs mód. Ennek egyik oka, hogy még ha globális törlést is végeznénk, folyamatban lévő játékok esetleg nem veszik észre a törlést, és visszaírják a memóriában lévő értékeket. Szerencsére könnyen lehet globális törlési rendszert építeni a játékodba. Ehhez:
  • Határozz meg egy statisztikát mondjuk „Verzió” névvel.
  • Tegyél a játékba egy „bedrótozott” statisztika-verziószámot.
  • A statisztikák betöltése után hasonlítsd össze a „Verzió” statisztikaértéket a bedrótozott verziószámoddal.
  • Ha nem egyeznek, hívd meg az ISteamUserStats::ResetAllStats-t, majd állítsd be a „Verzió” statisztikát a bedrótozott számra.
Ily módon amikor globális törlést akarsz, csak változtasd meg a bedrótozott statisztika-verziószámot. Ahogy a felhasználók megkapják az új buildet, meg fog történni a globális törlés.

Statisztikakövetkezetesség

Hasznos végiggondolni, hogyan válhatnak egymáshoz kapcsolódó statisztikák következetlenné. Lehet például három statisztikád: „GyőztesJátékok”, „VesztesJátékok” és „JátszottJátékok”. A statisztikák a legjobb szándék ellenére is kieshetnek, és ki is szoktak esni szinkronból. Ebben az esetben ez ahhoz vezethet, hogy a győztes és vesztes játékok összege nem az összes játszott játékok számát adja. Ha ezt a „VesztesJátékok” statisztika eltávolításával, és helyette a „JátszottJátékok” - „GyőztesJátékok” módon való kiszámításával oldanád meg, egy következetlenség hatására a „VesztesJátékok” negatív szám is lehetne. Ebben az esetben a legjobb a „JátszottJátékok” statisztika elhagyása, és a „GyőztesJátékok” + „VesztesJátékok” módon való kiszámítása.

Globális statisztikák

A statisztikák jelölhetők összesítettként az adminisztrációs oldalon annak jelzésére a Steamnek, hogy ahhoz az összes felhasználó azon statisztikájának globális összesítését használja. Ez használható adatok szerzésére a gazdaságban levő összes pénzről, az összes ölésről, a kedvenc fegyverekről, a kedvenc pályákról, és hogy melyik csapat szokott jobban teljesíteni. Másrészt viszont olyan statisztikáknál nem érdemes használni, mint a „LegtöbbÖlés”, mivel abból több felhasználóét összeadni értelmetlen volna. Mivel a statisztikák a felhasználók kezében vannak, ezek az adatok manipulálásnak vannak kitéve. Ezért összesített statisztikák használatakor kulcsfontosságú jó határok beállítása a minimális és maximális értékre, a csak növekvő jelzés beállítása (ha megfelelő), és maximális változás beállítása. A maximális változásnak összesített statisztikákhoz speciális jelentése van. Új érték feltöltésekor a globális érték legfeljebb a maximális változási értékkel fog változni. Ez korlátozza, hogy egy csaló milyen gyorsan tudja befolyásolni a globális összértékeket.

A globális összértékek eléréséhez hívd meg az ISteamUserStats::RequestGlobalStats-t, majd minden egyes globális statisztikához az ISteamUserStats::GetGlobalStat-ot. Az ISteamUserStats::RequestGlobalStats-tól lekérheted megadott számú nap előzményeit is. Az előzmények az az érték, amivel a statisztika naponta változott. Ezt az előzményt az ISteamUserStats::GetGlobalStatHistory-val tudod elérni.

Globális teljesítményelérési százalékokat is tudsz kérni a klienstől. Ehhez először hívd meg az ISteamUserStats::RequestGlobalAchievementPercentages-t. Ezután léptess végig a teljesítményeken a legnagyobb számban teljesítettől a legkisebb felé az ISteamUserStats::GetMostAchievedAchievementInfo és az ISteamUserStats::GetNextMostAchievedAchievementInfo meghívásával. Egy adott teljesítmény teljesítési százalékát is megkaphatod az ISteamUserStats::GetAchievementAchievedPercent meghívásával.

Tesztelés


A Steam Közösségben és a Könyvtárban alkalmazásod kiadása előtt nem fogod tudni látni, mely teljesítmények lettek elérve. Az alkalmazásnak rendelkeznie kell valamilyen móddal az elért teljesítmények jelzésére a felhasználónak.

Teljesítmény vagy statisztika törléséhez anélkül, hogy kódot adnál a játékodhoz, használni tudod a Steam kliens konzolját. Futtasd a steam.exe -console paranccsal, majd:
  • achievement_clear <AppID> <teljesítménynév>
  • reset_all_stats <AppID>

A Steam Közösség

A játékod kiadása után a Steam Közösségben meg fognak jelenni az információk az egyéni és globális teljesítmény-előrehaladásokról. Minden játékosnak lesz egy hivatkozása a közösségi profiljából, amely egy azt bemutató oldalra vezet, hogy mit ért már el, és mi az, ami még feloldatlan.
MEGJEGYZÉS: a teljesítményeid addig nem fognak látszani, amíg az alkalmazásod valamennyire nem látható a közösség számára.

Mindegyik teljesítmény a megfelelő ikonnal, valamint a Steamworks műszerfalon beállított névvel és leírással jelenik meg. Ha a teljesítmény neve és leírása lokalizálva van a felhasználó által kiválasztott nyelvre, akkor azon a nyelven fognak megjelenni.

Lesz továbbá egy hivatkozás erről az oldalról, és egy másik a játékod fő Steam oldaláról egy sor globális teljesítménystatisztikához a játékodról. Ez megjeleníti a játék azon Steames játékosainak százalékos arányát, akik elérték az egyes teljesítményeket, a leggyakoribbtól a legritkábbig rendezve. Ezt látni szórakoztató a játékosoknak, neked fejlesztőként pedig remek információforrás: elég nehezek a különleges kihívásaid? Vagy talán túl nehezek? (Ez az információ az Eladási és aktiválási jelentések oldalon is elérhető).

További kérdéseid vannak?

Tegyél fel kérdéseket a Stats and Achievements témafórumban.