← Назад к вопросам

Как реализовать внутриигровые покупки (In-App Purchases) в Unity?

2.0 Middle🔥 81 комментариев
#Unity Core

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Реализация In-App Purchases в Unity

Внутриигровые покупки (IAP) — критически важный компонент для monetization современных игр. В Unity основным инструментом является Unity IAP, унифицированный плагин для Android (Google Play), iOS (App Store), PC (Steam, Windows Store) и других платформ.

Архитектура Unity IAP

Unity IAP действует как абстрактный слой между вашей игрой и специфическими API магазинов. Он предоставляет единый интерфейс (UnityEngine.Purchasing) для:

  • Получения информации о продуктах
  • Обработки транзакций
  • Восстановления покупок (особенно на iOS)

Пошаговый процесс реализации

1. Настройка проекта

  • Импортируйте пакет Unity IAP через Package Manager (Unity 2019+)
  • Для старых версий используйте Asset Store версию
  • На Android включите Google Play в настройках IAP
  • На iOS требуется дополнительная настройка Capabilities в Xcode

2. Конфигурация продуктов в магазинах

  • Для Google Play: создайте продукты в Google Play Console с типами consumable, non-consumable, subscription
  • Для App Store: аналогично в App Store Connect
  • У каждого продукта должен быть уникальный ID (например, "coins_pack_100"), который используется в коде

3. Базовый код инициализации

using UnityEngine;
using UnityEngine.Purchasing;

public class IAPManager : MonoBehaviour, IStoreListener
{
    private IStoreController controller;
    private IExtensionProvider extensions;

    void Start()
    {
        InitializePurchasing();
    }

    void InitializePurchasing()
    {
        var builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
        
        // Добавление продуктов
        builder.AddProduct("coins_pack_100", ProductType.Consumable);
        builder.AddProduct("premium_license", ProductType.NonConsumable);
        builder.AddProduct("monthly_subscription", ProductType.Subscription);
        
        UnityPurchasing.Initialize(this, builder);
    }
    
    // Реализация интерфейса IStoreListener
    public void OnInitialized(IStoreController controller, IExtensionProvider extensions)
    {
        this.controller = controller;
        this.extensions = extensions;
        Debug.Log("IAP успешно инициализирован");
    }
    
    public void OnInitializeFailed(InitializationFailureReason error)
    {
        Debug.LogError($"Ошибка инициализации IAP: {error}");
    }
}

4. Обработка покупки и транзакций

public void PurchaseProduct(string productId)
{
    if (controller != null)
    {
        Product product = controller.products.WithID(productId);
        
        if (product != null && product.availableToPurchase)
        {
            controller.InitiatePurchase(product);
        }
        else
        {
            Debug.LogError($"Продукт {productId} недоступен");
        }
    }
}

public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs args)
{
    string productId = args.purchasedProduct.definition.id;
    
    // Логика предоставления товара игроку
    switch (productId)
    {
        case "coins_pack_100":
            AddCoins(100);
            break;
        case "premium_license":
            EnablePremiumFeatures();
            break;
    }
    
    return PurchaseProcessingResult.Complete;
}

public void OnPurchaseFailed(Product product, PurchaseFailureReason reason)
{
    Debug.LogError($"Покупка {product.definition.id} не удалась: {reason}");
}

5. Восстановление покупок и дополнительные функции

public void RestorePurchases()
{
    // Особенно важно для iOS
    if (extensions != null)
    {
        extensions.GetExtension<IAppleExtensions>().RestoreTransactions((result) =>
        {
            Debug.Log($"Результат восстановления: {result}");
        });
    }
}

// Получение информации о продуктах
public string GetProductPrice(string productId)
{
    Product product = controller.products.WithID(productId);
    return product?.metadata.localizedPriceString ?? "N/A";
}

Ключевые практики и подводные камни

  • Тестирование: Используйте Fake Store в режиме разработки. Для Google Play создайте тестовые аккаунты
  • Серверная валидация: Для предотвращения fraud проверяйте транзакции на своем сервере, особенно для Non-consumable товаров
  • Локализация: Загрузите localized descriptions и цены через product.metadata
  • UI/UX: Показывайте четкие сообщения об ошибках, предусмотрите pending состояния
  • Политики магазинов: Строго соблюдайте правила Google Play и App Store (например, восстановление покупок на iOS обязательна)

Расширенные техники

  1. Подписки (Subscriptions): Используйте ProductType.Subscription, проверяйте статус через extensions.GetExtension<ISubscriptionExtension>()
  2. Кросс-платформенные товары: Дифференцируйте продукты по платформам через conditional compilation
  3. Аналитика: Интегрируйте события покупок в аналитические системы (Firebase, GameAnalytics)

Альтернативные решения

  • Для сложных случаев рассмотрите native implementations через Android Java и iOS Objective-C плагины
  • Third-party SDK: RevenueCat, GameSparks предлагают более абстрактные решения

Реализация IAP требует внимания к деталям и тщательного тестирования на всех целевых платформах. Unity IAP значительно упрощает кросс-платформенную разработку, но понимание специфики каждого магазина остается обязательным.