Assinatura de Apps do Google Play (Android App Bundle)

Antes de submeter um arquivo “.aab” ao “Google Play Console“, você precisa providenciar um arquivo de assinatura do seu app/jogo no formato “.pem
Essa assinatura é gerada a partir do arquivo “.keystore” do seu app.

Caso você ainda não tenha providenciado essa assinatura, será alertado com o seguinte erro ao final do upload:
"Para fazer o upload do Android App Bundle, você precisa estar inscrito na Assinatura de apps do Google Play."

  1. Para resolver esta questão, você deve clicar na seta que está logo acima do botão “Adicionar da Biblioteca”:
  1. Selecione a segunda opção: “Exportar e fazer upload de uma chave de repositório Java”:
  1. Cique no botão “FERRAMENTA PEPK”, que vai baixar o arquivo “pepk.jar”, mas não o abra. Esta ferramenta serve para gerar o arquivo “.pem” que você precisa enviar ao Google.
  1. Abra o Prompt de Comando (se estiver usando Windows) ou o Terminal (se estiver usando MacOS) e cole o seguinte comando substituindo os campos que estão em negrito:

java -jar “ENDEREÇO_DO_PEPK” –keystore= “ENDEREÇO_DO_KEYSTORE” –alias=”ALIAS_DO_KEYSTORE” –output=”ENDEREÇO_ONDE_QUER_SALVAR/private_key.pem” –encryptionkey=CHAVE_DE_ENCRIPTAÇÃO_FORNECIDA_PELO_GOOGLE

Como neste exemplo:

java -jar “C:/Users/marcelo/Desktop/pepk.jar” –keystore= “C:/Users/marcelo/Desktop/app.keystore” –alias=”marcelo” –output=”C:/Users/marcelo/Desktop/private_key.pem” –encryptionkey=df715022017b00c6471f8ba81705f4ba4fe93fc8cef27558a3eb956cd48b9de6aeb10fe8f7c7c9b13046a104a3bbe4ac5a092761fb833b695a11e6c09ffe3059d2a529a2

Explicação do exemplo:
Os 2 primeiros endereços utilizados no comando são a localização do arquivo “pepk.jar” e do arquivo “.keystore” do meu app.
O campo “alias” deve ser preenchido com o nome de usuário da “keystore” que você utiliza para compilar o seu app. (caso tenha esquecido seu “alias” e estiver usando o Unity, você pode encontrá-lo na janela “Player Settings” na aba “Publishing Settings“).
No campo “output“, você deve preencher o endereço do local onde desejará salvar o arquivo “.pem” gerado. Não se esqueça de colocar o nome do arquivo no final do endereço (como no exemplo: “private_key.pem“)
O campo “encryptionkey” não precisa ser preenchido entre aspas, ele é um código fornecido pelo Google na mesma tela em que você baixou a “Ferramenta PEPK”, na parte que descreve o comando.

  1. Pressione “Enter”
  2. Digite a senha da sua “keystore” e pressione “Enter
  3. Digite a senha do seu “alias” e pressione “Enter
  4. Um arquivo “.dem” será salvo naquele endereço que você especificou no comando. Agora, volte à página do “Google Play Console“, clique no botão “Chave Privada de Assinatura do App”:
  1. Selecione seu arquivo “.dem”
  2. Clique no botão “Concluir” e PRONTO!

ACABOU! Espero ter ajudado!

Como criar Android App Bundle no Unity

Hoje, o Google Play pede que os desenvolvedores criem os “Android App Bundles” para que os usuários possam baixar versões mais leves dos aplicativos disponíveis na loja.

O que é um Android App Bundle (AAB) e por quê ele foi criado?

Antigamente, para lançar um jogo na plataforma Android, bastava você gerar um arquivo “.apk” do seu jogo e disponibilizar aos usuários.

Para que um jogo rodasse em todos os smartphones do mercado, seu arquivo “.apk” tinha que suportar os 3 tipos de arquitetura de processador, que são: o ARMv7, o ARM64 e o x86.

O problema é que esse excesso de informações de arquitetura tornava os arquivos “.apk” grandes. Isso não só deixava os downloads mais lentos como usava mais dados de rede móvel (como 3G e 4G), afastando alguns usuários.

Então, para reduzir o tamanho do arquivo “.apk“, o Google passou a exigir que os desenvolvedores disponibilizem um arquivo “.apk” específico para cada arquitetura de processador, permitindo ao usuário baixar apenas o arquivo “.apk” compatível com o seu smartphone e sem o excesso de informações referentes às outras arquiteturas.

Para simplificar o trabalho do desenvolvedor, que tinha que enviar diversos arquivos “.apk” individualmente, o Google criou o Android App Bundle, que é um pacote com todos esses arquivos “.apk” dentro. Esse pacote é um arquivo de extensão “.aab” que pode ser criado no Unity.

Como criar um AAB e enviar ao Google Play?

Basta abrir a janela “Build & Run” do Unity, selecionar a opção “Build App Bundle (Google Play)“, clicar em “Build” e selecionar o local onde você deseja salvar o arquivo .aab.

Para enviar este arquivo ao Google Play, basta enviá-lo igual um arquivo .apk normal, na página “Versões de Apps”, da aba “Gerenciamento de Versões” do Developer Console.

Jogo multi-idiomas

Vamos precisar de:
– um Dictionary publico estático que armazena todas as palavras do jogo
– uma Função pública estática que define o idioma do jogo
– uma Função pública estática que puxa as palavras deste Dictionary quando você pedir elas

Para começar… crie uma classe C# estática pública chamada LanguageDictonary:

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

public static class LanguageDictionary {

//As palavras serão armazenadas neste Dictionary
public static Dictionary<string, string> stringList = new Dictionary<string, string>();

//Este é o idioma padrão do jogo (português)
public static SystemLanguage defaultLanguage = SystemLanguage.Portuguese;

//Lista de idiomas suportados
public static List<SystemLanguage> supportedLanguages = new List<SystemLanguage>();

//esta classe define o idioma e adiciona suas palavras no Dictionary
public static void SetLanguage (SystemLanguage language) {

//define os idiomas suportados
supportedLanguages.Add (SystemLanguage.English);
supportedLanguages.Add (SystemLanguage.Portuguese);

if (!supportedLanguages.Contains (language))
language = defaultLanguage;

//Aqui ficam as palavras em português
else if (language == SystemLanguage.Portuguese) {
stringList.Add ("Sim", "Sim");
stringList.Add ("Não", "Não");
}
//Aqui ficam as palavras em inglês
if (language == SystemLanguage.English) {
stringList.Add ("Sim", "Yes");
stringList.Add ("Não", "No");
}
}

//esta função puxa palavras traduzidas do dicionário
public static string GetTranslation (string stringToTranslate) {
if (stringList.ContainsKey (stringToTranslate))
return stringList [stringToTranslate];
else
return stringToTranslate;
}
}

A primeira função, SetLanguage (), deve ser chamada no início do jogo, definindo o idioma do usuário. Por exemplo:

//Supondo que você puxar o idioma do sistema
SetLanguage (Application.systemLanguage);

//Supondo que você queira definir manualmente o idioma
SetLanguage (SystemLanguage.English);

A segunda função, GetTranslation (), deve ser chamada sempre que você precisar de uma palavra traduzida. Por exemplo:

//Para mostrar a tradução de uma palavra no Log:
Debug.Log (GetTranslation ("Sim"));

//Supondo que você queira colocar uma palavra traduzida num componente de Texto
GetComponent().text = GetTranslation ("Sim");

É isso aí! Se tiver dúvidas, é só postar um comentário abaixo.

Obter Log de aparelho Android

Ver o log de um aparelho Android é essencial se você estiver tendo problemas com funcionalidades do seu jogo – como In-App Purchases, Advertising, etc – mas pode ser difícil encontrar a ferramenta correta para isso se você não conhece bem o SDK do Android.

Você só precisa do Android Device Monitor:

Captura de Tela 2015-07-28 às 02.50.40

Onde fica essa ferramenta?

Dentro da sub-pasta “tools” da sua pasta do Android SDK:

monitor

Como abrir?

Você pode simplesmente clicar nele, mas se isso não funcionar, você pode abri-lo pelo Terminal colocando o endereço do “monitor” da seguinte maneira:

Captura de Tela 2015-07-28 às 03.02.14

Aí você só precisa apertar Enter e esperar pelo carregamento do “monitor”.

Como usar?

Assim que abrir o Monitor, ele vai mostrar o nome do seu aparelho e o log, assim:

devicelog

É só isso!

Implementando In-App Purchases para BlackBerry 10

Neste tutorial, explicarei como implementar o plugin de In-App Purchases para BlackBerry em jogos feitos no Unity.
Leia o tutorial INTEIRO com atenção, e dê atenção especial aos parágrafos em VERMELHO, que podem te dão informações vitais e te poupar futuras dores de cabeça.

Este tutorial será explicado na seguinte ordem:
-Criação dos produtos no Vendor Portal
-Importação do plugin de In-App Purchases no projeto do Unity
-Implementação do plugin utilizando a cena Demo como exemplo
-Teste da implementação

