Когда-то давно, во времена Unity 4 добавление внутриигровых покупок вызывало некоторые трудности. Можно было идти двумя путями: использовать какой-либо плагин из уже существующих или реализовывать свою обертку над нативными функциями для каждой платформы. В первом случае было несколько решений: Soomla, OpenIAB, Prime и много-много других. Некоторые из них были платными и стояли довольно дорого: цена Prime составляла около 70$. Некоторые были бесплатными и отказывались работать в iOS: OpenIAB.
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.
Автор: Desu0x