Achievements etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Achievements etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

10 Ekim 2026 Cumartesi

ಮೊಬೈಲ್ ಗೇಮ್‌ಗಳಲ್ಲಿ Google Play Games ಸಾಧನೆಗಳು: ಸ್ಟೋರ್ ಪ್ರಭಾವ, 2,000 XP ಮಿತಿ ಮತ್ತು MonoGame ಆರ್ಕಿಟೆಕ್ಚರ್

ಮೊಬೈಲ್ ಗೇಮ್‌ಗಳಲ್ಲಿ Google Play Games ಸಾಧನೆಗಳು: ಸ್ಟೋರ್ ಪ್ರಭಾವ, 2,000 XP ಮಿತಿ ಮತ್ತು MonoGame ಆರ್ಕಿಟೆಕ್ಚರ್

ನೀವು ಮೊಬೈಲ್ ಗೇಮ್ ಅನ್ನು ಅಭಿವೃದ್ಧಿಪಡಿಸಿ ಆಪ್ ಸ್ಟೋರ್‌ನಲ್ಲಿ ಪ್ರಕಟಿಸಿದ ನಂತರ, ನಿಜವಾದ ಸವಾಲು ಪ್ರಾರಂಭವಾಗುತ್ತದೆ: ಆಟಗಾರನ ಆರಂಭಿಕ ಕೆಲವೇ ನಿಮಿಷಗಳ ಕುತೂಹಲವನ್ನು ದೀರ್ಘಕಾಲೀನ ಆಸಕ್ತಿಯನ್ನಾಗಿ (retention) ಪರಿವರ್ತಿಸುವುದು. ಆಟಗಾರರು ಕೇವಲ "ಹಂತವನ್ನು ಮುಗಿಸು, ಮುಂದಿನ ಹಂತ ಪ್ರಾರಂಭಿಸು" ಎಂಬ ಸರಳ ಚಕ್ರದಲ್ಲಿ ಮುಂದುವರಿದಾಗ, ಕಾಲಕ್ರಮೇಣ ಬೇಸರ ಉಂಟಾಗುತ್ತದೆ—ಅಥವಾ ನೀವು ನಿರ್ಮಿಸಿದ ಆಳವಾದ ಗೇಮ್‌ಪ್ಲೇ ಮೆಕ್ಯಾನಿಕ್ಸ್‌ಗಳ ಅರ್ಧದಷ್ಟನ್ನೂ ತಿಳಿಯದೆಯೇ ಅವರು ಆಪ್ ಅನ್ನು ಮುಚ್ಚಿಬಿಡುತ್ತಾರೆ.

ಮೇಲ್ನೋಟಕ್ಕೆ, Google Play Games Services (GPGS) ಸಾಧನೆಗಳ (Achievements) ವ್ಯವಸ್ಥೆಯು ಕೇವಲ ಸಣ್ಣ ಬ್ಯಾಡ್ಜ್‌ಗಳ ಸಂಗ್ರಹದಂತೆ ಕಾಣಿಸಬಹುದು. ಆದರೆ, ಇದನ್ನು ವ್ಯವಸ್ಥಿತವಾಗಿ ವಿನ್ಯಾಸಗೊಳಿಸಿದಾಗ, ಇದು ಆಟಗಾರರನ್ನು ನಿಮ್ಮ ಆಟದ ಪ್ರತಿಯೊಂದು ಮೆಕ್ಯಾನಿಕ್ ಹಂತದ ಮೂಲಕ ಮುನ್ನಡೆಸುವ ಪ್ರಬಲ ರಿಟೆನ್ಶನ್ ಎಂಜಿನ್ ಆಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ.

ಈ ತಾಂತ್ರಿಕ ಲೇಖನದಲ್ಲಿ, Google Play ಪರಿಸರದಲ್ಲಿ ಸಾಧನೆಗಳು ನಿಜವಾಗಿ ಏನನ್ನು ಸಾಧಿಸುತ್ತವೆ, Blocked: Pixel Panzer ಗಾಗಿ Google ನ ಕಠಿಣ XP ನಿಯಮಗಳ ಅಡಿಯಲ್ಲಿ ನಾವು 79 ವಿಶಿಷ್ಟ ಸಾಧನೆಗಳನ್ನು ಹೇಗೆ ವಿನ್ಯಾಸಗೊಳಿಸಿದ್ದೇವೆ ಮತ್ತು ತೀವ್ರವಾದ ಆರ್ಕೇಡ್ ಕದನಗಳಲ್ಲಿ FPS ಕುಸಿತ ಹಾಗೂ Android ANR (Application Not Responding) ದೋಷಗಳನ್ನು ತಡೆಯುವ ಅಸಮಕಾಲಿಕ (asynchronous) MonoGame / C# ಬ್ಯಾಚಿಂಗ್ ಪೈಪ್‌ಲೈನ್ ಅನ್ನು ಹೇಗೆ ನಿರ್ಮಿಸಿದ್ದೇವೆ ಎಂಬುದನ್ನು ನಾವು ವಿವರವಾಗಿ ಪರಿಶೀಲಿಸುತ್ತೇವೆ.


