icon

Storage

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

  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

Когда активированы и локальные и облачные сохранения — данные будут сохраняться в локальное хранилище и в облако платформы. При загрузке сохранений — будут загружены актуальные сохранения. Если при последнем сохранении в облако по каким-либо причинам данные не были сохранены, то плагин загрузит локальные сохранения. Когда все сохранения актуальные — будут загружены облачные.

Если параметр Flush отключён и в игре нет слишком частого сохранения прогресса, то можно отключить Save Local, потому что с ними иногда может произойти рассинхрон сохранений на разных устройствах.

Интеграция

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

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мб больше.
При наличии модуля Storage в проекте — в настройках 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.