Criação dos Produtos no Vendor Portal

1.1 – Faça login no Vendor Portal
1.2 – Clique em “Manage Products”
1.3 – Pressupondo que você já criou seu aplicativo no Vendor Portal, clique no sinal de + da aba Goods (marcada em vermelho na imagem abaixo)

Vendor Portal-Goods

Você verá a tela “Add a Virtual Good”:

Vendor Portal - Add Virtual Good

1.4 – Preencha este formulário, e se estiver na dúvida sobre algum dos campos, veja esta explicação:

Name é o nome mostrado apenas no seu Vendor Portal
SKU é o código de identificação do produto que você usará no seu script, costumo usar o formato “NomeDoJogo_NomeDoProduto” (o SKU equivale ao Product ID da App Store e do Google Play, padronizá-lo pode ser útil)
License Type, preste bem atenção às diferenças das licenças:
*Non-consumable: serve para produtos duradouros, que ficarão salvos na conta do jogador, por exemplo, um pacote de Personagens.
*Consumable: serve para produtos consumíveis, que podem ser usados apenas 1 vez, por exemplo, um pacote de moedas.
*Subscription: serve para assinaturas, dá ao usuário o direito de gozar de determinado produto dentro do prazo especificado (7 ou 30 dias)
Price define o preço do produto
US Withholding Tax Classification você deve escolher como será feita a coleta de impostos sob o produto nos EUA, para produtos consumable/non-consumable recomendo usar o formato “One-time”
Canada Withholding Tax Classification eu sigo o mesmo modelo da US Withholding Tax Classification, ou seja “One-time”
License Model for BlackBerry OS and PlayBook eu recomendo escolher “Static”, que é o formato mais comum (o mesmo que se usa no Google Play e App Store) e eu particularmente não faço ideia de como se usa os outros formatos, então não me arrisco a recomendá-los.

1.5 – Para completar a criação deste produto, clique em Save. Se quiser criar mais um antes de continuar o tutorial, clique em “Save and Add Another” e preencha o formulário novamente.

Importando o Plugin de In-App Purchases no Unity

2.1 – Acesse a Asset Store dentro do Unity (CTRL+9 no Windows, Command+9 no Mac)
2.2 – Procure por “BlackBerry” na busca da Asset Store
2.3 – Selecione o plugin BlackBerry In-App Purchasing
2.4 – Clique em Import, para importar o plugin no seu projeto

BlackBerry In-App Purchasing Plugin

2.5 – Importe TODOS os arquivos do plugin para o seu projeto

Implementação do Plugin

Após ter importado o plugin no seu projeto:
3.1 – Abra a cena demo do plugin, chamada “BlackBerryIAPTestScene”, que se encontra dentro da pasta BlackBerry/IAP
3.2 – Selecione o gameobject chamado “UI” e abra o script BlackBerryIAPTest.cs que está nele

3.4 – As primeiras variáveis do script são strings onde você deve colocar a SKU do produto que você criou no Vendor Portal, se você tiver criado 3 produtos, pode preencher as 3 strings com os 3 SKUs desses produtos, por exemplo:


string ITEM_1_SKU = "NomeDoJogo_NomeDoProduto01";
string ITEM_2_SKU = "NomeDoJogo_NomeDoProduto02";
string ITEM_3_SKU = "NomeDoJogo_NomeDoProduto03";

3.5 – Em seguida, vem a variável localTesting, que deve ser definida como TRUE quando você quiser testar os IAPs em modo local/offline.
*a variável localTesting deve estar FALSE quando você for gerar a build Submission

3.6 – Na função Start se atribuem funções aos eventos do BlackBerryIAP.cs (que é uma classe atribuída ao gameobject BlackBerryIAP da cena de demonstração). Por exemplo: a função PurchaseSuccessful está atribuída ao evento PurchaseSuccesfulEvent, que é disparado toda vez que uma compra for concluída.

3.7 – Na função OnGui, se encontram os botões da cena de demonstração (“Purchase SKU 1”, “Purchase SKU2”, etc).

3.8 – Quando um botão de “Purchase SKU” da função OnGui é acionado, ele chama a função BuySKU (que está logo abaixo da OnGui), que por sua vez, solicita a compra do produto através do método BlackBerryIAP.Purchase(sku, null, null, null, null, null, null)

3.9 – Quando a compra for completada, o evento PurchaseSuccessfulEvent do BlackBerryIAP.cs vai ser disparado, e consequentemente, a função PurchaseSuccessful será chamada.

