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-ի ձեռքբերումների ինտեգրումն ապահովում է չորս շոշափելի առավելություն ինչպես խաղացողի հոգեբանության, այնպես էլ խանութի արդյունավետության ցուցանիշների առումով.
- Այլընտրանքային նպատակներ և խաղացողների պահպանում (Օր 7 / Օր 30 Retention).
Ոչ բոլոր խաղացողները կարող են հասնել առաջին տեղին համաշխարհային առաջատարների աղյուսակում (leaderboard), բայց յուրաքանչյուր խաղացող կարող է ձգտել "Ոչնչացնել 100 աշտարակ" կամ "Ավարտել փուլն առանց վնաս ստանալու": Աստիճանական (incremental) ձեռքբերումներն ապահովում են առաջընթացի տեսանելի սանդղակ, որն առաջ է շարժվում յուրաքանչյուր խաղաշրջանի հետ: - Խաղի մեխանիկայի բնական ուսուցում (Implicit Onboarding).
Խաղացողները հաճախ հակված են մնալ իրենց հիմնական զենքի հետ և խուսափում են փորձարկումներից: Blocked: Pixel Panzer-ում խաղացողներին պարգևատրելը ColorWheel-ի վրա կանաչ թթվային զինամթերքով բլոկները միաժամանակ հալեցնելու կամ սև զինամթերքով կրիտիկական հարվածներ հասցնելու համար խրախուսում է նրանց բացահայտել և տիրապետել յուրաքանչյուր տարրական ռեժիմի: - Ակնթարթային արձագանք և Google Play Gamer XP.
Թեժ ճակատամարտի կեսին էկրանի վերևից Google Play Games-ի պաշտոնական ծանուցման սահելը տեսնելը և իրենց համաշխարհային Google Play Gamer մակարդակի համար XP վաստակելը խաղացողներին տալիս է օպերացիոն համակարգի պրոֆիլի հետ կապված մշտական առաջընթացի զգացում: - Google Play էկոհամակարգ և որակի ազդանշաններ.
Google Play Games Services V2 (PGS V2) ինտեգրումը բերում է Zero-Tap ավտոմատ մուտք, անխափան համատեղելիություն Google Play Games on PC-ի հետ և ավելի ուժեղ ներգրավվածության ազդանշաններ Google Play Store-ի «Խաղեր» ներդիրում:
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 պիքսել-արտ կրծքանշաններ, որոնց շրջանակները բրոնզից վերածվում են ոսկու և պրիզմատիկ մակարդակների, երբ բարդությունը մեծանում է.
Պրոֆեսիոնալ խորհուրդ (ZIP փաթեթով ներմուծում). Google Play Console-ի ինտերֆեյսում 79 ձեռքբերումները ձեռքով մուտքագրելը ժամեր է պահանջում: Փոխարենը օգտագործեք Play Console-ի "Import achievements" գործառույթը՝ միավորելով
AchievementsMetadata.csv,AchievementsIconsMappings.csvև ձեր 512x512.jpgպատկերակները մեկ.zipարխիվում՝ ամբողջ կատալոգը վայրկյանների ընթացքում ներմուծելու համար:
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).
- Սկզբնական մակարդակի Android սարքերը (1–2 ԳԲ RAM Android Go հեռախոսներ) անմիջապես տուժում են կադրերի լուրջ անկումներից:
- JNI-ի գլոբալ հղումների աղյուսակը (GREF) գերբեռնվում է՝ առաջացնելով ANR (
Input dispatching timed out) հաշվետվություններ Google Play Vitals-ում:
Մեր լուծումը. Հիշողության մեջ 1.5 վրկ batching և սեսիայի դեդուպլիկացիա
Մեր իրականացումը GooglePlayGamesService.cs-ում լիովին մեկուսացնում է MonoGame-ի թարմացման ցիկլը Google Play IPC կանչերից.
- Սեսիայի դեդուպլիկացիա (
_unlockedInSession).
Երբ ստանդարտ ձեռքբերումը բացվում է սեսիայի ընթացքում, դրա ID-ն ավելացվում էHashSet<string>-ում: Նույն կամ հաջորդ կադրերում կրկնվող գործարկումներն անմիջապես վերադարձվում են C#-ում՝ զրոյական JNI ծախսով: - 1.5 վայրկյանանոց ֆոնային batching (
_pendingIncrements).
IncrementAchievement-ի կանչը պարզապես մեծացնում է ամբողջ թիվը հիմնական թելի հիշողությանDictionary<string, int>-ում (զրո JNI կանչ): ՖոնայինTask.Runաշխատողն արթնանում է 1.5 վայրկյան հետո, վերցնում կուտակված ընդհանուր գումարների պատճենը (snapshot) և դրանք ուղարկում Google Play Services-ին մեկ համակցված կանչով յուրաքանչյուր ձեռքբերման համար: 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.
FlushPendingIncrementsNow()-ն անմիջապես գործարկվում է, որպեսզի վերջին 1.5 վայրկյանի ցանկացած առաջընթաց գրանցվի նախքան ինտերֆեյսի բացվելը:GetAchievementsIntent()-ը գործարկում է Google Play Games-ի ներկառուցված Achievements overlay-ը անմիջապես խաղի վրա.
Խաղացողները կարող են ստուգել իրենց 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-ին և համայնքին.
Հետևեք մեզ ավելի շատ տեխնիկական հոդվածների, կուլիսների հետևում տեսանյութերի և խաղերի թարմացումների համար.
- 🎵 TikTok: @arargamesstudio
- 📸 Instagram: @arargamesstudio
- 🐦 X (Twitter): @arargamesstudio
- 📺 YouTube: @koreaaria
- 🧵 Threads: @arargamesstudio
- 📘 Facebook: arargamesstudio
Tags & Topics
#GooglePlayGames #Achievements #MonoGame #CSharp #MobileGameDev #AndroidDev #IndieDev #GameArchitecture #BlockedPixelPanzer #PaintTrek #ArarGames
Hiç yorum yok:
Yorum Gönder