Перейти к основному содержимому

Облачные сохранения

Рассмотрим как добавить облачные сохранения в свою игру через GamePush.

Концепция

Вы можете в любой момент сохранить данные игрока в облако GamePush. Сохранение работает даже для не авторизованных игроков.

Как работают облачные сохранения:

  • При открытии игры SDK запрашивает с сервера актуальные данные игрока:
    • По авторизационным данным площадки - если игрок авторизован на площадке;
    • Или по секретному коду, если игрок - гость;
    • Если профиля нет на сервере - он будет создан.
      • Прогресс будет автоматически связан с профилем площадки.
      • Пустой прогресс будет создан на основе умолчательных значений полей в панели управления.
  • Из SDK, после загрузки, доступны актуальные данные игрока, полученные из облака (локальные, если используются локальные сохранения);
  • Данные игрока можно изменять через метод gp.player.set;
    • Можно изменять / сохранять данные только тех полей, которые явно заданы в панели управления;
  • Любое изменение данных игрока нужно подтвердить, запустив синхронизацию (gp.player.sync);
  • Во время синхронизации / первичной загрузки на сервере выполняются следующие действия:
    • Сравнение профилей игроков на сервере и из клиента;
      • Сравнение может привести к конфликту, когда игрок был гостем, а теперь авторизовался и в аккаунте уже есть прогресс. В этом случае мы предлагаем игроку выбрать, какие данные оставить в аккаунте, либо профили разделяются, зависит от идеологии площадки.
    • Обновление статистики времени, проведенного в игре;
    • Начисление энергии;
    • Проверка ссылки аватара, можно сохранять только разрешенные ссылки на аватары, если эта опция включена в панели управления;
      • Запрещенные ссылки будут заменены на пустой аватар.
    • Сохранение данных в базу данных;
    • Обновление рекордов глобальных лидербордов;
    • Проверка / активация триггеров;
    • Проверка / распределение A/B экспериментов;
    • Проверка / актуализация сегментов;
    • Проверка / актуализация списков мероприятий;
    • Проверка / актуализация ежедневных наград;
    • Выдача наград / достижений / покупок;
    • Получение списка неизрасходованных покупок;
    • Каждый раз при первом запросе:
      • Отправка "Уведомления о заходе" всем открытым вкладкам с игрой на этом профиле игрока. Так вы можете отследить, что игрок открыл вторую вкладку с игрой или открыл игру на другом устройстве.
  • По завершении синхронизации данные становятся актуальными как на сервере, так и в SDK.
  • В среднем синхронизация занимает 7 мс.
    • Зависит от объема сохраняемых данных.
    • Допустимый объем данных всего профиля - не более 1 МБ.
    • Рекомендуемый объем данных всего профиля - не более 10 КБ (gzip).

Введение

Для сохранения в облако вам понадобится:

  1. Создать в панели управления поля игрока для сохранения.
    • Подробнее про работу полей игрока вы можете почитать здесь.
  2. Изменить в SDK значение нужных полей игрока.
    • Подробнее работу с данными игрока вы можете почитать здесь.
  3. Подтвердить изменения, вызвав метод синхронизации.
    • Подробнее работу с синхронизацией игрока вы можете почитать здесь.

Для примера создадим несколько полей:

  • Уровень. Будем сохранять последний пройденный уровень в игре.
  • Персонаж. Будем сохранять последнего выбранного персонажа в игре.
  • Выключен звук. Будем сохранять значение включен / выключен звук в игре.
  • Прогресс. Будем сохранять JSON данные прогресса игры.

Сохранить числовое поле

На примере поля "Уровень".

  • Перейдите в раздел Игроки вашего проекта в панели управления.
  • В разделе "Поля игрока" нажмите "Добавить поле".
  • Заполните как показано на картинке:

Вы добавили поле "Уровень", доступное в SDK по ключу level.

Код для использования поля:

// Получить значение поля
const level = gp.player.get('level');
// Обновить значение поля
gp.player.set('level', level + 1);
// Подтвердить изменения - сохранить в облако
gp.player.sync();

