Розробка системи досягнень мобільної гри
Система досягнень — не просто список «убий 100 ворогів». Правильно спроектована, вона управляє retention: гравець повертається, тому що хоче закрити ачивку, яка вимагає 7 днів підряд входити в гру або убити конкретного босса. Досягнення також дають довгострокові цілі користувачам, які пройшли основний контент.
Архітектура: локальна vs серверна
Для більшості мобільних ігор архітектура виглядає так:
- Прогрес досягнень — клієнт + серверна синхронізація (Google Play Games / Game Center / PlayFab)
- Видання наград — тільки сервер (або Platform SDK з верифікацією)
- Відображення — клієнт
Зберігати прогрес тільки локально рискованно: переустановка = втрата ачивок = негативний досвід. PlayFab Player Data або Google Play Games Snapshots розв'язують це.
Модель даних
[Serializable]
public class Achievement
{
public string id;
public string titleKey; // локалізація
public string descriptionKey;
public AchievementType type; // Counter, OneTime, Streak
public int targetValue;
public List<Reward> rewards;
public bool isSecret; // приховані до виконання
public string[] requiredAchievements; // ланцюжки залежностей
}
public enum AchievementType
{
OneTime, // виконано або ні
Counter, // прогрес 0..targetValue
Streak, // N днів підряд
Cumulative // накопительно за все час
}
[Serializable]
public class AchievementProgress
{
public string achievementId;
public int currentValue;
public bool isUnlocked;
public DateTime? unlockedAt;
public bool rewardClaimed;
}
AchievementsManager
public class AchievementsManager : MonoBehaviour
{
public static AchievementsManager Instance { get; private set; }
private Dictionary<string, AchievementProgress> _progress;
private AchievementDatabase _database;
// Викликається з ігрової логіки
public void TrackEvent(string eventType, int value = 1, Dictionary<string, object> context = null)
{
foreach (var achievement in _database.GetAchievementsByEvent(eventType))
{
var progress = GetOrCreate(achievement.id);
if (progress.isUnlocked) continue;
switch (achievement.type)
{
case AchievementType.Counter:
case AchievementType.Cumulative:
progress.currentValue += value;
break;
case AchievementType.OneTime:
progress.currentValue = 1;
break;
}
if (progress.currentValue >= achievement.targetValue)
Unlock(achievement, progress);
}
SaveProgress();
}
private void Unlock(Achievement achievement, AchievementProgress progress)
{
progress.isUnlocked = true;
progress.unlockedAt = DateTime.UtcNow;
// Сповіщення гравця
AchievementPopupUI.Instance.Show(achievement);
// Аналітика
GameAnalytics.NewDesignEvent($"Achievement:Unlocked:{achievement.id}");
// Синхронізація з платформою
SyncWithPlatform(achievement);
}
}
TrackEvent — єдина точка входу з геймплею. Додавання нового досягнення потребує тільки нового запису в AchievementDatabase — без змін у боєвій логіці, системі квестів чи магазині.
Streak-досягнення
Серія входів підряд — один з кращих retention-інструментів. Вимагає акуратної обробки дат:
public void RecordDailyLogin()
{
var lastLogin = PlayerPrefs.GetString("last_login_date", "");
var today = DateTime.UtcNow.Date.ToString("yyyy-MM-dd");
var yesterday = DateTime.UtcNow.Date.AddDays(-1).ToString("yyyy-MM-dd");
if (lastLogin == today) return; // уже засчитано сьогодні
int streak = PlayerPrefs.GetInt("login_streak", 0);
streak = (lastLogin == yesterday) ? streak + 1 : 1; // скидання якщо пропустив день
PlayerPrefs.SetString("last_login_date", today);
PlayerPrefs.SetInt("login_streak", streak);
TrackEvent("daily_login_streak", streak);
}
Важливо використовувати UTC, а не локальний час — інакше гравець у UTC+12 може отримати подвійний бонус при зміні дня.
Інтеграція з платформеними досягненнями
Google Play Games та Game Center мають власні ачивки, які видні в платформеному інтерфейсі:
// Google Play Games (Play Games Services v2)
PlayGamesPlatform.Instance.UnlockAchievement("CgkI6ISmlocOEAIQAQ");
// Game Center (iOS)
GKAchievement achievement = new GKAchievement("first_boss_killed");
achievement.percentComplete = 100;
GKAchievement.Report(new[] { achievement }, (error) => { });
Синхронізуємо тільки ті досягнення, які мають сенс на платформі. Не потрібно дублювати всі 100 внутрішньоігрових ачивок у Game Center — тільки ключові milestone.
Що входить у роботу
- Проектування схеми досягнень та системи подій
- Реалізація
AchievementsManagerз типами Counter/OneTime/Streak - Синхронізація прогресу з PlayFab / Google Play Games / Game Center
- UI: список досягнень, прогрес-бари, popup при розблокуванні
- Система наград: валюта, предмети, косметика
- Аналітика розблокувань для балансировки складності
- Локалізація заголовків та описів
Терміни
Базова система без платформеної інтеграції: 4–6 днів. Повна система з синхронізацією, UI й нагородами: 1,5–2,5 тижні. Вартість розраховується індивідуально.







