IAP в Unity3D

в 11:35, , рубрики: Gamedev, unity3d, разработка игр

Когда-то давно, во времена 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).

IAP в Unity3D - 1

IAP в Unity3D - 2

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

IAP в Unity3D - 3

In-App Manager

Теперь необходимо добавить код для работы с IAP. Этот C# скрипт содержит в себе следующие функции:

  • InitializePurchasing: инициализирует IAP, добавляет предметы, которые доступны для продажи и позволяет обрабатывать необходимые события
  • BuyProductID: функция, которая позволяет купить необходимый предмет, используя его индентификатор
  • BuyConsumable, BuyNonConsumable, BuySubscription: функции, которые позволяют приобретать покупки разных типов. Многие магазины поддерживают 3 типа покупок:
    1. Consumable — тип покупки, данные которой могут тратиться игроком в игре (например: монеты, пополнение энергии);
    2. NonConsumable — тип покупки, данные которой остаются у игрока навсегда (например: уникальный меч, отключение рекламы)
    3. 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 с передачей ей в качестве параметра идентификатора продаваемого предмета.

IAP в Unity3D - 4

А в функции 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

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js