3.10 – Dentro da função PurchaseSuccessful, você deve dizer O QUE acontece quando a compra do produto for completada. A variável args.DigitalGoodSku desta função, é a string do SKU do produto que acabou de ser comprado.

Existem outros eventos que podem ser úteis, por exemplo:
-ExistingPurchasesSuccessfulEvent, que carrega a lista de todos os produtos comprados pela conta do usuário.
-GetPriceSuccessfulEvent, que puxa o preço do produto.

Use esses eventos conforme suas necessidade.
É só isso que você precisa, agora veja as maneiras de testar.

Testando as In-App Purchases

Existem 2 métodos de teste de In-App Purchases:

Local Testing: não requer que você faça upload do jogo no Vendor Portal. Para utilizá-lo, você precisa:
-Definir a variável localTesting da classe BlackBerryIAPTest.cs como TRUE.
-Instalar o jogo no seu celular
-Tentar comprar algum produto

Sandbox: é o método mais seguro de teste, pois abre o diálogo de compra padrão da BlackBerry, solicitando login e dados de compra do usuário. Para utilizá-lo, você deve passar por 2 processos, 1 no computador e outro no seu smartphone/tablet BlackBerry. Ambos explicados abaixo:

1. No computador:
-Gerar uma build com a variável localTesting da classe BlackBerryIAPTest.cs definida como FALSE
-Fazer upload dessa build/release do seu jogo na página Manage Products no Vendor Portal, podendo deixá-la no status Draft
-Clicar em Sandbox, no Vendor Portal
-Clicar em “Add New User”
-Cadastrar o e-mail de uma conta da BlackBerry World que será utilizada para testar o jogo e as In-App Purchases

2. No celular/tablet:
-Abrir o aplicativo BlackBerry World no seu aparelho BlackBerry.
-Abrir as “Configurações” do BlackBerry World, deslizando o dedo a partir do TOPO da tela
-Clicar em “Modo de Desenvolvimento”
-Digitar o ID do seu jogo (que se encontra na página “Edit Product” do seu aplicativo)Edit Product

-SE o BlackBerry World já tiver atualizado, você verá a página de download do seu jogo, e você poderá baixar. Mas isso pode demorar em torno de 2 horas após você ter feito o upload do jogo, então, se ainda não estiver disponível, não se desespere.
-Após baixar o jogo no seu celular, basta realizar as compras de IAP utilizando a conta que você cadastrou no Sandbox, você não receberá despesa nenhuma na fatura do seu cartão de crédito.

LEMBRE-SE: a classe BlackBerryIAP.cs SEMPRE deve estar adicionada a um gameobject com o nome BlackBerryIAP (não pode ser diferente), que SEMPRE deve estar presente na cena em que houver compras(in-app purchases), caso o contrário, o evento PurchaseSuccessful não vai funcionar, e o usuário não receberá o produto que ele comprou.

Espero ter ajudado muitas pessoas, pois sei que tem sido difícil lucrar nesta plataforma.
A BlackBerry disponibiliza um ótimo plugin gratuito, mas uma fraquíssima documentação.

Suporte aos controles MOGA Pro para BlackBerry (Unity)

Aqui vai uma maneira simples de implementar o controle MOGA ou SteelSeries no seu jogo para BlackBerry.

Lembrando que o controle que utilizei foi o MOGA Pro, e ao utilizar outros controles, não obtive resultados satisfatórios (as funções dos botões ficaram “embaralhadas”).
Primeiramente, vou explicar como conectar o controle ao seu aparelho, se você já sabe fazer isso, pode pular este primeiro ítem e ir direto ao segundo (Implementação):

Conectando o MOGA ao seu BlackBerry

1- Ligue a chave do controle na posição “B”, para Blackberry (como no exemplo abaixo):

moga

2- No seu aparelho BlackBerry:
– Vá em Definições -> Conexões de Rede -> Bluetooth
– Ative o Bluetooth.
– Aguarde até que apareça o “Moga Pro HID” na lista de aparelhos bluetooth (como na imagem abaixo)

BBbluetooth

– Clique no “Moga Pro HID” para conectar seu Blackberry ao gamepad e aguarde o nome do controle ficar verde
– Pronto! Seu Blackberry está conectado ao controle.

Implementação no código

Antes do código, uma observação: os botões L2 e R2 do controle NÃO funcionam no Blackberry
Para começar seu código, recomendo utilizar esta função do Unity logo no começo:

Input.GetJoystickNames()

Esta função retorna um array de strings com os nomes dos controles conectados. Eu utilizo ela para detectar se há algum controle conectado, como no exemplo abaixo:


void Awake ()
{
if ( Input.GetJoystickNames() == null )
print( "Nenhum controle conectado" );
}

E agora, o mais importante… um código detectando o Input de todos os botões do controle e dando Print


void Update ()
{
if ( Input.GetKey(KeyCode.Joystick1Button2) ) // BOTAO X DO MOGA
print ("Pressionou o botao X");

if( Input.GetKey(KeyCode.Joystick1Button3) ) // BOTAO Y DO MOGA
print ("Pressionou o botao Y");

if( Input.GetKey(KeyCode.Joystick1Button0) ) // BOTAO A DO MOGA
print ("Pressionou o botao A");

if( Input.GetKey(KeyCode.Joystick1Button1) ) // BOTAO B DO MOGA
print ("Pressionou o botao B");

if( Input.GetKey(KeyCode.Joystick1Button4) ) // BOTAO L1 DO MOGA
print ("Pressionou o botao L1");

if( Input.GetKey(KeyCode.Joystick1Button5) ) // BOTAO R1 DO MOGA
print ("Pressionou o botao R1");

if( Input.GetKey(KeyCode.Joystick1Button6) ) // BOTAO SELECT DO MOGA
print ("Pressionou o botao SELECT");

if( Input.GetKey(KeyCode.Joystick1Button7) ) // BOTAO START DO MOGA
print ("Pressionou o botao START");

if( Input.GetAxisRaw("6th axis") > 0 ) // EIXO HORIZONTAL DO DIRECIONAL DIGITAL DO MOGA
print ("Pressionou o Direcional Digital para direita");

if( Input.GetAxisRaw("7th axis") > 0 ) // EIXO VERTICAL DO DIRECIONAL DIGITAL DO MOGA
print ("Pressionou o Direcional Digital para cima");
if( Input.GetAxisRaw("4th axis") < 0 ) // EIXO HORIZONTAL DO DIRECIONAL ANALOGICO DO MOGA
print ("Moveu o Direcional Analogico para esquerda");

if( Input.GetAxisRaw("5th axis") < 0 ) // EIXO VERTICAL DO DIRECIONAL ANALOGICO DO MOGA
print ("Moveu o Direcional Analogico para baixo");
}

Lembrando que os direcionais não vão funcionar se você não criar estes inputs “4th axis”, “5th axis”, “6th axis” e “7th axis” na lista de Inputs do seu projeto.
Para isso, siga o exemplo abaixo

Configurando Input dos Direcionais

-No Unity, vá em: Edit -> Project Settings -> Input
-Crie um input com o nome de cada eixo utilizado no código acima (“4th axis”, “5th axis”, “6th axis” e “7th axis”)
-Configure cada input igual ao exemplo abaixo:

MOGAinput

Lembre-se que o campo “Axis” é definido de acordo com o eixo que você quer mexer (não vá colocar “6th axis” nos 4 inputs).

Com a lista de inputs configurada e os códigos  “na mão”, de agora em diante, é com você 😉

Adaptando NGUI para BlackBerry e Windows Phone (Unity)

Cada plataforma mobile usa um estilo de “scaling” diferente no NGUI.
Esse “scaling”, é o que garante que a interface se adapte ao formato da tela.

Para alterar o tipo de scaling, você deve procurar pelo gameobject “UIRoot (2D)” na hierarquia do seu projeto:

UIRoot

Confira se o gameobject possui a classe “UIRoot” no inspector:

UIRoot-inspector

No Android e iOS, a variável “ScalingStyle” do UIRoot deve ser “FixedSizeOnMobiles”.
No BlackBerry10 e no WindowsPhone8, você deve mudar o Scaling Style para “FixedSize”:

UIRoot-scalingstyle

É simples, mas fazer isso manualmente pode ser muito trabalhoso quando seu jogo possui muitas cenas.
Por isso, criei a classe “UIAdapter”, que sempre coloco junto ao “UIRoot(2D)” das minhas cenas e que faz esse trabalho automaticamente:


using UnityEngine;
using System.Collections;

public class UIAdapter : MonoBehaviour {

private UIRoot UiRoot;

void Awake ()
{
UiRoot = GetComponent&amp;amp;lt;UIRoot&amp;amp;gt; ();

#if UNITY_BLACKBERRY || UNITY_WP8
UiRoot.scalingStyle = UIRoot.Scaling.FixedSize;
#endif
#if UNITY_ANDROID || UNITY_IPHONE
UiRoot.scalingStyle = UIRoot.Scaling.FixedSizeOnMobiles;
#endif
}
}