icon

Сохранения

В данном разделе будут описаны три с способа для сохранений:

  1. Первый основной модуль Storage необходим для облачного сохранения. Он самый удобный и правильный, но если сохранения в проекте уже реализованы, например с Player Prefs — то придётся их переделывать.
  2. Модуль Redefine Player Prefs — переопределяет стандартный класс Player Prefs на сохранения плагина. Если импортирован модуль Storage, то данные будут сохраняться в класс SavesYG, как сохраняются другие данные с помощью модуля Storage. Таким образом вы можете сохранить свои Player Prefs в облако. Если не переопределить Player Prefs, то в Яндекс Играх и в некоторых других платформах после обновления игры все сохранения сотрутся. Когда модуль Storage не импортирован, данные сохранятся в локальное хранилище браузера. В таком случае данные не сотрутся, но это всё же это не такой надёжный способ, как облако.
  3. Модуль Player Stats — быстрые сохранения в облако. Сохранять данные можно только типа int.

Основной модуль Storage

Рассмотрим настройки модуля Storage:
icon
При использовании облачных сохранений (флаг Save Cloud) для Яндекс Игр необходимо:

  1. Импортировать модуль Authorization.
  2. В консоли игры поставить данную галку:
    icon

Для Яндекс Игр рекомендуется использовать только облачные сохранения (флаг Save Cloud). При облачном сохранении независимо от того, авторизован пользователь или нет, данные будут сохранены! Если пользователь не авторизован, то данные будут сохранены в локальное хранилище Яндекс Игр.

Локальные сохранения плагина (флаг Save Local) используйте для других платформ, которые не имеют облачных сохранений. Можно настроить флаг Save Local для каждой конкретной платформы по-разному (смотрите раздел Платформы).

Рекомендуется отключить опцию Flash, чтобы сохранения ставились в очередь, тогда все данные точно отправятся на сервер. Иначе, при слишком частом сохранении прогресса (есть лимиты) отправка данных будет отклонена.

Опция Save Cloud Interval — устарела.

Интеграция

Создайте скрипт в любой папке проекта и с любым наименованием. Вставьте в него следующий код:

namespace YG
{
    public partial class SavesYG
    {
        // Ваши данные для сохранения
		public int coins = 5; // Пример
    }
}
Таких скриптов можно делать хоть сколько благодаря модификатору partial, чтобы разграничить сохранения разного назначения.
Внутри класса SavesYG будут храниться все ваши поля, которые необходимо сохранить.
Как пример создано поле coins (монеты). Оно будет использоваться в проекте как глобальное поле для монет.
Чтобы получить данные или изменить, делайте это также, как с любыми другими полями в вашем коде. Хранилище сохранений находится в YG2.saves.
Пример
using UnityEngine;
using YG;

public class MyClass : MonoBehaviour
{
    public void MyMethod()
    {
        // Чтение
		Debug.log(YG2.saves.coins);

		// Запись
		YG2.saves.coins += 10;
    }
}
Хранилище сохранений статично. Изменения поля не сбросятся на протяжении всей игровой сессии.
Но данные необходимо сохранять, чтобы они не сбросились после закрытия игры. Для этого используйте метод:
YG2.SaveProgress();
Загружаются сохранения сами — в поле YG2.saves (класс SavesYG) при запуске игры. Не нужно вызывать метод загрузки, но всё же вы можете его использовать в специфических случаях: YGInsides.LoadProgress();
Метод LoadProgress требует подключения пространства имён YG.Insides. В этой библиотеке есть и другие внутренние методы PluginYG2.
Получение данных после выполнения метода LoadProgress идёт асинхронно. Поэтому после того как данные будут получены — вызовется ивент onGetSDKData.

Подытожим:

  1. Необходимо создать класс и прописать в нём свои поля, которые нужно сохранять.
  2. В своих скриптах пользоваться созданными полями, использовать их для чтения и записи.
  3. Сохранять эти поля с помощью метода SaveProgress отправляя их в локальное или облачное хранилище.
  4. При запуске игры, данные сами подтянутся в экземпляр класса YG2.saves.

Подробнее

  1. Данные сохраняются в строку json.
  2. Можно сохранять экземпляр класса — для этого необходимо к классу применить атрибут [System.Serializable].
  3. Можно использовать конструктор. В классе SavesYG может быть любая логика — методы и т.д.
  4. Используйте коллекцию Generic вместо обычного массива. При попытке расширить массив сохранения будут загружаться с ошибкой.

Пример
using System;
using System.Collections.Generic;
using UnityEngine;

namespace YG
{
    public partial class SavesYG
    {
		public List<ItemData> items = new List<ItemData>();

        public ItemData GetItem(string name)
		{
			for (int i = 0; i < items.Count; i++)
			{
				if (items[i].name == name)
					return items[i] ;
			}

			ItemData newItem = new ItemData
			{
				name = name,
				position = Vector3.zero
			};

			return newItem;
		}
    }
}

[Serializable]
public struct ItemData
{
    public string name;
    public Vector3 position;
}
Если требуется сохранять более сложные структуры, например двойной массив.
Есть вариант использования пакета Newtonsoft Json. Он мощнее стандартного класса JsonUtility, но с ним билд игры будет весить на 2 мб больше.
В настройках PluginYG2 есть кнопка для импорта пакета Newtonsoft Json. После импорта пакета, появится кнопка активации Newtonsoft Json для модуля Storage.
Первая игровая сессия и сброс сохранений
Событие onDefaultSaves — вызывается в старте игры при отсутствии сохранений, то есть когда пользователь первый раз зашёл в игру. Или если выполнить метод SetDefaultSaves — сброс сохранений. После сброса сохранений будут вызваны события onDefaultSaves и onGetSDKData. После сброса не произойдёт автоматического сохранения, то есть если игра не была сохранена, то при её перезагрузке сохранения будут отсутствовать. Выполняйте метод SaveProgress после сброса самостоятельно.
Удалить сохранения для Unity Editor
Зайдите в папку PluginYourGames/Editor и удалите файл SavesEditorYG2.json. Он отмечен значком сохранений.

Redefine Player Prefs

(Необходимо импортировать модуль RedefinePlayerPrefs)
Желательно использовать в связке с модулем Storage, чтобы данные сохранялись в облако.
В Unity Editor, Android, Windows и т.д. сохранение будет происходить по средствам стандартного класса Player Prefs.

В скриптах вашего проекта переопределите стандартный класс PlayerPrefs. Вставьте следующую строку в начале скрипта:
using PlayerPrefs = RedefineYG.PlayerPrefs;
Чтобы быстро найти все скрипты в проетке использующие Player Prefs — можно воспользоваться ссответствующим инструментом вашего IDE. Например, в Visual Studio открыть поиск по всем скриптам проекта можно сочетанием клавиш CTRL + SHIFT + F.

Теперь остаётся только выполнять метод SaveProgress или PlayerPrefs.Save в ключевых местах.
Метод PlayerPrefs.Save — дублирует метод SaveProgress. Если он уже присутствует в нужных местах — отлично.
Когда мы используем методы записи данных, например PlayerPrefs.SetString, они меняются в текущей игровой сессии, но не сохраняются в локальное хранилище или облако. Ещё необходимо их сохранять с помощью описанных выше методов. Помните, что слишком часто выполнять методы сохранения не рекомендуется!

Player Stats

(Необходимо импортировать модуль PlayerStats)
Это быстрые сохранения в облако с большим тайм-аутом со стороны платформы Яндекс Игры. Использование PlayerStats схоже с PlayerPrefs, но сохранить данные можно только integer типа.

Для сохранения используйте метод SetState:
YG2.SetState(название сейва, integer значение)

Для получения значения используйте метод GetState:
YG2.GetState(название сейва)

Также можно пользоваться списком сейвов:
YG2.GetAllStats() — вернёт Dictionary<string, int>.

Изменить весь список сейвов можно с помощью метода YG2.SetAllStats(). Таким образом, можно удалить все сейвы.

Загрузку сейвов производит сам PluginYG при запуске игры. Но в специфических ситуациях вы можете воспользоваться методом LoadStats. Получение данных после выполнения метода LoadStats идёт асинхронно. Поэтому после того как данные будут получены — вызовется ивент onGetSDKData.