В последнее время пришлось интегрировать внутриигровые покупки в свою игру и встал вопрос, а какой же плагин для этого использовать под Unity3D? Есть такие вещи как OpenIAB, Prime31, Unibill и Soomla. Более мелкие вещи брать в расчет не будем, ибо некоторые из них либо не обновляются вообще, либо имеют какие-то критические проблемы. Кто хочет знать, почему выбор пал именно на Soomla, и как его интегрировать прошу под кат.
Итак, плагинов, как видно, много и по названию топика видно, какую систему я выбрал в итоге, но почему? Давайте рассмотрим каждую систему отдельно.
OpenIAB
Плюсы:
- Бесплатность
- Открытость
- Большое сообщество
- Простота
- Неплохая документация
- Поддержка iOS и Android (Позднее оказалось, что не так)
Минусы:
- Почти нет информации о работе с iOS
- Обновления весьма редки (Последнее было 4 месяца назад)
Мнение:
Грешу, я и ранее работал с этой системой, но только под Android, когда же я решил попробовать поработать с стороной iOS, то меня ждало разочарование, OpenIAB просто не работал, т.к. его event'ы не давали отклика, и как на инициализацию магазина, потому от этой системы пришлось отказаться, но стоит отдать ей должное, под Android работала она безупречно, но в этом и не приходилось сомневаться, ведь даже исходная версия на c++ написана только под эту ОС.
Unibill
Плюсы:
- Поддержка множества магазинов
- Отличная документация
- Простота и легкость в освоении
Минусы:
- Цена (175$)
- Сообщество, как таковое почти отсутствует
Мнение:
С Unibill все оказалось просто. Сразу были вопросы к цене, 175$ не совсем маленькие деньги, особенно учитывая, что есть более дешевые аналоги, потому сразу нет, но если есть финансы и не хочется тратить много времени, то отличный вариант.
Prime[31]
Плюсы:
- Отличная документация
- Простота и легкость в освоении
- Поддерживает множество магазинов, но с оговоркой.
- Большое сообщество.
- Под каждую платформу цена плагина 70 $.
Мнение:
Плагины от prime[31] славятся своим качество, но цена тоже оставляет желать лучшего, 70$ под каждую платформу отдельно совсем не предел мечтаний, но тут уже проверенная технология с огромным сообществом и отличной документацией и т.к. нужен был плагин всего под 2 платформы цена выходила ниже, чем у Unibill, но все равно был выбран не этот вариант, а нижеследующий.
Soomla
Плюсы:
- Отличная документация
- Простота и легкость в освоении
- Поддерживает основные мобильные платформы.
- Большое сообщество.
- Бесплатность.
Минусы:
- Работа через их личный кабинет
Мнение:
Soomla же показался просто отличным вариантом, т.к. у него есть все плюсы плагинов от prime[31], но при этом эта система полностью бесплатна, хоть и смутило то, что придется еще работать через личный кабинет на их сайте, но на самом деле, делать там почти ничего не нужно, потому выбор остановился на этом варианте.
Интеграция в проект
Первое, что нужно сделать (Внезапно!) скачать собственно плагин, можно с Asset Store, можно с официального сайта, разницы нет. И там и там плагин обновляется почти одновременно.
После импорта в проект плагина, первое наперво нужно выставить настройки в editor'е.
В Soomla Secret вы должны указать Game Key, который вы получите при создании приложения в личном кабинете Soomla. Без этого работать ничего не будет!
Debug Native и Debug Unity это на ваш личный выбор. В Android Settings package name определяется автоматически, а дальше вы должны собственно выбрать, какие магазины на Android вы используете. Думаю, API Key понятно откуда брать. Receipt Validation так же на ваш выбор. Все, основу мы настроили, пора переходить к скриптам.
Нам нужно собственно описать в отдельном классе наши товары, для того, чтобы мы могли покупать их, к примеру так:
Инициализация покупок
using Soomla.Store;//Подключаем Soomla
using Soomla;//Подключаем Soomla
public class dataIAP : IStoreAssets { //Наследуемся от интерфейса IStoreAssets
public int GetVersion() { //Инициализируем функцию GetVersion, что она возвращает важно, если вы будете смотреть информацию в личном кабинете сумлы
return 0;
}
public VirtualCurrency[] GetCurrencies() { //Указываем все наши валюты, которые мы продаем за реальные деньги
return new VirtualCurrency[]{ITEM_OBJECT};
}
public VirtualCurrencyPack[] GetCurrencyPacks(){ //Указываем все паки с нашими валютами
return new VirtualCurrencyPack[]{PACK_1_OBJECT, PACK_2_OBJECT};
}
public VirtualGood[] GetGoods() {
return new VirtualGood[0]; //Виртуальные блага
}
public VirtualCategory[] GetCategories() {
return new VirtualCategory[0]; //Категории виртуальных благ и реальных вещей
}
public const string ITEM_ID = "ITEM_ID";// указываем любой удобный ID
public const string PACK_1 = "ID_PACK_1";// указываем id, который мы указали в магазине (App Store, Google Play) для данного пака
public const string PACK_2= "ID_PACK_2";// указываем id, который мы указали в магазине (App Store, Google Play) для данного пака
public static VirtualCurrency ITEM_OBJECT = new VirtualCurrency(//создаем объект нашей виртуальной валюты
"ITEM_ID ",//Имя валюты
"ITEM_COIN", //описание валюты
ITEM_ID //id виртуальной валюты
);
public static VirtualCurrencyPack PACK_1_OBJECT = new VirtualCurrencyPack(//создаем объект пака с виртуальной валютой
"PACK_1",//имя пака
"",//Описание пака
PACK_1 ,// Указываем id пака
100, //Количество валюты в паке
ITEM_ID ,//id валюты в паке
new PurchaseWithMarket(PACK_1 , 1.99) //Первым указываем id пака в магазине, вторым его цену(не критично, если отличается)
);
public static VirtualCurrencyPack PACK_2_OBJECT = new VirtualCurrencyPack(//аналогично
"PACK_2",
"",
PACK_2,
200,
ITEM_ID ,
new PurchaseWithMarket(PACK_2, 5.99)
);
}
Благодаря комментариям более или менее все понятно, но я пропустил 2 вещи это виртуальные 'блага' и категории, они в основе нужны тем, кто хочет отслеживать продажу даже простых виртуальных покупок, не за реальные деньги, а даже за ту валюту, которую вы продаете за реальные деньги через личных кабинет сумлы, о котором мы поговорим позже.
Итак, мы прописали все наши внутриигровые покупки, но как же теперь передать эти данные плагину и как же совершать покупки?
А это весьма просто:
Инициализация Soomla
using Soomla;
using Soomla.Store;
public class Test {
public Test () {
SoomlaStore.Initialize (new dataIAP ());//Передаем при инициализации наш объект с данными о паках
#if UNITY_ANDROID
SoomlaStore.StartIabServiceInBg (); //Обязательно для Android, без этого ничего работать не будет
#endif
}
public void PayPack_1()
{
SoomlaStore.BuyMarketItem (StoreInfo.CurrencyPacks [0].ItemId, "");//Купить первый пак
}
public void PayPack_2()
{
SoomlaStore.BuyMarketItem (StoreInfo.CurrencyPacks [1].ItemId, "");//Купить второй пак
}
public void Quit()
{
SoomlaStore.StopIabServiceInBg ();
}
}
Очень простая инициализация, но нас ведь еще и интересуют события, которые нам доступны, а вот и они(Основные):
События
using System;
using System.Collections.Generic;
using Soomla;
using Soomla.Store;
public class ExampleEventHandler {
//Подписка на события при создании объекта класса
public ExampleEventHandler () {
//Вызывается, когда покупка за реальные деньги совершена
StoreEvents.OnMarketPurchase += onMarketPurchase;
//Вызывается, когда покупка за внутриигровую валюту совершена
StoreEvents.OnItemPurchased += onItemPurchased;
//Вызывается, если система покупок поддерживается
StoreEvents.OnBillingSupported += onBillingSupported;
//Вызывается, если система покупок не поддерживается
StoreEvents.OnBillingNotSupported += onBillingNotSupported;
//Вызывается, когда начата покупка за реальные деньги
StoreEvents.OnMarketPurchaseStarted += onMarketPurchaseStarted;
//Вызывается, когда начата покупка за внутриигровую валюту
StoreEvents.OnItemPurchaseStarted += onItemPurchaseStarted;
//Вызывается, когда покупка за реальные деньги отменена
StoreEvents.OnMarketPurchaseCancelled += onMarketPurchaseCancelled;
//Вызывается, когда магазин инициализирован
StoreEvents.OnSoomlaStoreInitialized += onSoomlaStoreInitialized;
//Вызывается, когда появился внутрянняя ошибка Soomla
StoreEvents.OnUnexpectedStoreError += onUnexpectedStoreError;
//Только для андроид
#if UNITY_ANDROID && !UNITY_EDITOR
StoreEvents.OnIabServiceStarted += onIabServiceStarted;
StoreEvents.OnIabServiceStopped += onIabServiceStopped;
#endif
}
public void onUnexpectedStoreError(int errorCode) {
SoomlaUtils.LogError ("ExampleEventHandler", "error with code: " + errorCode);
}
public void onMarketPurchase(PurchasableVirtualItem pvi, string payload, Dictionary<string, string> extra) {
}
public void onItemPurchased(PurchasableVirtualItem pvi, string payload) {
}
public void onBillingSupported() {
}
public void onBillingNotSupported() {
}
public void onMarketPurchaseStarted(PurchasableVirtualItem pvi) {
}
public void onItemPurchaseStarted(PurchasableVirtualItem pvi) {
}
public void onMarketPurchaseCancelled(PurchasableVirtualItem pvi) {
}
public void onCurrencyBalanceChanged(VirtualCurrency virtualCurrency, int balance, int amountAdded) {
}
public void onSoomlaStoreInitialized() {
}
#if UNITY_ANDROID && !UNITY_EDITOR
public void onIabServiceStarted() {
}
public void onIabServiceStopped() {
}
#endif
}
Вот и все, система полностью готова к работе.
Но теперь немного о личном кабинете Soomla. Там вы можете отслеживать все транзакции ваших пользователей, как с реальными деньгами, так и с внутриигровой валютой, для того и нужны блага и категории, чтобы проще было все отслеживать, но для работы с этой вещью нужно еще поработать с Soomla Highway. Но эта статья не об этом.
И пару слов о тестировании. Тестировать покупки на android просто, залили билд, к примеру, для бета теста и тестируйте на здоровье, но вот на ios обязательно создайте аккаунт для sandbox: