Unity3D 5.3
И вот в версии Unity3D 5.3 появилась поддержка in-app purchases как говорится «из коробки». Этот простой инструмент позволяет легко внедрить в приложение покупки для наиболее популярных магазинов приложений.
Сейчас поддерживаются:
- Amazon Apps
- Google Play
- iOS App Store
- Mac App Store
- Samsung GALAXY Apps
- Tizen Store
- Windows Store.
Интеграция в проект
Для начала во вкладке Services необходимо кликнуть по полю In-App Purchasing и включить эту функцию. Также автоматически включается сервис аналитики, в котором потом можно посмотреть Revenue, Average Revenue Per Paying User (ARPPU), Average Revenue Per Daily Active User (ARPDAU).


Далее необходимо нажать на кнопку Import после чего, произойдет импорт всех необходимых ассетов в проект.

In-App Manager
Теперь необходимо добавить код для работы с IAP. Этот C# скрипт содержит в себе следующие функции:
- InitializePurchasing: инициализирует IAP, добавляет предметы, которые доступны для продажи и позволяет обрабатывать необходимые события
- BuyProductID: функция, которая позволяет купить необходимый предмет, используя его индентификатор
- BuyConsumable, BuyNonConsumable, BuySubscription: функции, которые позволяют приобретать покупки разных типов. Многие магазины поддерживают 3 типа покупок:
- Consumable — тип покупки, данные которой могут тратиться игроком в игре (например: монеты, пополнение энергии);
- NonConsumable — тип покупки, данные которой остаются у игрока навсегда (например: уникальный меч, отключение рекламы)
- Subscription — подписка;
- RestorePurchases: — функция, которая позволяет реализовать механизм восстановления покупок. Необходим в iOS. Если в игре есть NonConsumable покупка, то должна быть и кнопка, которая выполняет ее восстановление
- OnInitialize: вызывается, когда приложение может подключиться к Unity IAP.
- OnInitializeFailed: вызывается, когда приложению не удалось подключиться к Unity IAP. Сообщение с ошибкой пишется в консоль
- ProcessPurchase: вызывается, когда покупка успешно совершена
- OnPurchaseFailed: функция вызывается, когда покупка не удалась и сообщение с ошибкой пишется в консоль.
Использование в игре
Чтобы было более понятней как применять скрипт, приведу пример. Есть две покупки: одна NonConsumable — отключение рекламы, вторая Consumable — дает игроку 80 монет. Используются две платформы: Google Play, AppStore. Для каждой покупки необходимо объявить три константы, содержащие в себе идентификаторы покупок UnityIAP, Google Play и AppStore.
public const string pMoney80 = "money_80";
public const string pNoAds = "no_ads";
public const string pMoney80AppStore = "app_money_80";
public const string pNoAdsAppStore = "app_no_ads";
public const string pMoney80GooglePlay = "gp_money_80";
public const string pNoAdsGooglePlay = "gp_no_ads";
После этого, в функцию инициализации, необходимо передать эти константы:
builder.AddProduct(pMoney80, ProductType.Consumable, new IDs() { { pMoney80AppStore, AppleAppStore.Name }, { pMoney80GooglePlay, GooglePlay.Name } });
builder.AddProduct(pNoAds, ProductType.NonConsumable, new IDs() { { pNoAdsAppStore, AppleAppStore.Name }, { pNoAdsGooglePlay, GooglePlay.Name } });
Теперь на кнопку покупки предмета, необходимо повесить функцию BuyProductID с передачей ей в качестве параметра идентификатора продаваемого предмета.

А в функции PurchaseProcessingResult добавить действия для каждой из покупок.
if (String.Equals(args.purchasedProduct.definition.id, pMoney80, StringComparison.Ordinal))
{
//Action for money
ResourceManager.Instance.Money += 80;
}
else if (String.Equals(args.purchasedProduct.definition.id, pNoAds, StringComparison.Ordinal))
{
//Action for no ads
ResourceManager.Instance.NoAds = true;
}
Вот и все. Остается только не забыть создать покупки с такими же идентификаторами в AppStore и Google Play.
Комментарии (7)
mrguardian
24.01.2017 01:56Интересно почитать про расширяемость. Можно ли приделать оплату в стороннем магазине? Например в webgl версии.
Desu0x
24.01.2017 13:46Можно для каждого магазина реализовывать интерфейсы из этого плагина: IStoreListener, IExtensionProvider и другие. Но на практике я бы не стал этого делать. Для WebGL все зависит от платформы, на которой вы запускаете свою игру.
Например, для vk.com в обработчике нажатия кнопки, я через директиву #if UNITY_WEBGL помещаю вызов метода showOrderBox, который показывает окно покупки пользователю.mrguardian
25.01.2017 03:18Вот и мы в своей игре внедряли оплату кастомными методами. Поэтому и хотелось бы подробностей про расширение api, как сделано с социальными сетями. Спасибо за наводку.
Dashy_Ducks
24.01.2017 13:03-1Уважаемый Андрей, в списке нет tvOS (Apple TV). Иапы для tvOS используются те-же, что и для iOS? Т.е. можно ли использовать встроенный в Юнити функционал для покупок на tvOS?
Suvitruf
Ох уж эти туториалы по покупкам. Чего-чего, но уж в случае с Unity3d там неплохой офф туториал есть. Кстати, в случае с покупками, валидируйте их на клиенте, раз есть такая возможность. Это в дополнении к валидации на сервере, безусловно.
Btw, в свете недавнего выхода Facebook Gameroom, Facebook in-app'ы тоже планируется стандартизировать. Вроде как в след. версии Unity это обещали. Хотя, там и средствами их SDK удобно это делать. Просто сейчас из-за этого враперы приходится писать, чтоб унифицировать код.