Jogo multi-idiomas

Tutorials, Unity

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.

Multi-language game

Tutorials, Unity

We’ll need:
– a public static Dictionary that stores all of the game’s words
– a public static Function that sets the game language
– a public static Function that gets words from the Dictionary when you need them

So first… create a C# public static class named LanguageDictonary:

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

public static class LanguageDictionary {

	//The words will be stored in this Dictionary
	public static Dictionary<string, string> stringList = new Dictionary<string, string>();

	//This is the default game language (english)
	public static SystemLanguage defaultLanguage = SystemLanguage.English;

	//This list stores the supported languages
	public static List<SystemLanguage> supportedLanguages = new List<SystemLanguage>();

	//this class sets the language and add its words to the Dictionary
	public static void SetLanguage (SystemLanguage language) {

		//check if the language is in the supported languages list
		supportedLanguages.Add (SystemLanguage.English);
		supportedLanguages.Add (SystemLanguage.Spanish);

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

		//Here you add the english translations
		if (language == SystemLanguage.English) {
			stringList.Add ("Yes", "Yes");
			stringList.Add ("No", "No");
		}
		//here you add the spanish translations
		else if (language == SystemLanguage.Spanish) {
			stringList.Add ("Yes", "Yes");
			stringList.Add ("No", "No");
		}
	}

	//this function gets words from the dictionary
	public static string GetTranslation (string stringToTranslate) {
		if (stringList.ContainsKey (stringToTranslate))
			return stringList [stringToTranslate];
		else
			return stringToTranslate;
	}
}

The first function, SetLanguage (), MUST be called at the beginning of the game, to set the language. Example:

//Supposing you want to get the user's system language
SetLanguage (Application.systemLanguage);

//Supposing you want to set the language manually
SetLanguage (SystemLanguage.English);

The second function, GetTranslation (), must be called whenever you need a translated word. Example:

//Supposing you want to put translated text in a Text component
GetComponent<Text>().text = GetTranslation ("Yes");

That’s it! If you have any questions, leave a comment below.

Obter Log de aparelho Android

Android, Tutorials

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!

Getting log from Android Device

Android, Tutorials, Unity

Getting log from an Android device is almost mandatory if you’re having trouble with some features (In-App Purchases, Advertising, etc) of your game on Android devices, but finding the correct tool to get the logs can be a pain in the ass if you’re not used to the Android SDK tools.

You just need to use the Android Device Monitor:

Captura de Tela 2015-07-28 às 02.50.40

Where is this tool?

It’s located inside the “tools” sub-folder of your Android SDK folder:

monitor

How to open it?

Sometimes, you can just click it, but if that doesn’t works you can just open the Terminal and enter the “monitor” address like this:

Captura de Tela 2015-07-28 às 03.02.14

Then you just have to press Enter and wait for the “monitor” to load up.

How to use it?

As soon as you open the Monitor, it SHOULD list your connected device and show its log in real time, like this:

devicelog

That’s it!

Mad Santa – Christmas Rush

Countryside Games

Do Tiny Acrobats para cá, muita coisa aconteceu, todas elas prejudiciais:

-Perdemos o App Campus nos estágios finais de aprovação (e não há um prêmio de consolação)
-Fiz um game para a Yamaha que aparentemente não vai ser lançado
-Meu sócio saiu do país e teve que redefinir suas prioridades

Mas coisas boas também aconteceram:

-Fiz uma viagem ao Peru, curta mas boa
-Busquei novas pessoas para trabalhar em um projeto novo
-Consegui desenvolver um jogo em 4 semanas, com pessoas que nunca haviam desenvolvido um jogo antes, e este jogo… é o assunto desta postagem:

Neste jogo, o jogador encarna o Papai Noel e deve jogar presentes nas chaminés das casas.
Simples? Não.
Em tempos de proteção aos animais, o uso de renas não é mais permitido, e só resta ao bom velhinho utilizar seu antigo balão.
Porém, numa sociedade cada vez mais apressada, estressada e armada, poucos cidadãos toleram baloeiros jogando caixas em seus telhados e carros. Então, não estranhe se tomar um tiro e seu balão cair. Tome cuidado!

Versão iPhone:
https://itunes.apple.com/nz/app/mad-santa-christmas-adventure/id950049277

Espero que gostem!

Randomizer Pro, um projeto pessoal

Countryside Games

Apesar de ter me silenciado nos últimos 4 meses, muita coisa foi feita.

Perdemos algum tempo participando de um programa de incentivo à desenvolvedores, que mais nos atrapalhou do que ajudou, mas durante este período não muito produtivo (em termos de portfolio), decidi fazer um aplicativo que EU precisava, um “randomizer”, um aplicativo que me ajudasse a sortear nomes, números e jogar dados.

