10 Ekim 2026 Cumartesi

Google Play Games sasniegumi (Achievements) mobilajās spēlēs: ietekme veikalā, 2 000 XP limits un MonoGame arhitektūra




Google Play Games sasniegumi (Achievements) mobilajās spēlēs: ietekme veikalā, 2 000 XP limits un MonoGame arhitektūra

Kad mobilā spēle ir izstrādāta un publicēta veikalā, sākas patiesais izaicinājums: pārvērst spēlētāja dažu pirmo minūšu ziņkāri par ilgtermiņa iesaisti. Ja spēlētājs paliek tikai pie vienkārša cikla "pabeidz līmeni, sāc nākamo", ar laiku iestājas nogurums — vai arī lietotne tiek aizvērta, pat nepamanot pusi no jūsu radītajām dziļajām spēles mehānikām.

No pirmā acu uzmetiena Google Play Games Services (GPGS) sasniegumu (Achievements) sistēma var šķist vienkārša mazu nozīmīšu kolekcija, kas parādās ekrānā. Taču, ja tā ir pārdomāti izstrādāta, tā kļūst par spēcīgu spēlētāju noturēšanas (Retention) dzinēju, kas vada spēlētājus cauri katram jūsu spēles mehānikas slānim.

Šajā tehniskajā rakstā mēs detalizēti izskaidrosim, ko sasniegumi reāli sniedz Google Play ekosistēmā, kā mēs spēlei Blocked: Pixel Panzer izveidojām 79 unikālus sasniegumus saskaņā ar Google stingrajiem XP noteikumiem un kā mēs izstrādājām asinhronu MonoGame / C# pakešapstrādes (batching) konveijeru, kas novērš FPS kritumus un Android ANR (Application Not Responding) kļūdas intensīvu arkādes kauju laikā.


1. Kāpēc Google Play Games sasniegumi ir svarīgi?

Google Play Games sasniegumu integrēšana sniedz četrus konkrētus ieguvumus gan spēlētāju psiholoģijā, gan veikala veiktspējas rādītājos:

  1. Alternatīvi mērķi un spēlētāju noturēšana (Day-7 / Day-30 Retention):
    Ne katrs spēlētājs var sasniegt 1. vietu globālajā līderu sarakstā (Leaderboard), taču ikviens spēlētājs var tiekties uz mērķi "Iznīcini 100 torņus" vai "Pabeidz līmeni bez bojājumiem". Pakāpeniskie (Incremental) sasniegumi piedāvā taustāmu progresa joslu, kas virzās uz priekšu ar katru spēles sesiju.
  2. Dabiska spēles mehānikas apguve (Netiešā ievadīšana jeb Onboarding):
    Spēlētāji bieži vien pieturas pie pamata ieroča un vilcinās izmēģināt jaunas pieejas. Spēlē Blocked: Pixel Panzer, atalgojot spēlētājus par bloku vienlaicīgu kausēšanu ar zaļo skābes munīciju uz ColorWheel vai kritiskiem trāpījumiem ar melno munīciju, mēs mudinām viņus atklāt un apgūt katru elementu režīmu.
  3. Tūlītēja atgriezeniskā saite un Google Play Gamer XP:
    Oficiālā Google Play Games paziņojuma parādīšanās ekrāna augšdaļā pašā kaujas karstumā un XP (Pieredzes punktu) iegūšana savam globālajam Google Play spēlētāja līmenim sniedz spēlētājam paliekošu progresa sajūtu, kas piesaistīta viņa operētājsistēmas profilam.
  4. Google Play ekosistēma un kvalitātes signāli:
    Google Play Games Services V2 (PGS V2) integrācija nodrošina automātisku pieteikšanos bez liekiem pieskārieniem (Zero-Tap Sign-In), nevainojamu savietojamību ar Google Play Games on PC un spēcīgākus iesaistes signālus Google Play veikala cilnē "Spēles".

