M2DAI Ответов: 1

Ошибки покупки в приложении Unity in-app


Ошибка: не удалось загрузить сигнатуру UnityEngine.Совершение покупок.UIFakeStore:GetOkayButton из-за: не удалось загрузить файл или сборку 'UnityEngine.UI, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' или одна из его зависимостей. сборка:UnityEngine.Интерфейс, версия=1.0.0.0, культуры=нейтральный, значения PublicKeyToken=null тип:&ЛТ;неизвестного типа&ГТ; члены:(нуль) подпись:<нет&ГТ;

Assets\IAP\IAPManager.cs(68,21): ошибка CS0116: пространство имен не может непосредственно содержать элементы, такие как поля или методы

Assets\IAP\IAPManager.cs(10,54): ошибка CS0535: 'IAPManager' не реализует элемент интерфейса 'IStoreListener.OnInitializeFailed(InitializationFailureReason)'

Assets\IAP\IAPManager.cs(10,54): ошибка CS0535: 'IAPManager' не реализует элемент интерфейса 'IStoreListener.ProcessPurchase(PurchaseEventArgs)'

Assets\IAP\IAPManager.cs(10,54): ошибка CS0535: 'IAPManager' не реализует элемент интерфейса 'IStoreListener.OnPurchaseFailed(Продукт, PurchaseFailureReason)'

Assets\IAP\IAPManager.cs(10,54): ошибка CS0535: 'IAPManager' не реализует элемент интерфейса 'IStoreListener.OnInitialized(IStoreController, IExtensionProvider)'

Assets\IAP\BuyButton.cs(49,9): ошибка CS0305: использование универсального типа 'IEnumerator<T>' требует аргументов типа 1

using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Purchasing;

namespace CompleteProject
{
  public class IAPManager : Singleton<IAPManager>, IStoreListener
  {
    private static IStoreController m_StoreController;
    private static IExtensionProvider m_StoreExtensionProvider;

    public string seeds_10 = "seeds_10";
    public string seeds_35 = "seeds_35";
    public string seeds_200 = "seeds_200";
    public string seeds_1000 = "seeds_1000";
    public string kProductIDNonConsumable = "nonconsumable";

    public void Awake() {
      DontDestroyOnLoad(gameObject);
      Start();
    }

    void Start()
    {
      if (m_StoreController == null)
      {
        InitializePurchasing();
      }
    }

    public void InitializePurchasing()
    {
      if (IsInitialized())
      {
        return;
      }
      var builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());

      builder.AddProduct(seeds_10, ProductType.Consumable);
      builder.AddProduct(seeds_35, ProductType.Consumable);
      builder.AddProduct(seeds_200, ProductType.Consumable);
      builder.AddProduct(seeds_1000, ProductType.Consumable);

      builder.AddProduct(kProductIDNonConsumable, ProductType.NonConsumable);

    }
  }


    public bool IsInitialized()
    {

      return m_StoreController != null && m_StoreExtensionProvider != null;
    }


    public void Buy10seeds()
    {
      BuyProductID(seeds_10);
    }

    public void Buy35seeds()
    {

      BuyProductID(seeds_35);
    }

    public void Buy200seeds()
    {

      BuyProductID(seeds_200);
    }

    public void Buy1000seeds()
    {

      BuyProductID(seeds_1000);
    }


    public void BuyNonConsumable()
    {

      BuyProductID(kProductIDNonConsumable);
    }

    public string GetProducePriceFromStore(string id){
      if(m_StoreController != null && m_StoreController.products != null)
        return m_StoreController.products.WithID(id).metadata.localizedPriceString;
      else
        return "";
    }

    void BuyProductID(string productId)
    {

      if (IsInitialized())
      {

        Product product = m_StoreController.products.WithID(productId);
        if (product != null && product.availableToPurchase)
        {
          Debug.Log(string.Format("Purchasing product asychronously: '{0}'",           product.definition.id));

          m_StoreController.InitiatePurchase(product);
        }
        else
        {
          Debug.Log("BuyProductID: FAIL. Not purchasing product, either is not found or is not available for purchase");
        }
      }
      else
      {

        Debug.Log("BuyProductID FAIL. Not initialized.");
      }
    }


    public void RestorePurchases()
    {

      if (!IsInitialized())
      {

        Debug.Log("RestorePurchases FAIL. Not initialized.");
        return;
      }

      if (Application.platform == RuntimePlatform.IPhonePlayer ||
        Application.platform == RuntimePlatform.OSXPlayer)
      {

        Debug.Log("RestorePurchases started ...");

        var apple = m_StoreExtensionProvider.GetExtension<IAppleExtensions>();
        apple.RestoreTransactions((result) => {

        Debug.Log("RestorePurchases continuing: " + result + ". If no further messages, no purchases available to restore.");
      });
    }

    else
    {

      Debug.Log("RestorePurchases FAIL. Not supported on this platform. Current = " + Application.platform);
    }
  }

  public void OnInitialized(IStoreController controller, IExtensionProvider extensions)
  {

    Debug.Log("OnInitialized: PASS");
    m_StoreController = controller;

    m_StoreExtensionProvider = extensions;
  }


  public void OnInitializeFailed(InitializationFailureReason error)
  {

    Debug.Log("OnInitializeFailed InitializationFailureReason:" + error);
  }

  public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs args)
  {

    if (String.Equals(args.purchasedProduct.definition.id, seeds_10, StringComparison.Ordinal))
    {
      Debug.Log(string.Format("ProcessPurchase: PASS. Product: '{0}'", args.purchasedProduct.definition.id));

      DataManager.Instance.AddGold(10);
    }
    else if (String.Equals(args.purchasedProduct.definition.id, seeds_35, StringComparison.Ordinal))
    {
      Debug.Log(string.Format("ProcessPurchase: PASS. Product: '{0}'", args.purchasedProduct.definition.id));

      DataManager.Instance.AddGold(35);
    }
    else if (String.Equals(args.purchasedProduct.definition.id, seeds_200, StringComparison.Ordinal))
    {
      Debug.Log(string.Format("ProcessPurchase: PASS. Product: '{0}'", args.purchasedProduct.definition.id));

      DataManager.Instance.AddGold(200);
    }
    else if (String.Equals(args.purchasedProduct.definition.id, seeds_1000, StringComparison.Ordinal))
    {
      Debug.Log(string.Format("ProcessPurchase: PASS. Product: '{0}'", args.purchasedProduct.definition.id));

      DataManager.Instance.AddGold(1000);
    }

    else if (String.Equals(args.purchasedProduct.definition.id, kProductIDNonConsumable, StringComparison.Ordinal))
    {
      Debug.Log(string.Format("ProcessPurchase: PASS. Product: '{0}'", args.purchasedProduct.definition.id));

      DataManager.Instance.RemoveAds();
    }
    else
    {
      Debug.Log(string.Format("ProcessPurchase: FAIL. Unrecognized product: '{0}'", args.purchasedProduct.definition.id));
    }

    return PurchaseProcessingResult.Complete;
  }

  public void OnPurchaseFailed(Product product, PurchaseFailureReason failureReason)
  {

    Debug.Log(string.Format("OnPurchaseFailed: FAIL. Product: '{0}', PurchaseFailureReason: {1}", product.definition.storeSpecificId, failureReason));
  }
}


Что я уже пробовал:

public void Awake() {

  DontDestroyOnLoad(gameObject);
  Start();

}

Richard MacCutchan

1. Система не может найти библиотеку сборок, которую вы пытаетесь использовать.
2. сообщения об ошибках компилятора достаточно ясны. Ваш код должен находиться внутри класса, а не только в пространстве имен.

1 Ответов

Рейтинг:
2

Pete O'Hanlon

Я отредактировал ваш вопрос так, чтобы в нем был отступ. Когда я это сделал, проблема сразу же стала очевидной - после метода InitializePurchasing вы закрываете класс. Вам нужно удалить лишний } оттуда и переместить его в конец файла.