1. Google Play Games ಸಾಧನೆಗಳು ಏಕೆ ಮುಖ್ಯ?

Google Play Games ಸಾಧನೆಗಳನ್ನು ಸಂಯೋಜಿಸುವುದರಿಂದ ಆಟಗಾರರ ಮನಃಶಾಸ್ತ್ರ ಮತ್ತು ಆಪ್ ಸ್ಟೋರ್ ಕಾರ್ಯಕ್ಷಮತೆಯ ಮೆಟ್ರಿಕ್ಸ್‌ಗಳೆರಡರಲ್ಲೂ ನಾಲ್ಕು ನಿರ್ದಿಷ್ಟ ಪ್ರಯೋಜನಗಳು ದೊರೆಯುತ್ತವೆ:

  1. ಪರ್ಯಾಯ ಗುರಿಗಳು ಮತ್ತು ಆಟಗಾರರ ಸ್ಥಿರತೆ (ದಿನ-7 / ದಿನ-30 ರಿಟೆನ್ಶನ್):
    ಪ್ರತಿಯೊಬ್ಬ ಆಟಗಾರನೂ ಜಾಗತಿಕ ಲೀಡರ್‌ಬೋರ್ಡ್‌ನಲ್ಲಿ #1 ನೇ ಸ್ಥಾನ ಪಡೆಯಲು ಸಾಧ್ಯವಿಲ್ಲ, ಆದರೆ ಪ್ರತಿಯೊಬ್ಬ ಆಟಗಾರನೂ "100 ರಕ್ಷಣಾ ತಿರುಗುಗುಮ್ಮಟಗಳನ್ನು (Turrets) ನಾಶಮಾಡಿ" ಅಥವಾ "ಯಾವುದೇ ಹಾನಿಯಾಗದಂತೆ ಹಂತವನ್ನು ಮುಗಿಸಿ" ಎಂಬಂತಹ ಗುರಿಗಳತ್ತ ಸಾಗಬಹುದು. ಹಂತ-ಹಂತದ (ಇಂಕ್ರಿಮೆಂಟಲ್) ಸಾಧನೆಗಳು ಪ್ರತಿ ಗೇಮಿಂಗ್ ಸೆಷನ್‌ನಲ್ಲೂ ಮುಂದುವರಿಯುವ ಸ್ಪಷ್ಟ ಪ್ರೋಗ್ರೆಸ್ ಬಾರ್ ಅನ್ನು ನೀಡುತ್ತವೆ.
  2. ಗೇಮ್ ಮೆಕ್ಯಾನಿಕ್ಸ್ ಅನ್ನು ಸಹಜವಾಗಿ ಕಲಿಸುವುದು (ಪರೋಕ್ಷ ಆನ್‌ಬೋರ್ಡಿಂಗ್):
    ಆಟಗಾರರು ಸಾಮಾನ್ಯವಾಗಿ ತಮ್ಮ ಆರಂಭಿಕ ಆಯುಧವನ್ನೇ ಬಳಸುತ್ತಿರುತ್ತಾರೆ ಮತ್ತು ಹೊಸತನ್ನು ಪ್ರಯೋಗಿಸಲು ಹಿಂಜರಿಯುತ್ತಾರೆ. Blocked: Pixel Panzer ನಲ್ಲಿ, ColorWheel ನಲ್ಲಿ ಹಸಿರು ಆಮ್ಲೀಯ ಮದ್ದುಗುಂಡುಗಳಿಂದ ಬ್ಲಾಕ್‌ಗಳನ್ನು ಏಕಕಾಲದಲ್ಲಿ ಕರಗಿಸುವುದಕ್ಕಾಗಿ ಅಥವಾ ಕಪ್ಪು ಮದ್ದುಗುಂಡುಗಳಿಂದ ಕ್ರಿಟಿಕಲ್ ಹಿಟ್‌ಗಳನ್ನು ಹೊಡೆಯುವುದಕ್ಕಾಗಿ ಆಟಗಾರರಿಗೆ ಬಹುಮಾನ ನೀಡುವುದು ಪ್ರತಿಯೊಂದು ಅಂಶದ ಮೋಡ್ ಅನ್ನು ಕಲಿಯಲು ಮತ್ತು ಅದರಲ್ಲಿ ಪರಿಣತಿ ಹೊಂದಲು ಅವರನ್ನು ಪ್ರೋತ್ಸಾಹಿಸುತ್ತದೆ.
  3. ತಕ್ಷಣದ ಪ್ರತಿಕ್ರಿಯೆ ಮತ್ತು Google Play Gamer XP:
    ಭೀಕರ ಕದನದ ಮಧ್ಯದಲ್ಲಿ ಅಧಿಕೃತ Google Play Games ಬ್ಯಾನರ್ ಪರದೆಯ ಮೇಲ್ಭಾಗದಿಂದ ಕೆಳಕ್ಕೆ ಜಾರುವುದನ್ನು ನೋಡುವುದು—ಮತ್ತು ತಮ್ಮ ಜಾಗತಿಕ Google Play Gamer ಲೆವೆಲ್‌ಗೆ XP ಗಳಿಸುವುದು—ಆಟಗಾರರಿಗೆ ತಮ್ಮ OS ಪ್ರೊಫೈಲ್‌ನೊಂದಿಗೆ ಶಾಶ್ವತ ಪ್ರಗತಿಯ ಅನುಭವವನ್ನು ನೀಡುತ್ತದೆ.
  4. Google Play ಪರಿಸರ ಮತ್ತು ಗುಣಮಟ್ಟದ ಸಂಕೇತಗಳು:
    Google Play Games Services V2 (PGS V2) ಸಂಯೋಜನೆಯು Zero-Tap (ಸ್ಪರ್ಶವಿಲ್ಲದ) ಸ್ವಯಂಚಾಲಿತ ಸೈನ್-ಇನ್, Google Play Games on PC ನೊಂದಿಗೆ ಸುಲಭ ಹೊಂದಾಣಿಕೆ ಮತ್ತು Google Play Store ನ "ಗೇಮ್ಸ್" ಟ್ಯಾಬ್‌ನಲ್ಲಿ ಬಲವಾದ ಎಂಗೇಜ್‌ಮೆಂಟ್ ಸಂಕೇತಗಳನ್ನು ತರುತ್ತದೆ.

