Інтеграція хмарних збережень та досягнень: реалізація без втрат

Гравець пройшов 40 рівнів на iPhone, переставив гру на iPad — прогрес обнулився. За даними кількох мобільних студій, втрата прогресу при перевстановленні входить у топ-3 причин негативних відгуків і відмови від гри (близько 28% користувачів ідуть після такої ситуації). iCloud або Google Play Games S

Наші компетенції

Інші послуги студії

VR/AR/MR застосунки на замовлення

Вражайте клієнтів і навчайте команду у віртуальній реальності

Розробка ігор на Unity

Від ідеї до релізу — ігри, які запам'ятовуються

3D-моделювання та анімація

Оживимо ваш продукт в об'ємній графіці та анімації

VR-тренажери промислового обладнання

Тренуємо операторів на техніці без ризику і простою

AR-інструкції для виробництва

Покрокові підказки прямо на обладнанні — без паперу

Safety-тренажери

Відпрацювання НС і техніки безпеки без виходу на об'єкт

VR/AR-тренінги

Навчаємо персонал сервісу, адаптації та soft skills у VR

Навчальні вікторини

Перевірка знань у форматі гри — легко і без стресу

Корпоративні відеоінструкції

Зрозумілі ролики для навчання співробітників і клієнтів

Гейміфікація бізнес-процесів

Мотивуємо команду через ігрові механіки в KPI та HR

Застосунки для інфокіосків

Інтерактивні екрани для магазинів, стендів і офісів

VR/AR-інсталяції

Wow-ефект для брендів на виставках, івентах і в шоу-румах

Віртуальні виставки та музеї

Ваша експозиція доступна з будь-якої точки світу — 24/7

Event-квести та брендовані ігри

Незабутні ігри для конференцій та клієнтських івентів

Часті запитання

Останні роботи

  • image_games_mortal_motors_495_0.webp
    Розробка гри для компанії Mortal Motors
    1515
  • image_games_a_turnbased_strategy_game_set_in_a_fantasy_setting_with_fire_and_sword_603_0.webp
    Покрокова стратегія у фентезі сеттингу With Fire And Sword
    1017
  • image_games_second_team_604_0.webp
    Розробка ігри для компанії Second term
    649
  • image_games_phoenix_ii_606_0.webp
    3D-анімація – тизер для гри phoenix 2.
    729
  • image_training-quizzes_kids_shopping_quiz_614_0.webp
    Навчальна вікторина для дітей «Покупки в магазині»
    117

Гравець пройшов 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 на локальне збереження при недоступності хмарної синхронізації.

Що входить в інтеграцію

  1. Аудит поточної архітектури збережень і досягнень.
  2. Вибір оптимального провайдера (iCloud, Google Play, Unity Cloud Save).
  3. Реалізація conflict resolution UI та обробки винятків.
  4. Тестування на реальних пристроях з імітацією помилок мережі.
  5. Документація з підтримки та розширення інтеграції.

Терміни

Платформа/сценарій Термін
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 тижнів

Вартість розраховується індивідуально після аудиту ігрової архітектури та вимог до синхронізації прогресу. Зв'яжіться з нами для консультації та попередньої оцінки — обговоримо ваш проект і підберемо оптимальне рішення. Отримайте гарантію якісної інтеграції з нашою експертизою.