Гравець пройшов 40 рівнів на iPhone, переставив гру на iPad — прогрес обнулився. За даними кількох мобільних студій, втрата прогресу при перевстановленні входить у топ-3 причин негативних відгуків і відмови від гри (близько 28% користувачів ідуть після такої ситуації). iCloud або Google Play Games Services вирішують проблему — але їх коректна інтеграція потребує більшого, ніж виклик одного методу. Ми пропонуємо професійну інтеграцію хмарних збережень і досягнень з гарантією збереження даних та опрацьованою архітектурою, яка не підведе на тисячах пристроїв.
Складності, які не видно до продакшену
Конфлікти при merge збережень
Користувач грав офлайн на двох пристроях. Коли обидва підключилися — у вас два несумісних снапшоти прогресу. Apple Game Center і Google Play Games не вирішують за вас конфлікти: вони віддають обидва снапшоти і чекають, поки клієнт вибере переможця. За статистикою, близько 30% користувачів стикаються з такими конфліктами при активному використанні кількох пристроїв. Без реалізованого conflict resolution зі зрозумілим UI («Ваш прогрес на цьому пристрої: 43 рівні / У хмарі: 38 рівнів — що залишити?») користувач отримає втрату даних — і це одна з головних причин негативних відгуків.
Розмір і частота записів
Google Play Saved Games обмежує снапшот розміром 3 МБ, а загальний об'єм збережень на акаунт — 10 МБ (за замовчуванням). Якщо збереження включає дані інвентаря з кількома тисячами записів — потрібно серіалізувати тільки дельту або оптимізувати формат. Часті автозбереження (після кожної дії) створюють чергу записів, яка при поганому з'єднанні накопичується і викликає GooglePlayGames.SavedGame.ISavedGameClient timeout. На практиці це призводить до переривчастої синхронізації та роздратування гравців.
Apple iCloud Keychain vs CloudKit
Для простих ігор достатньо NSUbiquitousKeyValueStore — синхронізує до 1 МБ пар ключ-значення. Для складного прогресу потрібен CloudKit з CKContainer і CKRecord. Unity не має нативного CloudKit binding — інтеграція вимагає написання Objective-C/Swift плагіна або використання стороннього рішення типу CloudSave від Unity Gaming Services. Ми вже реалізували такі плагіни для проектів з аудиторією понад мільйон користувачів — можемо поділитися досвідом.
Як правильно обробити конфлікти збережень?
Алгоритм: при завантаженні порівнюємо updatedAt локального та хмарного снапшоту. Якщо вони різняться, зберігаємо обидва варіанти локально і показуємо екран вибору. Після вибору записуємо переможця в хмару. Для автоматичного вирішення можна використовувати last-write-wins, але це ризиковано при офлайн-сесіях — втрачається прогрес, поки гравець не в мережі. Найкращий підхід — manual resolution з UI, який дає гравцеві контроль. За нашими даними, це знижує кількість скарг на втрату даних у 4 рази.
Чому важливо враховувати обмеження за розміром збережень?
Перевищення лімітів призводить до помилок CloudSaveValidationException і блокування запису. Рекомендується серіалізувати тільки змінювані поля і стискати дані. У Unity Cloud Save максимальний розмір документа — 1 МБ, а для великих об'ємів потрібно розбивати на кілька документів. Ми використовуємо бінарну серіалізацію з protobuf для економії місця — це зменшує розмір снапшоту на 40-60% порівняно з JSON.
Unity Gaming Services Cloud Save
Для кроссплатформених проектів (iOS + Android + PC) оптимальний шлях — Unity Cloud Save з пакета com.unity.services.cloudsave. Зберігає JSON-документи до 1 МБ, працює через Unity Authentication (анонімні акаунти або federated identity), підтримує server-side validation через Cloud Code.
Ключовий момент: CloudSaveService.Instance.Data.Player.SaveAsync() — асинхронний, кидає CloudSaveValidationException при перевищенні квот і CloudSaveException при мережевих помилках. Обробка цих винятків у продакшені обов'язкова — без неї втрата з'єднання в момент збереження ламає локальний кеш без діагностики.
Архітектура: локальне збереження (PlayerPrefs або кастомний JSON-файл у Application.persistentDataPath) + хмарне як дзеркало з version tag. При завантаженні — порівнюємо updatedAt з метаданих хмарного снапшоту з локальним timestamp. Якщо розбіжність — ініціюємо conflict resolution flow.
Порівняння хмарних платформ
| Платформа | Макс. розмір | Вирішення конфліктів | Платформи |
|---|---|---|---|
| iCloud (KVStore) | 1 МБ | Last-write-wins | iOS, macOS |
| Google Play Games | 3 МБ на снапшот | Manual (два снапшоти) | Android, iOS |
| Unity Cloud Save | 1 МБ на документ | Manual (через код) | iOS, Android, PC, Web |
Типові помилки при інтеграції
- Ігнорування обробки винятків CloudSaveException.
- Відсутність fallback на локальне збереження при недоступності хмари.
- Використання last-write-wins без UI для конфліктів.
- Перевищення лімітів розміру снапшоту без стиснення.
- Неврахування асинхронності операцій збереження.
Досягнення
Google Play Games Achievements і Apple Game Center Achievements — різні API, різні обмеження, різна логіка unlock. Правильна абстракція: IAchievementService з методами Unlock(achievementId), Increment(achievementId, steps), Report(achievementId, percent) — платформо-специфічна реалізація прихована за інтерфейсом.
Важлива деталь: incremental achievements у Google Play вимагають попереднього налаштування totalSteps у Play Console. Якщо кроки змінилися (наприклад, досягнення «вбий 100 ворогів» переробили на «вбий 50») — не можна змінити total steps без скидання всього прогресу у існуючих користувачів. Це архітектурне рішення, яке потрібно приймати до релізу. Ми допомагаємо спроектувати achievements так, щоб уникнути таких проблем.
Для Game Center на iOS — обробка GKLocalPlayer.localPlayer.authenticateHandler з розгалуженням логіки під випадки: аутентифікація успішна, користувач відмовився, Game Center недоступний. Останній сценарій часто ігнорують — а він трапляється у користувачів з обмеженими Family Sharing налаштуваннями. У нашій реалізації ми завжди передбачаємо fallback на локальне збереження при недоступності хмарної синхронізації.
Що входить в інтеграцію
- Аудит поточної архітектури збережень і досягнень.
- Вибір оптимального провайдера (iCloud, Google Play, Unity Cloud Save).
- Реалізація conflict resolution UI та обробки винятків.
- Тестування на реальних пристроях з імітацією помилок мережі.
- Документація з підтримки та розширення інтеграції.
Терміни
| Платформа/сценарій | Термін |
|---|---|
| Google Play Games (досягнення + збереження), одна платформа | 4–7 днів |
| Apple Game Center (досягнення + iCloud KVStore) | 4–7 днів |
| Unity Cloud Save (кроссплатформа) + conflict resolution UI | 1.5–2 тижні |
| Повна інтеграція iOS + Android + PC з кастомним бекендом | 3–5 тижнів |
Вартість розраховується індивідуально після аудиту ігрової архітектури та вимог до синхронізації прогресу. Зв'яжіться з нами для консультації та попередньої оцінки — обговоримо ваш проект і підберемо оптимальне рішення. Отримайте гарантію якісної інтеграції з нашою експертизою.






