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.
Note que depois de deixar o switch em on, haverá um botão de importar. Clique nele para baixar os componentes necessários.
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.
2 thoughts on “Tutorial: Unity In-app Purchase – Parte 2”