10 Ekim 2026 Cumartesi

Google Play Games-ի ձեռքբերումները (Achievements) բջջային խաղերում. Ազդեցությունը խանութի վրա, 2,000 XP սահմանաչափը և MonoGame-ի ճարտարապետությունը




Google Play Games-ի ձեռքբերումները (Achievements) բջջային խաղերում. Ազդեցությունը խանութի վրա, 2,000 XP սահմանաչափը և MonoGame-ի ճարտարապետությունը

Բջջային խաղը ստեղծելուց և խանութում հրապարակելուց հետո սկսվում է իսկական մարտահրավերը՝ խաղացողի առաջին մի քանի րոպեների հետաքրքրասիրությունը վերածել երկարաժամկետ ներգրավվածության: Երբ խաղացողները մնում են պարզ "անցիր մակարդակը, սկսիր հաջորդը" ցիկլի մեջ, ի վերջո առաջանում է հոգնածություն, կամ նրանք փակում են հավելվածը՝ առանց բացահայտելու ձեր ստեղծած խաղային մեխանիկաների նույնիսկ կեսը:

Առաջին հայացքից Google Play Games Services (GPGS) Achievements (Ձեռքբերումներ) համակարգը կարող է թվալ ընդամենը փոքր կրծքանշանների հավաքածու: Սակայն մտածված նախագծման դեպքում այն դառնում է խաղացողների պահպանման (retention) հզոր շարժիչ, որն առաջնորդում է նրանց ձեր խաղի յուրաքանչյուր մեխանիկայի միջով:

Այս տեխնիկական հոդվածում մենք մանրամասնում ենք, թե ինչ են իրականում տալիս ձեռքբերումները Google Play էկոհամակարգում, ինչպես ենք նախագծել 79 տարբեր ձեռքբերումներ Google-ի խիստ XP կանոնների ներքո Blocked: Pixel Panzer-ի համար, և ինչպես ենք ստեղծել ասինխրոն MonoGame / C# batching խողովակաշար, որը կանխում է FPS-ի անկումները և Android ANR (Application Not Responding) խնդիրները արկադային ինտենսիվ մարտերի ժամանակ:


1. Ինչո՞ւ են կարևոր Google Play Games-ի ձեռքբերումները:

Google Play Games-ի ձեռքբերումների ինտեգրումն ապահովում է չորս շոշափելի առավելություն ինչպես խաղացողի հոգեբանության, այնպես էլ խանութի արդյունավետության ցուցանիշների առումով.

  1. Այլընտրանքային նպատակներ և խաղացողների պահպանում (Օր 7 / Օր 30 Retention).
    Ոչ բոլոր խաղացողները կարող են հասնել առաջին տեղին համաշխարհային առաջատարների աղյուսակում (leaderboard), բայց յուրաքանչյուր խաղացող կարող է ձգտել "Ոչնչացնել 100 աշտարակ" կամ "Ավարտել փուլն առանց վնաս ստանալու": Աստիճանական (incremental) ձեռքբերումներն ապահովում են առաջընթացի տեսանելի սանդղակ, որն առաջ է շարժվում յուրաքանչյուր խաղաշրջանի հետ:
  2. Խաղի մեխանիկայի բնական ուսուցում (Implicit Onboarding).
    Խաղացողները հաճախ հակված են մնալ իրենց հիմնական զենքի հետ և խուսափում են փորձարկումներից: Blocked: Pixel Panzer-ում խաղացողներին պարգևատրելը ColorWheel-ի վրա կանաչ թթվային զինամթերքով բլոկները միաժամանակ հալեցնելու կամ սև զինամթերքով կրիտիկական հարվածներ հասցնելու համար խրախուսում է նրանց բացահայտել և տիրապետել յուրաքանչյուր տարրական ռեժիմի:
  3. Ակնթարթային արձագանք և Google Play Gamer XP.
    Թեժ ճակատամարտի կեսին էկրանի վերևից Google Play Games-ի պաշտոնական ծանուցման սահելը տեսնելը և իրենց համաշխարհային Google Play Gamer մակարդակի համար XP վաստակելը խաղացողներին տալիս է օպերացիոն համակարգի պրոֆիլի հետ կապված մշտական առաջընթացի զգացում:
  4. Google Play էկոհամակարգ և որակի ազդանշաններ.
    Google Play Games Services V2 (PGS V2) ինտեգրումը բերում է Zero-Tap ավտոմատ մուտք, անխափան համատեղելիություն Google Play Games on PC-ի հետ և ավելի ուժեղ ներգրավվածության ազդանշաններ Google Play Store-ի «Խաղեր» ներդիրում:

Blocked: Pixel Panzer In-Game Achievement Unlock Toast
Google Play Games-ի պաշտոնական "Turret Buster I" ծանուցումը, որը հայտնվում է էկրանի վերևում հենց այն պահին, երբ ոչնչացվում է 10-րդ աշտարակը Blocked: Pixel Panzer-ի 103-րդ մակարդակի մարտի ժամանակ:


2. Google Play Console-ի կանոնները. 2,000 XP սահմանաչափը և 10,000 քայլի սահմանափակումը

Google Play Console-ում ձեռքբերումները կարգավորելիս պետք է նախագծել հաշվի առնելով պլատֆորմի երեք խիստ սահմանափակումները.

  • 2,000 XP-ի կոշտ սահմանաչափ (Hard Cap). Մեկ խաղի բոլոր ձեռքբերումների միավորների գումարը չի կարող գերազանցել 2,000 XP-ն: Յուրաքանչյուր առանձին ձեռքբերում պետք է շնորհի 5-ից մինչև 200 XP՝ 5-ի քայլերով:
  • 10,000 քայլի սահմանափակում աստիճանական ձեռքբերումների համար. Կուտակային հաշվիչով ձեռքբերումները Play Console-ում ապահովում են առավելագույնը 10,000 քայլ (steps):
  • Play Games Services V2-ի պահանջը. Google-ը դադարեցնում է հին V1 SDK-ի աջակցությունը: Ժամանակակից Android խաղերը պետք է կառուցվեն Xamarin.GooglePlayServices.Games.V2 (PlayGamesSdk և PlayGames.GetAchievementsClient) հիման վրա:

79 ձեռքբերումների կատալոգի նախագծում Blocked: Pixel Panzer-ում

Վերլուծելով մեր հիմնական խաղային էությունները (TurretBlock, FighterJet, EnemyRocket, ColorWheel, HydraRegenerationSkill, Season)՝ մենք կառուցեցինք 79 ձեռքբերումներ, որոնք ընդհանուր առմամբ կազմում են 1,995 / 2,000 XP 6 հիմնական կատեգորիաներում.