Por incrível que pareça, apesar de haverem muitos “randomizers” por aí, a maioria não tem essas 3 funcionalidades, ou tem um aspecto muito feio. Por isso, quis fazer meu “Randomizer Pro”, unindo essas 3 funcionalidades e se encaixando no padrão estético dos sistemas atuais.

Aí vão algumas imagens:

screen568x568 screen568x568 (1) screen568x568 (2) screen568x568 (3)

É um projeto bem simples, feito em 4 dias (elaboração, arte e desenvolvimento) e foi o único projeto que fizemos pela Countryside Games.

Como de costume, publiquei o app em várias plataformas, sendo elas:

Android

iOS

BlackBerry 10

Se um dia me animar, faço um port para Windows Phone também, haha.
Apesar de não ter sido a ferramenta ideal, fiz o app em Unity. O grande problema disso é que o app pode ficar mais pesado em algumas plataformas, mas como era um projeto bem pessoal, não me importei com isso.

Também rolou um freelance para uma fabricante de motos aí, que ainda não recebi o feedback e consequentemente… não vou divulgar ainda.
Eu nem divulguei este app, mas ele tem recebido bons downloads no iOS, e como foi feito em 4 dias, para uso pessoal, posso dizer que fiquei feliz com o resultado

Integrating In-App Purchases for BlackBerry 10

BlackBerry, Tutorials, Unity

In this tutorial, I will teach how to integrate BlackBerry’s official In-App Purchases plugin for UNITY.
Read EVERYTHING with attention, and pay special attention to the RED paragraphs, which will provide you vital information and save you from future trouble.

This tutorial will follow this order:

  • Creation of products at BB’s Vendor Portal
  • Import the In-App Purchases plugin into Unity project
  • Integrate the plugin into the Demo scene
  • Test the integration

Creation of the Products at Vendor Portal

1.1 – Log-in at Vendor Portal
1.2 – Click “Manage Products”
1.3 – Supposing you already created your app at the Vendor Portal, click the + (plus) button at the Goods tab, as seen in the image below

Vendor Portal-Goods

You’ll see the “Add a Virtual Good” screen:

Vendor Portal - Add Virtual Good

1.4 – Fill the form, and if you have any questions, take a look at the explanations below:

Name is the product’s name that is shown ONLY at the Vendor Portal
SKU is the product identifier which you will put in your script, usually I name it like “NameOfTheGame_NameOfTheProduct” (this SKU is like the Product ID from the iOS App Store and Google Play, standardizing it may be good for your code)
License Type, pay attention to the different types of license:

  • Non-consumable: is for permanent products which will be kept save at the player’s account, for instance: characters.
  • Consumable: is for consumable products, that may be used just once, like a coin pack. If the user uninstall the app, he will lose that product.
  • Subscription: a subscription product can be used while the subscription lasts (7 or 30 days), after that, the product will expire and can no longer be used until the user decide to pay for the subscription again

Price is the product’s price
US Withholding Tax Classification you have to choose how the taxes will be collectedin the USA. For consumable and non-consumable products, I recommend you choosing “One-time”
Canada Withholding Tax Classification I use the same as the US Withholding Tax Classification, “One-time”
License Model for BlackBerry OS and PlayBook I recommend you using “Static”, that is the most common model (it’s the same used in Google Play and iOS App Store) and honestly, I have no idea on how to use the other models, so I can’t risk recommending them.

1.5 – To complete the creation of this product, click Save. If you want to create a few more before continuing this tutorial, click “Save and Add Another” and fill the form again.

Importing the In-App Purchases Plugin into Unity

2.1 – Enter the Asset Store from inside Unity (CTRL+9 on Windows, Command+9 on Mac)
2.2 – Search for “BlackBerry” at the Asset Store
2.3 – Select BlackBerry In-App Purchasing
2.4 – Click Import, to import it into your project

BlackBerry In-App Purchasing Plugin

2.5 – Import ALL THE plugin files into your project

Integrating the Plugin

After importing the plugin:
3.1 – Open the Demo scene, named “BlackBerryIAPTestScene”, and located inside the BlackBerry/IAP folder

3.2 – Select the gameObject named “UI” and open the class BlackBerryIAPTest.cs which is inside it

3.4 – The first two variables in this class are strings where you must put the product SKU that you created at the Vendor Portal, if you created 3 products, you must fill the 3 strings with the 3 product SKUs, for instance:

 string ITEM_1_SKU = "NameOfTheGame_NameOfTheProduct01";
 string ITEM_2_SKU = "NameOfTheGame_NameOfTheProduct02";
 string ITEM_3_SKU = "NameOfTheGame_NameOfTheProduct03";