Сохранить строковое поле

На примере поля "Персонаж".

  • Перейдите в раздел Игроки вашего проекта в панели управления.
  • В разделе "Поля игрока" нажмите "Добавить поле".
  • Заполните как показано на картинке:

  • Перечисляемые значения не обязательны. Они нужны, чтобы ограничить допустимые значения и показать игроку перевод этого значения на его языке.

Вы добавили поле "Персонаж", доступное в SDK по ключу character.

Код для использования поля:

// Получить значение поля
const character = gp.player.get('character');
// Обновить значение поля
gp.player.set('character', 'cat');
// Подтвердить изменения - сохранить в облако
gp.player.sync();

Сохранить булевое поле

На примере поля "Выключен звук".

  • Перейдите в раздел Игроки вашего проекта в панели управления.
  • В разделе "Поля игрока" нажмите "Добавить поле".
  • Заполните как показано на картинке:

Вы добавили поле "Выключен звук", доступное в SDK по ключу sound-off.

Код для использования поля:

// Получить значение поля
const isSoundOff = gp.player.get('sound-off');
// Обновить значение поля
gp.player.set('sound-off', true);

// Инвертировать значение поля
gp.player.toggle('sound-off');
// То же самое, что и
gp.player.set('sound-off', !isSoundOff);

// Подтвердить изменения - сохранить в облако
gp.player.sync();

Сохранить JSON поле

На примере поля "Прогресс".

  • Перейдите в раздел Игроки вашего проекта в панели управления.
  • В разделе "Поля игрока" нажмите "Добавить поле".
  • Заполните как показано на картинке:

Вы добавили поле "Прогресс", доступное в SDK по ключу progress.

Код для использования поля:

// Получить значение поля
let progress;
try {
// парсим прогресс из json строки
progress = JSON.parse(gp.player.get('progress'));
} catch (err) {
// не удалось распарсить прогресс (отсутствует, битый)
// создаеем значение по-умолчанию
progress = {
level: 1,
hp: 100,
maxHp: 100,
};
}

// Обновить значение поля
progress.level = 2;
progress.hp = 120;
progress.maxHp = 120;
gp.player.set('progress', JSON.stringify(progress));

// Подтвердить изменения - сохранить в облако
gp.player.sync();

Сохранение данных в облако

+0-1 Request

После изменений в игроке их можно отправить на сервер и сохранить локально на устройстве. Рекомендуется сохранять данные игрока после завершения уровня и получения наград, а также сразу после важного действия, например покупки предмета.

tip

Избегайте сохранения при открытии меню игры / главного экрана. Лучше сохраняйте данные после завершения действия.

Алгоритм действий:

  1. Обновить данные игрока в SDK;
  2. Подтвердить изменения, вызвав метод синхронизации.
// Обновить значение числового поля
gp.player.set('level', 2);
// Обновить значение строквого поля
gp.player.set('character', 'cat');
// Обновить значение булевого поля
gp.player.set('sound-off', true);
// Обновить значение JSON поля
gp.player.set(
'progress',
JSON.stringify({
level: 2,
hp: 120,
maxHp: 120,
})
);

// Синхронизовать, возвращает промис ожидания, дождитесь завершения
await gp.player.sync();
// Данные сохранены

Загрузка данных из облака

+0-1 Request
tip

Данные загружаются автоматчески при запуске игры. Ничего делать не нужно. Как только SDK инициализировался - можно пользоваться всеми данными.

// Получить значение числового поля
const level = gp.player.get('level');
// Получить значение строкового поля
const character = gp.player.get('character');
// Получить значение булевого поля
const isSoundOff = gp.player.get('sound-off');

Что дальше

Оставайтесь на связи

С другими разделами документации вы можете ознакомиться здесь. Для начала работы вы можете ознакомиться с нашими туториалами.

Сообщество GamePush в Telegram: @gs_community.

Для ваших обращений e-mail: [email protected]

Желаем вам успехов!