Blocked: Pixel Panzer sasnieguma atbloķēšanas paziņojums spēlē
Oficiālais Google Play Games uznirstošais paziņojums "Turret Buster I", kas parādās ekrāna augšdaļā brīdī, kad spēlē Blocked: Pixel Panzer 103. līmeņa kaujā tiek iznīcināts 10. tornis.


2. Google Play Console noteikumi: 2 000 XP limits un 10 000 soļu ierobežojums

Konfigurējot sasniegumus pakalpojumā Google Play Console, ir jāņem vērā trīs stingri platformas ierobežojumi:

  • Stingrais 2 000 XP limits (Hard Cap): Visu vienas spēles sasniegumu punktu summa nedrīkst pārsniegt 2 000 XP. Katram atsevišķam sasniegumam ir jāpiešķir no 5 līdz 200 XP, un tam ir jābūt skaitļa 5 daudzkārtnim.
  • 10 000 soļu limits pakāpeniskajiem sasniegumiem: Sasniegumi ar kumulatīvu skaitītāju pakalpojumā Play Console atbalsta ne vairāk kā 10 000 soļus (steps).
  • Play Games Services V2 prasība: Google pakāpeniski pārtrauc mantotās V1 SDK darbību. Mūsdienīgām Android spēlēm jābalstās uz Xamarin.GooglePlayServices.Games.V2 (PlayGamesSdk un PlayGames.GetAchievementsClient).

79 sasniegumu kataloga izveide spēlē Blocked: Pixel Panzer

Analizējot mūsu galvenās spēles entītijas (TurretBlock, FighterJet, EnemyRocket, ColorWheel, HydraRegenerationSkill, Season), mēs strukturējām 79 sasniegumus ar kopējo vērtību 1 995 / 2 000 XP 6 galvenajās kategorijās:

Kategorija Sasniegumu piemēri Veids Mērķis / Mehānika
Ienaidnieku mednieki (Enemy Hunters) Jet Hunter I–III, Sky Dominator, Turret Buster I–III, Siege Master Pakāpenisks (Incremental) Iznīcināt 10, 100, 1 000 un 10 000 iznīcinātājlidmašīnu, aizsardzības torņu un vadāmo raķešu.
Bloku iznīcināšana un sprāgstvielas Pioneer Breaker, Demolition Crew, Crusher Supreme, Pixel Obliterator, Chain Reaction Pakāpenisks / Standarta Sasist no 1 000 līdz 10 000 blokiem un uzspridzināt 5/25/50 mērķus ar vienu dinamīta lādiņu.
ColorWheel un ieroču meistarība Prismatic Pilot, Acid Dissolver, Critical Striker, Power Blaster, Speedy Sprinter, Beam Vaporizer Pakāpenisks Kausēt blokus ar zaļo skābes munīciju, veikt melnos kritiskos trāpījumus, šaut ar sarkaniem spēka šāviņiem, lāzeriem un raķetēm.
Līmeņu un bosu progress First Blood, Giant Slayer, Decimator, Speedrunner I–III Pakāpenisks / Standarta Pirmais nogalinātais ienaidnieks, pirmā uzvara pār Bosu un līmeņu pabeigšana mazāk nekā 4 minūtēs.
Pūristu izaicinājumi (Purist) Untouchable, Clean Victory I–III, Purist Gladiator, Mono Specialist Pakāpenisks / Standarta Pieveikt Bosus un pabeigt augsta līmeņa posmus bez bojājumiem vai neizmantojot prasmes (skills).
Atmosfēra, krājumi un meta Storm Fighter, Retro Connoisseur, Gem Tycoon, Quad Spectrum, Audiophile, Loyal Supporter Pakāpenisks / Slēptais Iznīcināt 100 torņus lietainā laikā, vākt CRT monitorus un klausīties pilnas dziesmas mūzikas atskaņotājā.

Katram sasniegumam mēs izveidojām pielāgotas 512x512 pikseļu mākslas nozīmīšu ikonas, kuru rāmji mainās no bronzas uz zeltu un prizmatisko līmeni, pieaugot grūtības pakāpei:

Blocked: Pixel Panzer pielāgotās sasniegumu nozīmītes
Sešas parauga 512x512 nozīmītes no mūsu 79 sasniegumu kataloga: Sky Dominator, Turret Buster III, Pixel Obliterator, Prismatic Pilot IV, Acid Dissolver II un Power Blaster II.

Profesionāļu padoms (masveida ZIP imports): Manuāla 79 sasniegumu ievadīšana Google Play Console tīmekļa saskarnē aizņem stundām ilgu laiku. Tā vietā izmantojiet Play Console funkciju "Import achievements", apvienojot AchievementsMetadata.csv, AchievementsIconsMappings.csv un savas 512x512 .jpg ikonas vienā .zip arhīvā, lai importētu visu katalogu dažu sekunžu laikā.

Google Play Console publicēto sasniegumu tabula
Mūsu publicētie sasniegumi un XP sadalījums pakalpojumā Google Play Console.


3. Tīrā arhitektūra: IGamesService un AchievementDirector koplietotajā kodā

Blocked: Pixel Panzer ir vairāku platformu MonoGame projekts, kas darbojas gan operētājsistēmā Windows PC (Microsoft Store), gan Android (Google Play). Lai mūsu koplietojamo spēles projektu (Blocked.Shared) pilnībā pasargātu no Android SDK atkarībām, mēs piemērojam Atkarību apvērsuma principu (SOLID - Dependency Inversion Principle).

Pirmkārt, koplietojamajā slānī mēs definējam no platformas neatkarīgu IGamesService līgumu:

namespace Blocked.Shared.Services
{
    public interface IGamesService
    {
        void Initialize();
        Task<bool> SignIn();
        Task<bool> IsAuthenticated();
        
        // Leaderboards
        void SubmitScore(string leaderboardId, long score);
        void ShowLeaderboards();
        void ShowLeaderboard(string leaderboardId);

        // Achievements
        void UnlockAchievement(string achievementId);
        void IncrementAchievement(string achievementId, int steps = 1);
        void ShowAchievements();
    }
}

Tā vietā, lai sasniegumu pārbaudes izkaisītu pa klasēm CollisionManager, GameplayScreen un Player, mēs centralizējam visus 79 noteikumus vienā koordinatora klasē — AchievementDirector:

public static class AchievementDirector
{
    public static void OnEnemyKilled(
        bool isJet = false,
        bool isTurret = false,
        bool isRocket = false,
        bool isBoss = false,
        Bullet? killingBullet = null,
        bool killedByLaser = false)
    {
        var gamesService = ScreenManager.Instance?.GamesService;
        if (gamesService == null) return; // Safely no-ops on Desktop PC builds

        if (isTurret)
        {
            gamesService.IncrementAchievement(AchievementIds.TurretBuster1, 1);
            gamesService.IncrementAchievement(AchievementIds.TurretBuster2, 1);
            gamesService.IncrementAchievement(AchievementIds.TurretBuster3, 1);
            gamesService.IncrementAchievement(AchievementIds.SiegeMaster, 1);

            // Turrets destroyed during rainy weather advance "Storm Fighter"
            if (Season.Current == SeasonKind.Rainy)
            {
                gamesService.IncrementAchievement(AchievementIds.StormFighter, 1);
            }
        }

        TrackWeaponKill(gamesService, killingBullet, killedByLaser);
    }
}

4. Kritiska inženierija: JNI / Binder IPC virsizdevumu novēršana, lai nepieļautu ANR

Dinamiskā arkādes spēlē sasniegumu trigeru tieša sasaiste ar Google Play SDK rada nopietnus veiktspējas draudus:

Kad spēlētājs uzspridzina Sprāgstošo bloku (ExplosiveBlock) vai aktivizē Laser Beam prasmi, vienā kadrā (16,6 milisekundēs) var tikt iznīcināti 20 līdz 30 bloki un ienaidnieki. Kad katra iznīcināšana atjaunina 5 vai 6 pakāpeniskos sasniegumus, viens kadrs var izraisīt vairāk nekā 150 IncrementAchievement izsaukumus!

Ja spēles galvenā cikla pavedienā uz Google Play pakalpojumiem nosūtāt 150 sinhronus JNI un Binder IPC izsaukumus:

  1. Sākumlīmeņa Android ierīcēs (Android Go tālruņos ar 1–2 GB RAM) nekavējoties rodas spēcīga kadru aizture (stuttering).
  2. JNI globālo atsauču (GREF) tabula pārpildās, izraisot ANR (Input dispatching timed out) kļūdu reģistrēšanu pakalpojumā Google Play Vitals.

Mūsu risinājums: 1,5 sekunžu pakešapstrāde atmiņā un sesijas deduplikācija

Mūsu ieviešana failā GooglePlayGamesService.cs pilnībā izolē MonoGame atjaunināšanas ciklu no Google Play IPC izsaukumiem:

  1. Sesijas deduplikācija (_unlockedInSession):
    Tiklīdz standarta sasniegums sesijas laikā ir atbloķēts, tā ID tiek pievienots HashSet<string>. Atkārtoti izsaukumi tajā pašā vai nākamajos kadros C# līmenī tiek nekavējoties pārtraukti bez jebkādas JNI noslodzes.
  2. 1,5 sekunžu fona pakešapstrāde (_pendingIncrements):
    Izsaucot IncrementAchievement, galvenajā pavedienā tiek vienkārši palielināts vesels skaitlis atmiņas vārdnīcā Dictionary<string, int> (nulle JNI izsaukumu). Fona Task.Run izpildītājs pamostas pēc 1,5 sekundēm, uzņem uzkrāto summu momentuzņēmumu un nosūta tos uz Google Play Services vienā apvienotā izsaukumā katram sasniegumam.
  3. 26502: CLIENT_RECONNECT_REQUIRED apstrāde un bezsaistes kešatmiņa:
    Ja spēlētājs atstāj spēli fonā uz vairākām stundām un atgriežas, Google Play sesijas marķiera derīguma termiņš var beigties un izraisīt kļūdu 26502 (CLIENT_RECONNECT_REQUIRED). Mūsu pakalpojums to uztver, mēģina veikt vienu klusu fona SignIn() ar aizsardzību pret pārāk biežiem mēģinājumiem, un bezsaistes gadījumā izmanto GPGS vietējo kešatmiņu (client.Unlock), nodrošinot, ka neviens sasniegums netiek zaudēts.
private static readonly HashSet<string> _unlockedInSession = new(StringComparer.Ordinal);
private static readonly Dictionary<string, int> _pendingIncrements = new(StringComparer.Ordinal);
private static readonly object _achievementBatchLock = new();
private static bool _incrementFlushScheduled = false;

public void IncrementAchievement(string achievementId, int steps = 1)
{
    if (!_isInitialized || string.IsNullOrEmpty(achievementId) || steps <= 0)
        return;

    bool shouldSchedule = false;
    lock (_achievementBatchLock)
    {
        // ZERO JNI cost on the game loop thread — pure in-memory aggregation!
        if (_pendingIncrements.TryGetValue(achievementId, out int current))
            _pendingIncrements[achievementId] = current + steps;
        else
            _pendingIncrements[achievementId] = steps;

        if (!_incrementFlushScheduled)
        {
            _incrementFlushScheduled = true;
            shouldSchedule = true;
        }
    }

    if (shouldSchedule)
    {
        Task.Run(async () =>
        {
            await Task.Delay(1500).ConfigureAwait(false);
            FlushPendingIncrementsNow();
        });
    }
}