Blocked: Pixel Panzer ಗೇಮ್‌ನಲ್ಲಿ ಸಾಧನೆ ಅನ್‌ಲಾಕ್ ಅಧಿಸೂಚನೆ
Blocked: Pixel Panzer ನಲ್ಲಿ ಹಂತ 103 ರ ಯುದ್ಧದ ಸಮಯದಲ್ಲಿ 10 ನೇ ತಿರುಗುಗುಮ್ಮಟ ನಾಶವಾದ ತಕ್ಷಣ ಪರದೆಯ ಮೇಲ್ಭಾಗದಲ್ಲಿ ಕಾಣಿಸಿಕೊಳ್ಳುವ ಅಧಿಕೃತ Google Play Games "Turret Buster I" ಪಾಪ್-ಅಪ್ ಟೋಸ್ಟ್ ಅಧಿಸೂಚನೆ.


2. Google Play Console ನಿಯಮಗಳು: 2,000 XP ಮಿತಿ ಮತ್ತು 10,000 ಹಂತಗಳ ಗಡಿ

Google Play Console ನಲ್ಲಿ ಸಾಧನೆಗಳನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡುವಾಗ, ನೀವು ಪ್ಲಾಟ್‌ಫಾರ್ಮ್‌ನ ಮೂರು ಕಠಿಣ ಮಿತಿಗಳಿಗೆ ಅನುಗುಣವಾಗಿ ವಿನ್ಯಾಸಗೊಳಿಸಬೇಕು:

  • 2,000 XP ಕಠಿಣ ಗರಿಷ್ಠ ಮಿತಿ: ಒಂದೇ ಆಟದಲ್ಲಿನ ಎಲ್ಲಾ ಸಾಧನೆಗಳ ಅಂಕಗಳ ಒಟ್ಟು ಮೊತ್ತವು 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) ಮೇಲೆ ನಿರ್ಮಿಸಬೇಕು.

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 ಇಂಕ್ರಿಮೆಂಟಲ್ 10, 100, 1,000 ಮತ್ತು 10,000 ಯುದ್ಧ ವಿಮಾನಗಳು, ರಕ್ಷಣಾ ತಿರುಗುಗುಮ್ಮಟಗಳು ಮತ್ತು ಹೋಮಿಂಗ್ ರಾಕೆಟ್‌ಗಳನ್ನು ನಾಶಮಾಡಿ.
Block Destruction & Explosives Pioneer Breaker, Demolition Crew, Crusher Supreme, Pixel Obliterator, Chain Reaction ಇಂಕ್ರಿಮೆಂಟಲ್ / ಸ್ಟ್ಯಾಂಡರ್ಡ್ 1,000 ದಿಂದ 10,000 ಬ್ಲಾಕ್‌ಗಳನ್ನು ಒಡೆಯಿರಿ ಮತ್ತು ಒಂದೇ ಡೈನಮೈಟ್ ಸ್ಫೋಟದಲ್ಲಿ 5/25/50 ಗುರಿಗಳನ್ನು ಸ್ಫೋಟಿಸಿ.
ColorWheel & Weapon Mastery Prismatic Pilot, Acid Dissolver, Critical Striker, Power Blaster, Speedy Sprinter, Beam Vaporizer ಇಂಕ್ರಿಮೆಂಟಲ್ ಹಸಿರು ಆಮ್ಲೀಯ ಮದ್ದುಗುಂಡುಗಳಿಂದ ಬ್ಲಾಕ್‌ಗಳನ್ನು ಕರಗಿಸಿ, ಕಪ್ಪು ಕ್ರಿಟಿಕಲ್ ಕಿಲ್‌ಗಳನ್ನು ಮಾಡಿ, ಕೆಂಪು ಪವರ್ ಶಾಟ್‌ಗಳು, ಲೇಸರ್‌ಗಳು ಮತ್ತು ಮಾರ್ಗದರ್ಶಿತ ಕ್ಷಿಪಣಿಗಳನ್ನು ಹಾರಿಸಿ.
Stage & Boss Progression First Blood, Giant Slayer, Decimator, Speedrunner I–III ಇಂಕ್ರಿಮೆಂಟಲ್ / ಸ್ಟ್ಯಾಂಡರ್ಡ್ ಮೊದಲ ಶತ್ರು ಸಂಹಾರ, ಮೊದಲ ಬಾಸ್ ವಿಜಯ ಮತ್ತು 4 ನಿಮಿಷಗಳಿಗಿಂತ ಕಡಿಮೆ ಅವಧಿಯಲ್ಲಿ ಹಂತಗಳನ್ನು ಪೂರ್ಣಗೊಳಿಸುವುದು.
Purist Challenges Untouchable, Clean Victory I–III, Purist Gladiator, Mono Specialist ಇಂಕ್ರಿಮೆಂಟಲ್ / ಸ್ಟ್ಯಾಂಡರ್ಡ್ ಶೂನ್ಯ ಹಾನಿ ಅಥವಾ ಯಾವುದೇ ಕೌಶಲ್ಯಗಳನ್ನು ಬಳಸದೆ ಬಾಸ್‌ಗಳನ್ನು ಸೋಲಿಸಿ ಮತ್ತು ಕಠಿಣ ಹಂತಗಳನ್ನು ಮುಗಿಸಿ.
Atmosphere, Supplies & Meta Storm Fighter, Retro Connoisseur, Gem Tycoon, Quad Spectrum, Audiophile, Loyal Supporter ಇಂಕ್ರಿಮೆಂಟಲ್ / ಗುಪ್ತ ಮಳೆಗಾಲದ ಹವಾಮಾನದಲ್ಲಿ 100 ತಿರುಗುಗುಮ್ಮಟಗಳನ್ನು ನಾಶಮಾಡಿ, CRT ಮಾನಿಟರ್‌ಗಳನ್ನು ಸಂಗ್ರಹಿಸಿ ಮತ್ತು ಮ್ಯೂಸಿಕ್ ಪ್ಲೇಯರ್‌ನಲ್ಲಿ ಪೂರ್ಣ ಹಾಡುಗಳನ್ನು ಕೇಳಿ.

ಪ್ರತಿಯೊಂದು ಸಾಧನೆಗಾಗಿ, ಕಷ್ಟದ ಮಟ್ಟ ಹೆಚ್ಚಾದಂತೆ ಕಂಚಿನಿಂದ ಚಿನ್ನ ಹಾಗೂ ಪ್ರಿಸ್ಮಾಟಿಕ್ ಶ್ರೇಣಿಗಳಿಗೆ ವಿಕಸನಗೊಳ್ಳುವ ಕಸ್ಟಮ್ 512x512 ಪಿಕ್ಸೆಲ್-ಆರ್ಟ್ ಬ್ಯಾಡ್ಜ್ ಐಕಾನ್‌ಗಳನ್ನು ನಾವು ರಚಿಸಿದ್ದೇವೆ:

Blocked: Pixel Panzer ಕಸ್ಟಮ್ ಸಾಧನೆ ಬ್ಯಾಡ್ಜ್‌ಗಳು
ನಮ್ಮ 79 ಸಾಧನೆಗಳ ಕ್ಯಾಟಲಾಗ್‌ನಿಂದ ಆರು ಮಾದರಿ 512x512 ಬ್ಯಾಡ್ಜ್‌ಗಳು: Sky Dominator, Turret Buster III, Pixel Obliterator, Prismatic Pilot IV, Acid Dissolver II ಮತ್ತು Power Blaster II.

ಪ್ರೊ ಸಲಹೆ (ಬೃಹತ್ ZIP ಆಮದು): Google Play Console ವೆಬ್ ಇಂಟರ್ಫೇಸ್‌ನಲ್ಲಿ 79 ಸಾಧನೆಗಳನ್ನು ಹಸ್ತಚಾಲಿತವಾಗಿ ಟೈಪ್ ಮಾಡಲು ಗಂಟೆಗಳೇ ಬೇಕಾಗುತ್ತದೆ. ಬದಲಿಗೆ, AchievementsMetadata.csv, AchievementsIconsMappings.csv ಮತ್ತು ನಿಮ್ಮ 512x512 .jpg ಐಕಾನ್‌ಗಳನ್ನು ಒಂದೇ .zip ಆರ್ಕೈವ್‌ನಲ್ಲಿ ಪ್ಯಾಕ್ ಮಾಡುವ ಮೂಲಕ Play Console ನ "ಸಾಧನೆಗಳನ್ನು ಆಮದು ಮಾಡಿ" (Import achievements) ವೈಶಿಷ್ಟ್ಯವನ್ನು ಬಳಸಿ ಕೆಲವೇ ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಇಡೀ ಕ್ಯಾಟಲಾಗ್ ಅನ್ನು ಆಮದು ಮಾಡಿಕೊಳ್ಳಿ.

Google Play Console ಪ್ರಕಟಿತ ಸಾಧನೆಗಳ ಕೋಷ್ಟಕ
Google Play Console ನಲ್ಲಿ ನಮ್ಮ ಪ್ರಕಟಿತ ಸಾಧನೆಗಳು ಮತ್ತು XP ಹಂಚಿಕೆ.


3. ಕ್ಲೀನ್ ಆರ್ಕಿಟೆಕ್ಚರ್: ಹಂಚಿಕೆಯ ಕೋಡ್‌ನಲ್ಲಿ IGamesService ಮತ್ತು AchievementDirector

Blocked: Pixel Panzer ಎಂಬುದು Windows PC (Microsoft Store) ಮತ್ತು Android (Google Play) ಎರಡರಲ್ಲೂ ಚಲಿಸುವ ಕ್ರಾಸ್-ಪ್ಲಾಟ್‌ಫಾರ್ಮ್ MonoGame ಯೋಜನೆಯಾಗಿದೆ. ನಮ್ಮ ಹಂಚಿಕೆಯ ಗೇಮ್‌ಪ್ಲೇ ಪ್ರಾಜೆಕ್ಟ್ (Blocked.Shared) ಅನ್ನು Android SDK ಅವಲಂಬನೆಗಳಿಂದ ಸಂಪೂರ್ಣವಾಗಿ ಮುಕ್ತವಾಗಿಡಲು, ನಾವು ಡಿಪೆಂಡೆನ್ಸಿ ಇನ್ವರ್ಶನ್ ತತ್ವವನ್ನು (SOLID - Dependency Inversion Principle) ಅನ್ವಯಿಸುತ್ತೇವೆ.

ಮೊದಲಿಗೆ, ನಾವು ಹಂಚಿಕೆಯ ಲೇಯರ್‌ನಲ್ಲಿ ಪ್ಲಾಟ್‌ಫಾರ್ಮ್-ಮುಕ್ತ 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 ಓವರ್‌ಹೆಡ್ ನಿವಾರಣೆ

ವೇಗದ ಗತಿಯ ಆರ್ಕೇಡ್ ಆಟದಲ್ಲಿ, ಸಾಧನೆಗಳ ಟ್ರಿಗ್ಗರ್‌ಗಳನ್ನು ನೇರವಾಗಿ Google Play SDK ಗೆ ಸಂಪರ್ಕಿಸುವುದು ಗಂಭೀರ ಕಾರ್ಯಕ್ಷಮತೆಯ ಅಪಾಯವನ್ನು ಉಂಟುಮಾಡುತ್ತದೆ:

ಆಟಗಾರನು ಸ್ಫೋಟಕ ಬ್ಲಾಕ್ (ExplosiveBlock) ಅನ್ನು ಸ್ಫೋಟಿಸಿದಾಗ ಅಥವಾ ಲೇಸರ್ ಕಿರಣ (Laser Beam) ಕೌಶಲ್ಯವನ್ನು ಹಾರಿಸಿದಾಗ, ಒಂದೇ ಫ್ರೇಮ್‌ನಲ್ಲಿ (16.6 ಮಿಲಿಸೆಕೆಂಡ್‌ಗಳು) 20 ರಿಂದ 30 ಬ್ಲಾಕ್‌ಗಳು ಮತ್ತು ಶತ್ರುಗಳು ನಾಶವಾಗಬಹುದು. ಪ್ರತಿಯೊಂದು ವಿನಾಶವು 5 ಅಥವಾ 6 ಇಂಕ್ರಿಮೆಂಟಲ್ ಶ್ರೇಣಿಗಳನ್ನು ಅಪ್‌ಡೇಟ್ ಮಾಡಿದಾಗ, ಒಂದೇ ಫ್ರೇಮ್ 150 ಕ್ಕೂ ಹೆಚ್ಚು IncrementAchievement ಕರೆಗಳನ್ನು ಪ್ರಚೋದಿಸಬಹುದು!

ಗೇಮ್ ಲೂಪ್‌ನ ಮುಖ್ಯ ಥ್ರೆಡ್‌ನಲ್ಲಿ Google Play Services ಗೆ ನೀವು 150 ಸಿಂಕ್ರೋನಸ್ JNI ಮತ್ತು Binder IPC ಕರೆಗಳನ್ನು ರವಾನಿಸಿದರೆ:

  1. ಆರಂಭಿಕ ಹಂತದ Android ಸಾಧನಗಳು (1–2 GB RAM ಹೊಂದಿರುವ Android Go ಫೋನ್‌ಗಳು) ತಕ್ಷಣವೇ ತೀವ್ರ ಫ್ರೇಮ್ ಸ್ಟಟರ್‌ಗಳಿಗೆ (ಹಿನ್ನಡೆ) ಒಳಗಾಗುತ್ತವೆ.
  2. JNI ಗ್ಲೋಬಲ್ ರೆಫರೆನ್ಸ್ (GREF) ಟೇಬಲ್ ತುಂಬಿಹೋಗುತ್ತದೆ, ಇದು Google Play Vitals ನಲ್ಲಿ ANR (Input dispatching timed out) ವರದಿಗಳನ್ನು ಪ್ರಚೋದಿಸುತ್ತದೆ.

ನಮ್ಮ ಪರಿಹಾರ: ಇನ್-ಮೆಮೊರಿ 1.5 ಸೆಕೆಂಡುಗಳ ಬ್ಯಾಚಿಂಗ್ ಮತ್ತು ಸೆಷನ್ ಡಿಡ್ಯೂಪ್ಲಿಕೇಶನ್

GooglePlayGamesService.cs ನಲ್ಲಿನ ನಮ್ಮ ಅನುಷ್ಠಾನವು MonoGame ಅಪ್‌ಡೇಟ್ ಲೂಪ್ ಅನ್ನು Google Play IPC ಕರೆಗಳಿಂದ ಸಂಪೂರ್ಣವಾಗಿ ಪ್ರತ್ಯೇಕಿಸುತ್ತದೆ:

  1. ಸೆಷನ್ ಡಿಡ್ಯೂಪ್ಲಿಕೇಶನ್ (_unlockedInSession):
    ಸೆಷನ್ ಸಮಯದಲ್ಲಿ ಸ್ಟ್ಯಾಂಡರ್ಡ್ ಸಾಧನೆಯು ಅನ್‌ಲಾಕ್ ಆದ ತಕ್ಷಣ, ಅದರ ID ಅನ್ನು HashSet<string> ಗೆ ಸೇರಿಸಲಾಗುತ್ತದೆ. ಅದೇ ಅಥವಾ ಮುಂದಿನ ಫ್ರೇಮ್‌ಗಳಲ್ಲಿ ಪುನರಾವರ್ತಿತ ಟ್ರಿಗ್ಗರ್‌ಗಳು ಯಾವುದೇ JNI ವೆಚ್ಚವಿಲ್ಲದೆ C# ನಲ್ಲಿ ತಕ್ಷಣವೇ ರಿಟರ್ನ್ ಆಗುತ್ತವೆ.
  2. 1.5-ಸೆಕೆಂಡುಗಳ ಹಿನ್ನೆಲೆ ಬ್ಯಾಚಿಂಗ್ (_pendingIncrements):
    IncrementAchievement ಅನ್ನು ಕರೆಯುವುದು ಮುಖ್ಯ ಥ್ರೆಡ್‌ನಲ್ಲಿ ಇನ್-ಮೆಮೊರಿ Dictionary<string, int> ಒಳಗೆ ಕೇವಲ ಪೂರ್ಣಾಂಕವನ್ನು ಹೆಚ್ಚಿಸುತ್ತದೆ (ಯಾವುದೇ JNI ಕರೆಗಳಿಲ್ಲ). ಹಿನ್ನೆಲೆಯ Task.Run ಪ್ರಕ್ರಿಯೆಯು 1.5 ಸೆಕೆಂಡುಗಳ ನಂತರ ಎಚ್ಚರಗೊಂಡು, ಸಂಗ್ರಹವಾದ ಮೊತ್ತದ ಸ್ನ್ಯಾಪ್‌ಶಾಟ್ ತೆಗೆದುಕೊಂಡು, Google Play Services ಗೆ ಪ್ರತಿ ಸಾಧನೆಗೆ ಒಂದು ಸಂಯೋಜಿತ ಕರೆಯ ಮೂಲಕ ಕಳುಹಿಸುತ್ತದೆ.
  3. 26502: CLIENT_RECONNECT_REQUIRED ನಿರ್ವಹಣೆ ಮತ್ತು ಆಫ್‌ಲೈನ್ ಕ್ಯಾಶಿಂಗ್:
    ಆಟಗಾರನು ಆಟವನ್ನು ಗಂಟೆಗಳ ಕಾಲ ಹಿನ್ನೆಲೆಯಲ್ಲಿ ಬಿಟ್ಟು ಹಿಂತಿರುಗಿದರೆ, Google Play ಸೆಷನ್ ಟೋಕನ್ ಅವಧಿ ಮುಗಿಯಬಹುದು ಮತ್ತು 26502 (CLIENT_RECONNECT_REQUIRED) ದೋಷವನ್ನು ಎಸೆಯಬಹುದು. ನಮ್ಮ ಸೇವೆಯು ಇದನ್ನು ಸೆರೆಹಿಡಿಯುತ್ತದೆ, ಕೂಲ್‌ಡೌನ್ ರಕ್ಷಣೆಯೊಂದಿಗೆ ಏಕೈಕ ಸೈಲೆಂಟ್ ಹಿನ್ನೆಲೆ SignIn() ಗೆ ಪ್ರಯತ್ನಿಸುತ್ತದೆ ಮತ್ತು ಸಾಧನವು ಆಫ್‌ಲೈನ್‌ನಲ್ಲಿದ್ದರೆ 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 ಓವರ್‌ಲೇ ಅನ್ನು ತೆರೆಯುತ್ತದೆ:

Blocked: Pixel Panzer ನಲ್ಲಿ Google Play Games ನ ಸ್ಥಳೀಯ ಸಾಧನೆಗಳ ಓವರ್‌ಲೇ
STATS & RANKS ಪರದೆಯಿಂದ ತೆರೆಯಲಾದ Google Play Games ನ ಸ್ಥಳೀಯ ಸಾಧನೆಗಳ ಓವರ್‌ಲೇ, ಇದು ಒಟ್ಟು ಪೂರ್ಣಗೊಳಿಸುವಿಕೆ (2 / 79), ಶಿಫಾರಸು ಮಾಡಿದ ಗುರಿಗಳು, ಅನ್‌ಲಾಕ್ ಆದ ಬ್ಯಾಡ್ಜ್‌ಗಳು (Loyal Supporter, Audiophile) ಮತ್ತು ಲಾಕ್ ಆಗಿರುವ ಇಂಕ್ರಿಮೆಂಟಲ್ ರಿಂಗ್‌ಗಳನ್ನು ತೋರಿಸುತ್ತದೆ.

ಆಟಗಾರರು ಆಪ್‌ನಿಂದ ಹೊರಹೋಗದೆಯೇ ತಮ್ಮ 2 / 79 ಪ್ರಗತಿಯನ್ನು ಪರಿಶೀಲಿಸಬಹುದು, ವೈಯಕ್ತಿಕ ಶಿಫಾರಸುಗಳನ್ನು ನೋಡಬಹುದು ಮತ್ತು ಇಂಕ್ರಿಮೆಂಟಲ್ ಶೇಕಡಾವಾರು ರಿಂಗ್‌ಗಳನ್ನು ಟ್ರ್ಯಾಕ್ ಮಾಡಬಹುದು.


6. ತೀರ್ಮಾನ ಮತ್ತು ನಮ್ಮ ಗೇಮ್‌ಗಳು