3.5 – Then comes the localTesting variable, which must be set as TRUE while you’re testing the IAPs offline.
*the localTesting variable must be set to FALSE when you build the Submission version of the app, otherwise the users won’t be able to make in-app purchases

3.6 – At the function Start you delegate events from BlackBerryIAP.cs (which is inside the BlackBerryIAP gameObject at the Demo scene). For instance: the PurchaseSuccessful function is delegated to the PurchaseSuccesfulEvent event,  which is triggered everytime a purchase is completed.

3.7 – At the OnGui function, you will see Demo scene’s buttons (“Purchase SKU 1”, “Purchase SKU2”, etc).

3.8 – When one of the “Purchase SKU” buttons from OnGui is pressed, he calls the BuySKU function (which is located below OnGui), which requests the product purchase calling BlackBerryIAP.Purchase(sku, null, null, null, null, null, null)

3.9 – When the purchase is completed, the PurchaseSuccessfulEvent event from BlackBerryIAP.cs is triggered, then the PurchaseSuccessful function is called.

3.10 – From inside the PurchaseSuccessful function, you must “tell” WHAT happens when the product purchase is successful. The args.DigitalGoodSku variable inside this function is the SKU string from the product that was purchased.

There are other useful events like:
-ExistingPurchasesSuccessfulEvent, which loads the list of every product that the user purchased.
-GetPriceSuccessfulEvent, which gets the product’s price.

Use those events according to your project’s needs.
This is all you need, now check the test methods below.

Testing In-App Purchases

There are 2 ways to test the In-App Purchases:

Local Testing: doesn’t requires you to upload the game into the Vendor Portal. To do it, you need to:
-Set the localTesting variable from the BlackBerryIAPTest.cs class as TRUE.
-Install the game in your device
-Try to purchase the products

Sandbox: it’s the safer way, because it opens the default BlackBerry World’s purchase pop-up, asking login and user’s payment details. To use it, you need to make 2 things, 1 at your computer, and the other at your BlackBerry smartphone/tablet. Both are explained below:

1. At your computer:
-Build a version with the localTesting variable from the BlackBerryIAPTest.cs class set as FALSE
-Upload this version of your game at the Manage Products page at the Vendor Portal, leaving it with Draft status
-Click Sandbox at the Vendor Portal
-Click “Add New User”
-Fill the form with a BlackBerry World account e-mail which will be used to test the game and the In-App Purchases

2. At your smartphone/tablet:
-Open the BlackBerry World app
-Open the “Settings” at the BlackBerry World app, dragging your finger down from the TOP of your device’s screen
-Tap “Debug/Development Mode”
-Type your game’s ID (which you can find at your app’s “Edit Product” page at the Vendor Portal)Edit Product

-IF  BlackBerry World is up to date, you will see your game’s download page and you will be able to download it. But it can take 2 hours after uploading the game, so if it’s not available right now, give it some time.
-After downloading the game, you just need to make the in-app purchases using the account you created at the Sandbox page, you won’t be charged for that.

REMEMBER: the BlackBerryIAP.cs class must be ALWAYS inside a gameobject named BlackBerryIAP (it can’t be different), which must be ALWAYS inside the scene where your user will make the purchases, otherwise, the PurchaseSuccessful event won’t work and the user won’t receive the product.

I hope to have helped you as I know it’s really hard to profit from BlackBerry plaftorm.
BlackBerry gave us a great free plugin, but a really poor documentation.

Tiny Acrobats, the second game

Countryside Games, Portfolio

O novo jogo da Countryside Games chegou, quem quiser baixar primeiro e ler o post depois, aí vão os links:

Androidhttp://tinyurl.com/tinyacrobatsandroid

iPhone / iPadhttp://tinyurl.com/tinyacrobatsios

BlackBerry: http://tinyurl.com/tinyacrobatsbb

Windows Phone 8: http://tinyurl.com/tinyacrobatswp

Mais uma vez, eu e o Arthur trabalhos juntos para fazer o jogo sozinhos, e o resultado está aí.
O Arthur cuidando da arte/marketing e eu cuidando da programação/animação/som, obviamente, o Game Design teve contribuição de ambas as partes.

Fiz um tópico sobre o processo de desenvolvimento na sessão “Work In Progress” doo forum do Unity, caso alguém se interesse:
http://forum.unity3d.com/threads/232737-Our-second-game-the-Tiny-Acrobats?p=1545612#post1545612

A única coisa que não fizemos desta vez, foi a trilha sonora, pois consistia de 5 músicas, e eu perderia muito tempo compondo-as.

Todas as plataformas mobile atuais foram suportadas, será um lançamento massivo.

Tiny Acrobats - devices

Android, iOS, Windows Phone 8, BlackBerry

Primeiro trailer do jogo: