ජංගම ක්රීඩාවල Google Play Games ජයග්රහණ: Store බලපෑම, 2,000 XP සීමාව සහ MonoGame ගෘහ නිර්මාණ ශිල්පය
ඔබ ජංගම ක්රීඩාවක් නිර්මාණය කර Play Store වෙත නිකුත් කළ පසු සැබෑ අභියෝගය ආරම්භ වේ: ක්රීඩකයෙකුගේ පළමු මිනිත්තු කිහිපයේ කුතුහලය දිගුකාලීන ක්රීඩා බැඳීමක් (retention) බවට පත් කිරීමයි. ක්රීඩකයින් හුදු "මට්ටම ජයගන්න, ඊළඟ මට්ටම අරඹන්න" යන චක්රයක පමණක් සිරවූ විට, ඔවුන් ඉක්මනින් වෙහෙසට පත්වේ—නැතහොත් ඔබ නිර්මාණය කළ ගැඹුරු ක්රීඩා යාන්ත්රණවලින් අඩක්වත් අත්විඳින්නේ නැතිව ක්රීඩාව වසා දමයි.
බැලූ බැල්මට, Google Play Games Services (GPGS) Achievements පද්ධතිය තිරය මත දිස්වන කුඩා ලාංඡන එකතුවක් ලෙස පෙනෙන්නට පුළුවන. එහෙත් එය නිවැරදිව සැලසුම් කළ විට, ක්රීඩකයින් ඔබේ ක්රීඩාවේ සෑම යාන්ත්රණයක් හරහාම මෙහෙයවන ප්රබල රඳවා ගැනීමේ එන්ජිමක් බවට පත්වේ.
මෙම තාක්ෂණික ලිපියෙන්, Google Play පරිසර පද්ධතිය තුළ ජයග්රහණ සැබවින්ම ඉටු කරන කාර්යභාරය, Blocked: Pixel Panzer සඳහා Google හි දැඩි XP රීති යටතේ අප සුවිශේෂී ජයග්රහණ 79ක් සැලසුම් කළ ආකාරය, සහ තීව්ර ආකේඩ් සටන් අතරතුර FPS පහත වැටීම් සහ Android ANRs (Application Not Responding) වළක්වන අසමමුහුර්ත (asynchronous) MonoGame / C# batching පයිප්ප මාර්ගයක් අප නිර්මාණය කළ ආකාරය විස්තරාත්මකව සාකච්ඡා කරමු.
1. Google Play Games ජයග්රහණ (Achievements) වැදගත් වන්නේ ඇයි?
Google Play Games ජයග්රහණ ක්රීඩාවට ඒකාබද්ධ කිරීමෙන් ක්රීඩක මනෝවිද්යාව සහ store කාර්යසාධන ප්රමිතික යන දෙඅංශයෙන්ම ප්රත්යක්ෂ ප්රතිලාභ හතරක් හිමිවේ:
- විකල්ප ඉලක්ක සහ ක්රීඩක රඳවා ගැනීම (Day-7 / Day-30 Retention):
සෑම ක්රීඩකයෙකුටම ගෝලීය ප්රමුඛ පුවරුවේ (leaderboard) අංක 1 ස්ථානයට ළඟා විය නොහැක, නමුත් සෑම ක්රීඩකයෙකුටම "ටර්ට් (Turrets) 100ක් විනාශ කරන්න" හෝ "කිසිදු හානියක් නොලබා මට්ටමක් අවසන් කරන්න" යන ඉලක්ක සපුරා ගත හැක. වර්ධක ජයග්රහණ (Incremental achievements) සෑම ක්රීඩා වාරයකදීම ඉදිරියට යන පැහැදිලි ප්රගති තීරුවක් සපයයි. - ක්රීඩා යාන්ත්රණ ස්වභාවිකව ඉගැන්වීම (Implicit Onboarding):
ක්රීඩකයින් බොහෝ විට තමන්ගේ පෙරනිමි ආයුධයට පමණක් සීමා වී නව දේ අත්හදා බැලීමට පසුබට වෙති. Blocked: Pixel Panzer හි, ColorWheel මත හරිත අම්ල (acid) උණ්ඩ මඟින් එකවර කොටස් දියකර හැරීම හෝ කළු උණ්ඩ මඟින් තීරණාත්මක පහරවල් (critical hits) එල්ල කිරීම ජයග්රහණ හරහා ඇගයීමට ලක් කිරීමෙන්, ක්රීඩකයින් සෑම මූලද්රව්ය ප්රකාරයක්ම ප්රගුණ කිරීමට පෙළඹේ. - ක්ෂණික ප්රතිචාර සහ Google Play Gamer XP:
දරුණු සටනක් මධ්යයේ තිරයේ ඉහළ සිට නිල Google Play Games බැනරය පහළට ලිස්සා ඒම දැකීම—සහ ඔවුන්ගේ ගෝලීය Google Play Gamer Level සඳහා XP උපයා ගැනීම—ක්රීඩකයන්ට ඔවුන්ගේ මෙහෙයුම් පද්ධති පැතිකඩ සමඟ බැඳුණු ස්ථිර ප්රගතියක් පිළිබඳ හැඟීමක් ලබා දෙයි. - Google Play පරිසර පද්ධතිය සහ ගුණාත්මක සංඥා:
Google Play Games Services V2 (PGS V2) ඒකාබද්ධ කිරීම හරහා Zero-Tap ස්වයංක්රීය පුරනය වීම, Google Play Games on PC සමඟ බාධාවකින් තොර අනුකූලතාව සහ Google Play Store හි "Games" ටැබ් එක තුළ වඩාත් ශක්තිමත් පරිශීලක සහභාගීත්ව සංඥා ගෙන එයි.
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 සීමාව (Incremental Achievements): සමුච්චිත ගණක ජයග්රහණ සඳහා Play Console හි උපරිම වශයෙන් පියවර 10,000ක් (steps) සහාය දක්වයි.
- Play Games Services V2 අනිවාර්ය අවශ්යතාවය: Google විසින් පැරණි V1 SDK අත්හිටුවමින් පවතී. නවීන Android ක්රීඩා
Xamarin.GooglePlayServices.Games.V2(PlayGamesSdkසහPlayGames.GetAchievementsClient) මත ගොඩනැඟිය යුතුය.
Blocked: Pixel Panzer හි ජයග්රහණ 79ක නාමාවලියක් නිර්මාණය කිරීම
අපගේ මූලික ක්රීඩා වස්තු (TurretBlock, FighterJet, EnemyRocket, ColorWheel, HydraRegenerationSkill, Season) විගණනය කිරීමෙන්, ප්රධාන කාණ්ඩ 6ක් යටතේ සම්පූර්ණ 1,995 / 2,000 XP ප්රමාණයක් ආවරණය වන පරිදි අප ජයග්රහණ 79ක් ව්යුහගත කළෙමු:
| කාණ්ඩය | ආදර්ශ ජයග්රහණ | වර්ගය | ඉලක්කය / යාන්ත්රණය |
|---|---|---|---|
| Enemy Hunters | Jet Hunter I–III, Sky Dominator, Turret Buster I–III, Siege Master |
Incremental | ප්රහාරක ජෙට් යානා, ආරක්ෂක ටර්ට් සහ හෝමිං රොකට් 10, 100, 1,000 සහ 10,000ක් විනාශ කිරීම. |
| Block Destruction & Explosives | Pioneer Breaker, Demolition Crew, Crusher Supreme, Pixel Obliterator, Chain Reaction |
Incremental / Standard | කොටස් 1,000 සිට 10,000 දක්වා බිඳ දැමීම සහ තනි ඩයිනමයිට් පිපිරුමකින් ඉලක්ක 5/25/50ක් පුපුරුවා හැරීම. |
| ColorWheel & Weapon Mastery | Prismatic Pilot, Acid Dissolver, Critical Striker, Power Blaster, Speedy Sprinter, Beam Vaporizer |
Incremental | හරිත අම්ල උණ්ඩවලින් කොටස් දියකිරීම, කළු තීරණාත්මක පහරවල්, රතු බල පහරවල්, ලේසර් සහ හෝමිං මිසයිල ප්රහාර. |
| Stage & Boss Progression | First Blood, Giant Slayer, Decimator, Speedrunner I–III |
Incremental / Standard | පළමු සතුරා විනාශ කිරීම, පළමු Boss ජයග්රහණය, සහ මිනිත්තු 4කට අඩු කාලයකින් මට්ටම් අවසන් කිරීම. |
| Purist Challenges | Untouchable, Clean Victory I–III, Purist Gladiator, Mono Specialist |
Incremental / Standard | කිසිදු හානියක් නොලබා හෝ කුසලතා (skills) ශුන්යයක් භාවිතා කරමින් Bosses පරාජය කිරීම සහ උසස් මට්ටම් අවසන් කිරීම. |
| Atmosphere, Supplies & Meta | Storm Fighter, Retro Connoisseur, Gem Tycoon, Quad Spectrum, Audiophile, Loyal Supporter |
Incremental / Hidden | වැසි සහිත කාලගුණය තුළ ටර්ට් 100ක් විනාශ කිරීම, CRT මොනිටර් එකතු කිරීම සහ සංගීත ධාවකයේ සම්පූර්ණ ගීතවලට සවන් දීම. |
සෑම ජයග්රහණයක් සඳහාම, දුෂ්කරතාවය වැඩි වන විට ලෝකඩයේ සිට රන් සහ ප්රිස්මැටික් මට්ටම් දක්වා විකාශනය වන රාමු සහිත අභිරුචි 512x512 පික්සල්-කලා ලාංඡන නිරූපක (badge icons) අප නිර්මාණය කළෙමු:
ප්රවීණ ඉඟිය (තොග ZIP ආයාත කිරීම - Bulk ZIP Import): Google Play Console වෙබ් අතුරුමුහුණත තුළ ජයග්රහණ 79ක් අතින් ටයිප් කිරීම සඳහා පැය ගණනාවක් ගතවේ. ඒ වෙනුවට,
AchievementsMetadata.csv,AchievementsIconsMappings.csvසහ ඔබේ 512x512.jpgනිරූපක තනි.zipගොනුවකට ඇසුරුම් කර තත්පර කිහිපයකින් සම්පූර්ණ නාමාවලියම ආයාත කිරීමට Play Console හි "Import achievements" විශේෂාංගය භාවිතා කරන්න.
3. පිරිසිදු ගෘහ නිර්මාණ ශිල්පය (Clean Architecture): Shared Code හි IGamesService සහ AchievementDirector
Blocked: Pixel Panzer යනු Windows PC (Microsoft Store) සහ Android (Google Play) යන දෙකෙහිම ධාවනය වන හරස් වේදිකා (cross-platform) MonoGame ව්යාපෘතියකි. අපගේ හවුල් ක්රීඩා ව්යාපෘතිය (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. තීරණාත්මක ඉංජිනේරු විද්යාව: ANR වැළැක්වීම සඳහා JNI / Binder IPC Overhead ඉවත් කිරීම
වේගවත් ආකේඩ් ක්රීඩාවකදී, ජයග්රහණ ප්රේරක සෘජුවම Google Play SDK වෙත සම්බන්ධ කිරීම දැඩි කාර්යසාධන බාධාවක් නිර්මාණය කරයි:
ක්රීඩකයෙකු පුපුරන සුලු කොටසක් (ExplosiveBlock) පුපුරුවා හරින විට හෝ Laser Beam කුසලතාව ක්රියාත්මක කරන විට, තනි රාමුවක් තුළ (මිලි තත්පර 16.6) කොටස් සහ සතුරන් 20 සිට 30 දක්වා විනාශ විය හැක. එක් එක් විනාශය මඟින් වර්ධක මට්ටම් 5ක් හෝ 6ක් යාවත්කාලීන වන විට, තනි රාමුවකට IncrementAchievement ඇමතුම් 150කට වඩා ක්රියාත්මක විය හැක!
ඔබ ප්රධාන ක්රීඩා ලූප නූල (main thread) මත Google Play Services වෙත සමමුහුර්ත JNI සහ Binder IPC ඇමතුම් 150ක් යවන්නේ නම්:
- මූලික මට්ටමේ Android උපාංග (1–2 GB RAM සහිත Android Go දුරකථන) වහාම දැඩි රාමු ඇනහිටීම්වලට (frame stutters) මුහුණ දෙයි.
- JNI Global Reference (GREF) වගුව අධික ලෙස පිරී යයි, එමඟින් Google Play Vitals හි ANR (
Input dispatching timed out) වාර්තා ඇතිවේ.
අපගේ විසඳුම: මතකයේ තත්පර 1.5ක Batching සහ Session Deduplication
GooglePlayGamesService.cs හි අපගේ ක්රියාත්මක කිරීම MonoGame යාවත්කාලීන ලූපය Google Play IPC ඇමතුම්වලින් සම්පූර්ණයෙන්ම වෙන් කරයි:
- සැසි අනුපිටපත් ඉවත් කිරීම - Session Deduplication (
_unlockedInSession):
සැසියක් අතරතුර සම්මත ජයග්රහණයක් අගුළු හරිනු ලැබූ පසු, එහි ID එකHashSet<string>වෙත එක් කෙරේ. එම රාමුවේම හෝ පසුව සිදුවන පුනරාවර්තන ප්රේරක කිසිදු JNI පිරිවැයක් නොමැතිව C# තුළදීම ක්ෂණිකව ආපසු හැරේ. - තත්පර 1.5ක පසුබිම් කණ්ඩායම් සැකසුම - Background Batching (
_pendingIncrements):
IncrementAchievementඇමතීමෙන් ප්රධාන නූලෙහි ඇති මතකයේ පවතිනDictionary<string, int>තුළ නිඛිලයක් වැඩි කිරීම පමණක් සිදු වේ (JNI ඇමතුම් ශුන්යයකි). පසුබිම්Task.Runසේවකයෙකු තත්පර 1.5කට පසු අවදි වී, එකතු වූ එකතුවන් ග්රහණය කර, එක් ජයග්රහණයකට එක් ඒකාබද්ධ ඇමතුමක් බැගින් Google Play Services වෙත යවයි. 26502: CLIENT_RECONNECT_REQUIREDහැසිරවීම සහ Offline Caching:
ක්රීඩකයෙකු පැය ගණනාවක් ක්රීඩාව පසුබිමේ තබා නැවත පැමිණියහොත්, Google Play සැසි ටෝකනය කල් ඉකුත් වී26502 (CLIENT_RECONNECT_REQUIRED)දෝෂය ඇතිවිය හැක. අපගේ සේවාව මෙය හසුකර ගෙන, සිසිලන ආරක්ෂාවක් (cooldown guard) සහිතව තනි නිහඬ පසුබිම්SignIn()උත්සාහයක් දරයි. උපාංගය නොබැඳිව (offline) ඇත්නම් 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 ස්පර්ශ කළ විට:
- UI විවෘත වීමට පෙර පසුගිය තත්පර 1.5 තුළ සිදු වූ ඕනෑම ප්රගතියක් තහවුරු වන පරිදි
FlushPendingIncrementsNow()වහාම ධාවනය වේ. GetAchievementsIntent()මඟින් Google Play Games හි ස්වදේශීය (native) Achievements ආවරණය සෘජුවම ක්රීඩාවට ඉහළින් දියත් කරයි:
ක්රීඩකයින්ට යෙදුමෙන් ඉවත් නොවී ඔවුන්ගේ 2 / 79 ප්රගතිය පරීක්ෂා කිරීමට, පුද්ගලාරෝපිත නිර්දේශ බැලීමට සහ වර්ධක ප්රතිශත වළලු නිරීක්ෂණය කිරීමට හැකිය.
6. නිගමනය සහ අපගේ ක්රීඩා
සමබර 2,000 XP අයවැයක් සහ අවහිර නොවන පසුබිම් batching පයිප්ප මාර්ගයක් සමඟ ගොඩනැඟූ විට, Google Play Games Achievements යනු රාමු අනුපාතය (FPS) කැප නොකර ආකේඩ් ක්රීඩාවකට ගැඹුරක් සහ දිගුකාලීන නැවත ක්රීඩා කිරීමේ හැකියාවක් එක් කිරීමට ඇති වඩාත්ම ඵලදායී ක්රමයකි.
ඔබට අපගේ ජයග්රහණ 79ක ප්රගති පද්ධතිය, ColorWheel සටන් යාන්ත්රණය සහ ගෝලීය ප්රමුඛ පුවරු සෘජුවම අත්විඳීමට අවශ්ය නම්—හෝ අපගේ අනෙකුත් නිර්මාණ පරීක්ෂා කිරීමට අවශ්ය නම්—පහත වෙළඳසැල්වලින් ඒවා සොයාගත හැකිය:
🎮 අපගේ ක්රීඩා:
- 🛡️ Blocked: Pixel Panzer:
ColorWheel මූලද්රව්ය උණ්ඩ, ගතික කාලගුණය, Boss සටන්, ගෝලීය ප්රමුඛ පුවරු සහ 79 Google Play ජයග්රහණ ඇතුළත් රෙට්රෝ පික්සල් ටැංකි ක්රියාදාමය!
👉 Google Play වෙතින් බාගන්න (Android & PC) | Microsoft Store (Windows PC) - 🎨 Paint Trek:
ප්රත්යාවර්ත (reflexes) සහ උපායශීලී චලනය ඒකාබද්ධ කරන වේගවත්, වර්ණවත් අභ්යවකාශ ආකේඩ් වෙඩික්කරු.
👉 Google Play | Microsoft Store (PC & Xbox) - 🚀 Space Dodger:
ගැඹුරු අභ්යවකාශයේ අධිවේගී රෙට්රෝ ආකේඩ් බාධක මඟහැරීම.
👉 Google Play වෙතින් බාගන්න
📢 අපගේ Devlogs සහ ප්රජාව අනුගමනය කරන්න:
වැඩිදුර තාක්ෂණික ලිපි, තිරය පිටුපස දර්ශන සහ ක්රීඩා යාවත්කාලීන සඳහා අපව අනුගමනය කරන්න:
- 🎵 TikTok: @arargamesstudio
- 📸 Instagram: @arargamesstudio
- 🐦 X (Twitter): @arargamesstudio
- 📺 YouTube: @koreaaria
- 🧵 Threads: @arargamesstudio
- 📘 Facebook: arargamesstudio
ටැග් සහ මාතෘකා
#GooglePlayGames #Achievements #MonoGame #CSharp #MobileGameDev #AndroidDev #IndieDev #GameArchitecture #BlockedPixelPanzer #PaintTrek #ArarGames
Hiç yorum yok:
Yorum Gönder