ಸಮತೋಲಿತ 2,000 XP ಬಜೆಟ್ ಮತ್ತು ನಾನ್-ಬ್ಲಾಕಿಂಗ್ ಹಿನ್ನೆಲೆ ಬ್ಯಾಚಿಂಗ್ ಪೈಪ್‌ಲೈನ್‌ನೊಂದಿಗೆ ನಿರ್ಮಿಸಿದಾಗ, Google Play Games ಸಾಧನೆಗಳು ಫ್ರೇಮ್ ರೇಟ್‌ಗೆ ಯಾವುದೇ ಧಕ್ಕೆಯಾಗದಂತೆ ಆರ್ಕೇಡ್ ಆಟಕ್ಕೆ ಆಳ ಮತ್ತು ದೀರ್ಘಾವಧಿಯ ಮರುಪ್ಲೇ ಮೌಲ್ಯವನ್ನು ನೀಡುವ ಅತ್ಯಂತ ಪರಿಣಾಮಕಾರಿ ಮಾರ್ಗಗಳಲ್ಲಿ ಒಂದಾಗಿದೆ.

ನಮ್ಮ 79-ಸಾಧನೆಗಳ ಪ್ರಗತಿ ವ್ಯವಸ್ಥೆ, ColorWheel ಯುದ್ಧ ಮೆಕ್ಯಾನಿಕ್ಸ್ ಮತ್ತು ಜಾಗತಿಕ ಲೀಡರ್‌ಬೋರ್ಡ್‌ಗಳನ್ನು ನೀವೇ ನೇರವಾಗಿ ಅನುಭವಿಸಲು ಬಯಸಿದರೆ—ಅಥವಾ ನಮ್ಮ ಇತರ ಆಟಗಳನ್ನು ನೋಡಲು ಬಯಸಿದರೆ—ಕೆಳಗಿನ ಸ್ಟೋರ್‌ಗಳಲ್ಲಿ ನೀವು ಅವುಗಳನ್ನು ಕಾಣಬಹುದು:

🎮 ನಮ್ಮ ಗೇಮ್‌ಗಳು:

  • 🛡️ Blocked: Pixel Panzer:
    ColorWheel ಎಲಿಮೆಂಟಲ್ ಮದ್ದುಗುಂಡುಗಳು, ಡೈನಾಮಿಕ್ ಹವಾಮಾನ, ಬಾಸ್ ಕದನಗಳು, ಜಾಗತಿಕ ಲೀಡರ್‌ಬೋರ್ಡ್‌ಗಳು ಮತ್ತು 79 Google Play ಸಾಧನೆಗಳನ್ನು ಒಳಗೊಂಡಿರುವ ರೆಟ್ರೋ ಪಿಕ್ಸೆಲ್ ಟ್ಯಾಂಕ್ ಆಕ್ಷನ್ ಗೇಮ್!
    👉 Google Play ನಲ್ಲಿ ಡೌನ್‌ಲೋಡ್ ಮಾಡಿ (Android ಮತ್ತು PC) | Microsoft Store (Windows PC)
  • 🎨 Paint Trek:
    ತ್ವರಿತ ಪ್ರತಿವರ್ತನ ಮತ್ತು ಯುದ್ಧತಂತ್ರದ ಚಲನೆಯನ್ನು ಸಂಯೋಜಿಸುವ ವೇಗದ, ವರ್ಣರಂಜಿತ ಬಾಹ್ಯಾಕಾಶ ಆರ್ಕೇಡ್ ಶೂಟರ್.
    👉 Google Play | Microsoft Store (PC & Xbox)
  • 🚀 Space Dodger:
    ಆಳವಾದ ಬಾಹ್ಯಾಕಾಶದಲ್ಲಿ ಅತಿವೇಗದ ರೆಟ್ರೋ ಆರ್ಕೇಡ್ ಅಡೆತಡೆ-ತಪ್ಪಿಸುವ ಆಟ.
    👉 Google Play ನಲ್ಲಿ ಡೌನ್‌ಲೋಡ್ ಮಾಡಿ

📢 ನಮ್ಮ Devlog ಗಳು ಮತ್ತು ಸಮುದಾಯವನ್ನು ಫಾಲೋ ಮಾಡಿ:

ಹೆಚ್ಚಿನ ತಾಂತ್ರಿಕ ಲೇಖನಗಳು, ಅಭಿವೃದ್ಧಿಯ ಹಿನ್ನೆಲೆಯ ದೃಶ್ಯಗಳು ಮತ್ತು ಗೇಮ್ ಅಪ್‌ಡೇಟ್‌ಗಳಿಗಾಗಿ ನಮ್ಮನ್ನು ಫಾಲೋ ಮಾಡಿ:


ಟ್ಯಾಗ್‌ಗಳು ಮತ್ತು ವಿಷಯಗಳು

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