Կատեգորիա Օրինակ ձեռքբերումներ Տեսակ Թիրախ / Մեխանիկա
Թշնամիների որսորդներ Jet Hunter I–III, Sky Dominator, Turret Buster I–III, Siege Master Աստիճանական Ոչնչացնել 10, 100, 1,000 և 10,000 կործանիչ ինքնաթիռներ, պաշտպանական աշտարակներ և հրթիռներ:
Բլոկների ոչնչացում և պայթուցիկներ Pioneer Breaker, Demolition Crew, Crusher Supreme, Pixel Obliterator, Chain Reaction Աստիճանական / Ստանդարտ Կոտրել 1,000-ից մինչև 10,000 բլոկ և պայթեցնել 5/25/50 թիրախ մեկ դինամիտի պայթյունով:
ColorWheel և զենքի վարպետություն Prismatic Pilot, Acid Dissolver, Critical Striker, Power Blaster, Speedy Sprinter, Beam Vaporizer Աստիճանական Հալեցնել բլոկները կանաչ թթվային զինամթերքով, հասցնել սև կրիտիկական հարվածներ, արձակել կարմիր հզոր կրակոցներ, լազերներ և հրթիռներ:
Փուլերի և Բոսերի առաջընթաց First Blood, Giant Slayer, Decimator, Speedrunner I–III Աստիճանական / Ստանդարտ Թշնամու առաջին սպանություն, առաջին հաղթանակ Բոսի նկատմամբ և փուլերի ավարտ 4 րոպեից պակաս ժամանակում:
Մաքրամաքուր (Purist) մարտահրավերներ Untouchable, Clean Victory I–III, Purist Gladiator, Mono Specialist Աստիճանական / Ստանդարտ Հաղթել Բոսերին և ավարտել բարձր մակարդակները՝ առանց որևէ վնաս ստանալու կամ առանց հմտություններ (skills) օգտագործելու:
Մթնոլորտ, պաշարներ և մետա Storm Fighter, Retro Connoisseur, Gem Tycoon, Quad Spectrum, Audiophile, Loyal Supporter Աստիճանական / Թաքնված Ոչնչացնել 100 աշտարակ անձրևոտ եղանակին, հավաքել CRT մոնիտորներ և լսել ամբողջական երգեր երաժշտական նվագարկիչում:

Յուրաքանչյուր ձեռքբերման համար մենք ստեղծել ենք հատուկ 512x512 պիքսել-արտ կրծքանշաններ, որոնց շրջանակները բրոնզից վերածվում են ոսկու և պրիզմատիկ մակարդակների, երբ բարդությունը մեծանում է.

Blocked: Pixel Panzer Ձեռքբերումների հատուկ կրծքանշաններ
Վեց նմուշային 512x512 կրծքանշաններ մեր 79 ձեռքբերումների կատալոգից՝ Sky Dominator, Turret Buster III, Pixel Obliterator, Prismatic Pilot IV, Acid Dissolver II և Power Blaster II:

Պրոֆեսիոնալ խորհուրդ (ZIP փաթեթով ներմուծում). Google Play Console-ի ինտերֆեյսում 79 ձեռքբերումները ձեռքով մուտքագրելը ժամեր է պահանջում: Փոխարենը օգտագործեք Play Console-ի "Import achievements" գործառույթը՝ միավորելով AchievementsMetadata.csv, AchievementsIconsMappings.csv և ձեր 512x512 .jpg պատկերակները մեկ .zip արխիվում՝ ամբողջ կատալոգը վայրկյանների ընթացքում ներմուծելու համար:

Google Play Console-ում հրապարակված ձեռքբերումների աղյուսակ
Մեր հրապարակված ձեռքբերումները և XP բաշխումը Google Play Console-ում:


3. Մաքուր ճարտարապետություն. IGamesService և AchievementDirector ընդհանուր կոդում

Blocked: Pixel Panzer-ը խաչաձև պլատֆորմային MonoGame նախագիծ է, որն աշխատում է ինչպես Windows PC-ում (Microsoft Store), այնպես էլ Android-ում (Google Play): Որպեսզի մեր ընդհանուր խաղային նախագիծը (Blocked.Shared) լիովին զերծ մնա Android SDK-ի կախվածություններից, մենք կիրառում ենք Կախվածության ինվերսիայի սկզբունքը (Dependency Inversion Principle - SOLID):

Նախ, մենք սահմանում ենք պլատֆորմից անկախ IGamesService ինտերֆեյս ընդհանուր շերտում.

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();
    }
}

Ձեռքբերումների ստուգումները CollisionManager-ում, GameplayScreen-ում և Player-ում ցրելու փոխարեն, մենք կենտրոնացնում ենք բոլոր 79 կանոնները մեկ համակարգող դասի մեջ՝ 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. Կրիտիկական ճարտարագիտություն. JNI / Binder IPC ծանրաբեռնվածության վերացում ANR-ները կանխելու համար

Արագընթաց արկադային խաղում ձեռքբերումների գործարկիչները (triggers) ուղղակիորեն Google Play SDK-ին միացնելը ստեղծում է կատարողականի լուրջ թակարդ.

Երբ խաղացողը պայթեցնում է Պայթուցիկ բլոկ (ExplosiveBlock) կամ կրակում է Laser Beam հմտությունը, մեկ կադրի ընթացքում (16.6 միլիվայրկյան) կարող է ոչնչացվել 20-ից 30 բլոկ և թշնամի: Երբ յուրաքանչյուր ոչնչացում թարմացնում է 5 կամ 6 աստիճանական մակարդակ, մեկ կադրը կարող է առաջացնել ավելի քան 150 IncrementAchievement կանչ:

Եթե դուք ուղարկեք 150 սինխրոն JNI և Binder IPC կանչեր Google Play Services-ին հիմնական խաղային ցիկլի թելում (thread).

  1. Սկզբնական մակարդակի Android սարքերը (1–2 ԳԲ RAM Android Go հեռախոսներ) անմիջապես տուժում են կադրերի լուրջ անկումներից:
  2. JNI-ի գլոբալ հղումների աղյուսակը (GREF) գերբեռնվում է՝ առաջացնելով ANR (Input dispatching timed out) հաշվետվություններ Google Play Vitals-ում:

Մեր լուծումը. Հիշողության մեջ 1.5 վրկ batching և սեսիայի դեդուպլիկացիա

Մեր իրականացումը GooglePlayGamesService.cs-ում լիովին մեկուսացնում է MonoGame-ի թարմացման ցիկլը Google Play IPC կանչերից.

  1. Սեսիայի դեդուպլիկացիա (_unlockedInSession).
    Երբ ստանդարտ ձեռքբերումը բացվում է սեսիայի ընթացքում, դրա ID-ն ավելացվում է HashSet<string>-ում: Նույն կամ հաջորդ կադրերում կրկնվող գործարկումներն անմիջապես վերադարձվում են C#-ում՝ զրոյական JNI ծախսով:
  2. 1.5 վայրկյանանոց ֆոնային batching (_pendingIncrements).
    IncrementAchievement-ի կանչը պարզապես մեծացնում է ամբողջ թիվը հիմնական թելի հիշողության Dictionary<string, int>-ում (զրո JNI կանչ): Ֆոնային Task.Run աշխատողն արթնանում է 1.5 վայրկյան հետո, վերցնում կուտակված ընդհանուր գումարների պատճենը (snapshot) և դրանք ուղարկում Google Play Services-ին մեկ համակցված կանչով յուրաքանչյուր ձեռքբերման համար:
  3. 26502: CLIENT_RECONNECT_REQUIRED մշակում և անցանց քեշավորում.
    Եթե խաղացողը ժամերով թողնում է խաղը ֆոնային ռեժիմում և վերադառնում, Google Play սեսիայի տոկենը կարող է լրանալ և առաջացնել 26502 (CLIENT_RECONNECT_REQUIRED) սխալ: Մեր ծառայությունը որսում է սա, փորձում է մեկ լուռ ֆոնային SignIn() cooldown պաշտպանությամբ և անցնում է GPGS-ի տեղական անցանց քեշին (client.Unlock), եթե սարքն անցանց է՝ ապահովելով, որ խաղացողի ոչ մի ձեռքբերում երբեք չկորչի:
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. Ինչպե՞ս են խաղացողները հետևում իրենց ձեռքբերումներին խաղի մեջ:

Մարտի ժամանակ ծանուցումները հիանալի են, բայց խաղացողներին անհրաժեշտ է նաև հստակ տեղ՝ փակ կրծքանշանները դիտելու, աստիճանական առաջընթացի տոկոսները ստուգելու և իրենց հաջորդ նպատակն ընտրելու համար:

Սա մաքուր ապահովելու համար մենք մեր բջջային վիճակագրության էկրանը վերածեցինք միասնական STATS & RANKS կենտրոնի: Էկրանի վերևում երկու ոսկե կոճակներ՝ LEADERBOARD և ACHIEVEMENTS, թարթում են 2 վայրկյանանոց սահուն սինուսային փայլով (Math.Sin): Windows Desktop-ի կառուցվածքներում այս բջջային կոճակներն ավտոմատ կերպով թաքնվում են՝ պահպանելով դասական STATISTICS դասավորության մաքրությունը:

Երբ խաղացողը սեղմում է ACHIEVEMENTS.

  1. FlushPendingIncrementsNow()-ն անմիջապես գործարկվում է, որպեսզի վերջին 1.5 վայրկյանի ցանկացած առաջընթաց գրանցվի նախքան ինտերֆեյսի բացվելը:
  2. GetAchievementsIntent()-ը գործարկում է Google Play Games-ի ներկառուցված Achievements overlay-ը անմիջապես խաղի վրա.

Google Play Games-ի ներկառուցված ձեռքբերումների Overlay-ը Blocked: Pixel Panzer-ում
Google Play Games-ի ներկառուցված ձեռքբերումների overlay-ը, որը բացվել է STATS & RANKS էկրանից՝ ցուցադրելով ընդհանուր առաջընթացը (2 / 79), առաջարկվող նպատակները, բացված կրծքանշանները (Loyal Supporter, Audiophile) և փակ աստիճանական օղակները:

Խաղացողները կարող են ստուգել իրենց 2 / 79 առաջընթացը, դիտել անհատականացված առաջարկությունները և հետևել աստիճանական տոկոսային օղակներին՝ առանց հավելվածից դուրս գալու:


6. Եզրակացություն և մեր խաղերը

Երբ կառուցվում է 2,000 XP-ի հավասարակշռված բյուջեով և ֆոնային batching խողովակաշարով, Google Play Games-ի ձեռքբերումները արկադային խաղին խորություն և երկարաժամկետ կրկնախաղելիություն ավելացնելու ամենաարդյունավետ միջոցներից են՝ առանց կադրերի հաճախականությունը զոհաբերելու:

Եթե ցանկանում եք անձամբ փորձարկել մեր 79 ձեռքբերումների առաջընթացի համակարգը, ColorWheel մարտական մեխանիկան և համաշխարհային առաջատարների աղյուսակները կամ ծանոթանալ մեր մյուս խաղերին, կարող եք գտնել դրանք ստորև նշված խանութներում.

🎮 Մեր խաղերը.

  • 🛡️ Blocked: Pixel Panzer.
    Ռետրո պիքսելային տանկային էքշն՝ ColorWheel տարրական զինամթերքով, դինամիկ եղանակով, Բոսերի մարտերով, համաշխարհային առաջատարների աղյուսակներով և Google Play-ի 79 ձեռքբերումներով:
    👉 Ներբեռնել Google Play-ում (Android & PC) | Microsoft Store (Windows PC)
  • 🎨 Paint Trek.
    Արագընթաց, գունագեղ տիեզերական արկադային հրաձիգ, որը միավորում է ռեֆլեքսներն ու մարտավարական շարժումը:
    👉 Google Play | Microsoft Store (PC & Xbox)
  • 🚀 Space Dodger.
    Բարձր արագությամբ ռետրո արկադային արգելքների շրջանցում խորը տիեզերքում:
    👉 Ներբեռնել Google Play-ում

📢 Հետևեք մեր Devlogs-ին և համայնքին.

Հետևեք մեզ ավելի շատ տեխնիկական հոդվածների, կուլիսների հետևում տեսանյութերի և խաղերի թարմացումների համար.


Tags & Topics

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




Hiç yorum yok:

Yorum Gönder