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).
![](https://habrastorage.org/files/3c8/2e1/fd2/3c82e1fd204a40ceaf165e8ae49d80de.png)
![](https://habrastorage.org/files/6e3/228/477/6e3228477835454bab24fc77e3ade0e3.png)
Далее необходимо нажать на кнопку Import после чего, произойдет импорт всех необходимых ассетов в проект.
![](https://habrastorage.org/files/a8b/227/b3e/a8b227b3ed1044ab8e93dd8e5c9a03a6.png)
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 с передачей ей в качестве параметра идентификатора продаваемого предмета.
![](https://habrastorage.org/files/4f1/e12/d77/4f1e12d774184cf5bb118b64b37e2196.png)
А в функции 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 удобно это делать. Просто сейчас из-за этого враперы приходится писать, чтоб унифицировать код.