private void FlushPendingIncrementsNow()
{
    List<KeyValuePair<string, int>>? snapshot = null;

    lock (_achievementBatchLock)
    {
        _incrementFlushScheduled = false;
        if (_pendingIncrements.Count == 0) return;

        snapshot = new List<KeyValuePair<string, int>>(_pendingIncrements);
        _pendingIncrements.Clear();
    }

    var act = _activity;
    if (act == null || act.IsFinishing || act.IsDestroyed) return;

    var client = PlayGames.GetAchievementsClient(act);
    foreach (var kvp in snapshot)
    {
        if (kvp.Value > 0)
        {
            // 150 frame events become 1 combined step call to GPGS
            client.Increment(kvp.Key, kvp.Value);
        }
    }
}

5. Kā spēlētāji seko līdzi saviem sasniegumiem spēlē?

Uznirstošie paziņojumi kaujas laikā ir lieliski, taču spēlētājiem ir nepieciešama arī pārskatāma vieta, kur pārlūkot bloķētās nozīmītes, pārbaudīt procentuālo progresu un izvēlēties nākamo mērķi.

Lai to atbalstītu, mēs pārveidojām mūsu mobilo statistikas ekrānu par vienotu STATS & RANKS centru. Ekrāna augšdaļā divas zelta pogas — LEADERBOARD un ACHIEVEMENTS — pulsē ar vienmērīgu 2 sekunžu sinusoidālu spīdumu (Math.Sin). Windows Desktop versijās šīs mobilajām ierīcēm paredzētās pogas tiek automātiski paslēptas, saglabājot klasisko STATISTICS izkārtojumu tīru.

Kad spēlētājs pieskaras pogai ACHIEVEMENTS:

  1. FlushPendingIncrementsNow() tiek palaists nekavējoties, lai jebkurš progress no pēdējām 1,5 sekundēm tiktu fiksēts pirms saskarnes atvēršanas.
  2. GetAchievementsIntent() atver Google Play Games vietējo Achievements pārklājumu tieši virs spēles:

Vietējais Google Play Games sasniegumu pārklājums spēlē Blocked: Pixel Panzer
Vietējais Google Play Games Achievements pārklājums, kas atvērts no ekrāna STATS & RANKS, parāda kopējo izpildi (2 / 79), ieteiktos mērķus, atbloķētās nozīmītes (Loyal Supporter, Audiophile) un bloķētos progresa gredzenus.

Spēlētāji var pārbaudīt savu 2 / 79 progresu, skatīt personalizētus ieteikumus un sekot līdzi pakāpeniskajiem progresa gredzeniem, neizejot no spēles.


6. Secinājumi un mūsu spēles

Ja Google Play Games sasniegumu sistēma tiek veidota ar sabalansētu 2 000 XP budžetu un nebloķējošu fona pakešapstrādes konveijeru, tā ir viens no efektīvākajiem veidiem, kā piešķirt arkādes spēlei dziļumu un ilgtermiņa atkārtotas spēlēšanas vērtību, neietekmējot kadru nomaiņas ātrumu.

Ja vēlaties paši izbaudīt mūsu 79 sasniegumu sistēmu, ColorWheel kaujas mehāniku un globālos līderu sarakstus — vai iepazīties ar citiem mūsu projektiem —, varat tos atrast zemāk norādītajos veikalos:

🎮 Mūsu spēles:

📢 Sekojiet mūsu izstrādes dienasgrāmatām un kopienai:

Sekojiet mums, lai lasītu vairāk tehnisku rakstu, skatītos aizkulišu video un saņemtu spēļu jaunumus:


Tēmturi un tēmas

#GooglePlayGames #Achievements #MonoGame #CSharp #MobileGameDev #AndroidDev #IndieDev #GameArchitecture #BlockedPixelPanzer #PaintTrek #ArarGames




Hiç yorum yok:

Yorum Gönder