⚙️ YandexGamesSdk - Главный класс работы с SDK.
☁️ Cloud - Сохранение данных в облако Yandex.
📢 Advertisement - Работа с различной рекламой в игре.
💲 Billing - Внутриигровые покупки за валюту YAN.
⛄ Account - Аккаунт игрока на yandex games.
🌐 WebApplication - Состояние игры в браузере.
🫧 Shortcut - Иконки на рабочий стол.
📽️ AdBlock - Отслеживание включенного AdBlock.
🖥️ Device - Отслеживание устройства.
- PackageManager > + > Add package from git URL..
https://github.com/Kitgun1/KimicuYandexGames.git
- PackageManager > + > Add package by name...
com.unity.nuget.newtonsoft-json
using Kimicu.YandexGames; // Общие модули
using Kimicu.YandexGames.Utils; // Утилиты
using Kimicu.YandexGames.Extension; // Расширения
По всем вопросам писать в тг - KimcuK
IEnumerator YandexGamesSdk.Initialize(onSuccessCallback);
Отображает момент, когда игра загрузила все ресурсы и готова к взаимодействию с пользователем:
void YandexGamesSdk.GameReady();
Вызывать GameReady нужно при запуске игры, но не в самом запуске, а когда будет загружен уровень и игрок сможет уже что-то сделать
IEnumerator Cloud.Initialize(onSuccessCallback);
Cloud.SetValue(string key, object value, bool saveToCloud, Action onSuccessCallback, Action<string> onErrorCallback);
key - ключ сохранения
value - значение для сохранения
saveToCloud - загрузить ли все локальные сохранения в облако
onSuccessCallback - при удачном сохранении
onErrorCallback - при возникновении ошибки и при "saveToCloud = true"
Cloud.SetValue("money", 15f);
Cloud.SetValue("date", ("September", "12", "2024"));
Cloud.SetValue("data", new Data(), false, () => Debug.Log("Удачно сохранили"));
public class Data
{
public int level = 15;
public List<string> buyedSkins = new() { "base", "pro", "VIP" };
}
Можно сохранять абсолютно любой объект.
Пример: list, dictionary, int, string, class, struct и любые другие
<T> Cloud.GetValue(string key, T defaultValue = default);
key - ключ сохранения
value - значение по умолчанию
public class Data
{
public int level = 15;
public List<string> buyedSkins = new() { "base", "pro", "VIP" };
// Любые другие поля
}
float money = Cloud.GetValue("money", 15f);
(string, string, string) date = Cloud.GetValue<(string, string, string)>("date");
Data data = Cloud.GetValue("data", new Data());
Используйте этот метод, если хотите отправить локальные изменения на облако
Cloud.SaveInCloud(Action onSuccessCallback, Action<string> onErrorCallback);
onSuccessCallback - удачно сохранено
onErrorCallback - ошибка (например слишком часто вызывается)
Используйте этот метод, если хотите очистить все изменения на облаке
Cloud.ClearCloudData(Action onSuccessCallback, Action<string> onErrorCallback);
onSuccessCallback - удачно удалили все данные
onErrorCallback - ошибка (например слишком часто вызывается SatValue или ClearCloudData)
Старайтесь не вызывать SetValue() с saveInCloud = true слишком часто за раз. Например:
// НЕ ДЕЛАЙТЕ ТАК:
Cloud.SetValue("key1", 15, true);
Cloud.SetValue("key2", 23, true);
Cloud.SetValue("key3", 32, true);
Cloud.SetValue("key4", 43, true);
Cloud.SetValue("key5", 12, true);
// ДЕЛАЙТЕ ТАК:
Cloud.SetValue("key1", 15); // По умолчанию false
Cloud.SetValue("key2", 23); // По умолчанию false
Cloud.SetValue("key3", 32); // По умолчанию false
Cloud.SetValue("key4", 43); // По умолчанию false
Cloud.SetValue("key5", 12); // По умолчанию false
Cloud.SaveInCloud();
// А ЕЩЕ ЛУЧШЕ ТАК:
Cloud.SetValue("key5", _playerData, true);
_playerData = Cloud.GetValue("key5", new PlayerData());
public class PlayerData
{
public int Money = 0;
public List<bool> LevelsAvailable = new();
public Dictionary<string, bool> Skins = new();
}
Advertisement.Initialize(onSuccessCallback);
Advertisement.ShowInterstitialAd(Action onOpenCallback = null, Action onCloseCallback = null, Action<string> onErrorCallback = null, Action onOfflineCallback = null);
onOpenCallback - в момент открытия межстраничной рекламы
onCloseCallback - в момент нажатия на крестик межстраничной рекламы
onErrorCallback - при возникновении ошибки в межстраничной рекламы
onOfflineCallback - вызывается при потере сетевого соединения (переходе в офлайн-режим)
Advertisement.ShowInterstitialAd();
Рекламу можно вызывать каждую секунду, но покажут ее только через каждые 70 сек.
Advertisement.ShowVideoAd(Action onOpenCallback = null, Action onRewardedCallback = null, Action onCloseCallback = null, Action<string> onErrorCallback = null);
onOpenCallback - вызывается при отображении видеорекламы на экране
onRewardedCallback - вызывается, когда засчитывается просмотр видеорекламы. Укажите в данной функции, какую награду пользователь получит после просмотра.
onCloseCallback - вызывается при закрытии видеорекламы
onErrorCallback - вызывается при возникновении ошибки
Advertisement.ShowVideoAd(onRewardedCallback: GetReward);
private void GetReward(); // TODO: выдаем любую нужную награду
Advertisement.StickySetActive(bool value);
value - выкл/вкл cтики-баннеры
Иногда реклама не сразу появляется после ее вызова, поэтому постарайтесь у кнопок, которые вызывают рекламу, выключать возможность кликать на нее и врубать после закрытия onCloseCallback или onErrorCallback
IEnumerator Billing.Initialize(onSuccessCallback);
получение списка купленных товаров
данные о покупке и подпись для проверки подлинности игрока.
Billing.GetPurchasedProducts(Action<PurchasedProduct[]> onSuccessCallback = null, Action<string> onErrorCallback = null);
PurchasedProduct - хранит в себе данные о купленных товарах
onSuccessCallback - вызывается при успешной покупки
onErrorCallback - вызывается при ошибки
Billing.GetPurchasedProducts(ProcessingPurchasedProducts);
// TODO: что-то делаем с покупками, которые мы еще не обработали
private void ProcessingPurchasedProducts(PurchasedProduct[] products);
Billing.PurchaseProduct(string productId, Action<PurchaseProductResponse> onSuccessCallback = null, Action<string> onErrorCallback = null, string developerPayload = "");
PurchaseProductResponse - данные о купленном продукте
productId - id товара на странице игры в категории покупки
onSuccessCallback - вызывается при успешной покупки с информацией продукте
onErrorCallback - вызывается при отмене оплаты или другой любой ошибки
developerPayload - дополнительные данные о покупке
Billing.PurchaseProduct("skin_boss", ProcessingProduct);
// TODO: выдаем награду и консумируем товар
private void ProcessingProduct(PurchaseProductResponse product);
Billing.ConsumeProduct(string purchasedProductToken, Action onSuccessCallback = null, Action<string> onErrorCallback = null);
purchasedProductToken - tokenтовара. Его можно найти в PurchasedProduct, который можно взять при вызове метода PurchaseProduct или GetPurchasedProducts
onSuccessCallback - вызывается при успешном консумировании продукта
onErrorCallback - вызывается при ошибке
Billing.PurchaseProduct("skin_boss", ProcessingProduct);
// TODO: выдаем награду и консумируем товар
private void ProcessingProduct(PurchaseProductResponse product);
При добавлении внутриигровых покупок в игру требуется реализовывать метод консумирования:
Консумирование - это подтверждения о том что покупка была выдана игроку.
Для добавления этого метода в вашу игру следует сделать:
- После вызова метода Billing.PurchaseProduct(); Следует в callback onSuccessCallback добавить, после выдачи награды игроку, метод Billing.ConsumeProduct();
- При запуске игры в boot сцене требуется после инициализации Billing вызвать метод Billing.GetPurchasedProducts(onSuccessCallback);. После чего в onSuccessCallback нужно пройтись по списку и выдать награду в зависимости от productId. Пример:
Billing.GetPurchasedProducts(purchaseProducts => {
int countProducts = purchaseProducts.Length;
for (int i = 0; i < countProducts; i++) {
var product = purchaseProducts[i];
if(product == "noAds") {
// Вырубаем рекламу в игре
}
else if (product == "money5000") {
// Выдаем игроку 5000 монет
}
Billing.ConsumeProduct(product.purchaseToken);
}
});
Используйте это перед вызовом методов SDK, требующих авторизации.
Account.IsAuthorized
Разрешение на использование имени и изображения профиля из аккаунта Яндекс.
Account.HasPersonalProfileDataPermission
Подписаться
Account.OnAuthorizedInBackgroundAdd(Action onAuthorizedInBackground);
Отписаться
Account.OnAuthorizedInBackgroundRemove(Action onAuthorizedInBackground);
Account.RequestPersonalProfileDataPermission(Action onSuccessCallback = null, Action<string> onErrorCallback = null);
onSuccessCallback - вызывается при успешном подтверждении разрешения на использование данных личного профиля
onErrorCallback - вызывается при отказе разрешения на использование данных личного профиля
Имейте в виду, что если пользователь отклоняет запрос – это навсегда. Окно запроса больше никогда не откроется.
Требуется авторизация. Используйте Account.IsAuthorize или Account.Authorize()
Account.RequestPersonalProfileDataPermission(ProfileDataPermisionSuccess, ProfileDataPermisionError);
// TODO: что-то делаем с данными игрока
private void ProfileDataPermisionSuccess();
// TODO: не получили доступ к данным игрока
private void ProfileDataPermisionError(string error);
Account.Authorize(Action onSuccessCallback = null, Action<string> onErrorCallback = null);
onSuccessCallback - вызывается при успешной авторизации
onErrorCallback - вызывается при ошибке авторизации
Account.Authorize(SuccessAuthorize, ErrorAuthorize);
// TODO: после авторизации игрока что-то делаем
private void SuccessAuthorize();
// TODO: Ошибка авторизации:
private void ErrorAuthorize(string error);
IEnumerator WebApplication.Initialize(onStopGame);
WebApplication.Initialize((isStopGame) =>
{
AudioListener.pause = isStopGame;
AudioListener.volume = isStopGame ? 0 : 1;
Time.timeScale = isStopGame ? 0 : 1;
});
Находится ли игрок вне вкладки
bool inBackground = WebApplication.InBackground;
Находится ли игрок в рекламе
bool inAdvert = WebApplication.InAdvert;
Находится ли игрок в меню покупки продукта
bool inPurchaseWindow = WebApplication.InPurchaseWindow;
Ваше кастомное значение, которое вы можете изменять в вашей игре
bool customValue = WebApplication.CustomValue;
WebApplication.CustomValue = true;
Изменено значение InBackground
Action<bool> InBackgroundChangeState;
InBackgroundChangeState += (inBackground) => Debug.Log($"inBackground: {inBackground}");
Изменено значение InAdvert
Action<bool> InAdvertChangeState;
InAdvertChangeState += (inAdvert) => Debug.Log($"inAdvert: {inAdvert}");
Изменено значение InPurchaseWindow
Action<bool> InPurchaseWindowChangeState;
InPurchaseWindowChangeState += (inPurchaseWindow) => Debug.Log($"inPurchaseWindow: {inPurchaseWindow}");
Изменено значение CustomValue
Action<bool> OnCustomValueChangeState;
OnCustomValueChangeState += (customValue) => Debug.Log($"customValue: {customValue}");
Изменено значение InBackground, InAdvert, InPurchaseWindow, CustomValue
Action<bool> OnStopGame;
OnStopGame += (onStopGame) => Debug.Log($"onStopGame: {onStopGame}");
Shortcut.CanSuggest(Action<bool> onResultCallback);
Shortcut.Suggest(Action<bool> onResultCallback = null);
AdBlock.Enabled; // bool
Device.IsMobile; // bool