Tutorial: Unity In-app Purchase – Parte 2

Continuando a série de tutoriais que mostram o uso básico do In-app purchase do Unity Analytics, hoje veremos como configurar a Unity e escrever uma classe que funcione como “loja”, ou seja, será responsável por se comunicar com a API do Unity In-app Purchase.

Se você ainda não viu a primeira parte sobre o processo de configuração do jogo na conta do Google Play, este é um bom momento para você clicar aqui e conferi-lo.

É importante salientar que este texto não tem intenção de abordar todas as funcionalidades da Unity In-app API e sim demonstrar um exemplo prático do uso básico da mesma. Também uma versão do App já deve ter sido upada para Google Play mesmo em Alpha ou Beta. Embora não precise ser a versão mais atualizada, porém a versão de teste deve ser assinada com a mesma keystore.

Agora que estamos alinhados vamos ao que interessa.

Configuração do Unity In-app Purchase

Para habilitar a integração, basta acessar a aba serviço, clicar em In-app Purchase e trocar o switch para on. Se você ainda não configurou alguns do serviços, terá que fazer agora.

 

turn-on

Note que depois de deixar o switch em on, haverá um botão de importar. Clique nele para baixar os componentes necessários.

import

Codificando

Criaremos uma classe que conterá basicamente constantes com os Id’s dos itens cadastrados anteriormente, um construtor para realizar as configurações iniciais, um método para realizar a compra e eventos para capturar as respostas.

Esta classe será escrita em padrão singleton e precisará implementar a interface IStoreListener. Ela é responsável pelos eventos de callback.


using System;
using UnityEngine;
using UnityEngine.Purchasing;

public class Loja : IStoreListener
    {

	public const string PACOTE_1000_ID = “pacote_1000_moedas”; // id do produto na loja
		
		
	private const string GOOGLE_API = “SUA_API_DO_GOOGLE_PLAY”

	private static IStoreController m_StoreController;// Controle do Unity
	private static IExtensionProvider m_StoreExtensionProvider; // Encapsula as funções da loja para cada plataforma
	private static instance = null;

	private Loja(){

		// configuração
		ConfigurationBuilder builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
		builder.Configure().SetPublicKey(GOOGLE_PLAY_API);
			
		builder.AddProduct(PACOTE_1000_ID, ProductType.Consumable); // adiciona cada ID de acordo com o tipo Consumable, NonConsumable ou Subscription como foi cadastrado anteriormente
			
		UnityPurchasing.Initialize(this, builder);
	}

	public Loja Instance(){
			
		if(instance == null){
			instance = new Loja();
		}
			
		return instance;
			
	}
	
		
	// Handlers dos eventos
		
	public void OnInitialized(IStoreController controller, IExtensionProvider extensions)
	{
			
		Debug.Log("Inicilizada");			
		m_StoreController = controller;			
		m_StoreExtensionProvider = extensions;
	}

	public void OnInitializeFailed(InitializationFailureReason error)
	{
		Debug.Log("Inicialização falhou");
	}

	public void OnPurchaseFailed(Product i, PurchaseFailureReason p)
	{
		Debug.Log("Compra: a compra falhou");			
	}

	public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs e)
	{
	        Debug.Log("Compra: OK");
			
		return PurchaseProcessingResult.Complete;
	}


    }

Até aqui temos a inicialização da nossa classe loja, mas ainda falta a função principal que é a compra. Para criarmos este bloco do código precisamos ter 2 pontos em mente: primeiro só podemos comprar se a loja já foi iniciada e o id do item tem que ter sido adicionado anteriormente. Basta adicionar este bloco dentro da classe anterior e no final teremos algo como assim:

 


        // varifica o status da loja
	public static bool EstaInicializado()
        {
            return m_StoreController != null & m_StoreExtensionProvider != null;
        }

        //tenta fazer uma compra
        public void Comprar(string item_id)
        {
            
            try
            {
                // verifica se a loja já foi inicializada
                if (EstaInicializado())
                {
					// busca o item pelo id passado
                    Product product = m_StoreController.products.WithID(item_id);

                    
                    if (product != null && product.availableToPurchase)
                    {
						// inicializa o processo de compra
                        m_StoreController.InitiatePurchase(product);
                    }
                    
                    else
                    {
						
                        Debug.Log("Compra: FAIL. produto não permitido");
                    }
                }
                // Otherwise ...
                else
                {
                    
                    Debug.Log("Compra: falha. não inicializado.");
                }
            }
            // Captura qualquer Exception
            catch (Exception e)
            {
               
                Debug.Log("Compra: Falha. Exception na compra. " + e);
            }
        }

Para testar basta criar uma classe MonoBehaviour, vinculando este script a um GameObject, em cena, claro. Já no método Start, invocamos Comprar da instância da loja.

Se tudo ocorreu bem, você deverá ver o PopUp de compra do Android.

Bom pessoal, é isso. Espero que tenha ficado claro o funcionamento básico do Unity In-app Purchase e, no caso de dúvidas e elogios ;),  usem a área de comentários abaixo. Abraço e até a próxima.

Allan Douglas

Allan Douglas (Redator) – Formado em Análise e Desenvolvimento de Sistemas (Estácio de Sá). Atualmente trabalha como Analista Líder na Teccenter no Recife – PE. Também desenvolve soluções WEB, Mobile e Games. É fanboy da SEGA e adora jogos de estratégia digitais ou analógicos.

2 thoughts on “Tutorial: Unity In-app Purchase – Parte 2

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *