sábado, 20 de abril de 2013

Unity C# - Singleton

E ai pessoal, tudo bem?

Bom... eu ainda não posso falar sobre os projetos em que estamos trabalhando... mas como eu to com um tempinho livre, achei que podia ser legal fazer um tutorialzinho de uma coisa que é EXTREMAMENTE útil, e que eu sei que não é todo mundo que usa... Singletons.

Antes de continuar, gostaria de dizer que esse tutorialzinho básico será em C# (que diga-se de passagem eu recomendo fortemente se você usa Unity), e é bem simples, pode ser útil pra qualquer um, sem exagero.

-Singleton

De acordo com o Google Images, a definição de Singleton é:

Me vê 2 shot de Singleton por favor...

No entanto, em programação, a definição é um pouco diferente. Eu já li definições de Singleton que fazem com que você tenha medo de saber o que isso é de verdade... mas resumidamente é a coisa mais simples do mundo: É um código que garante que só exista UM objeto de sua classe e é facilmente acessível justamente por ser único.

Por exemplo... vamos supor um Tower Defense. Em um jogo desse tipo (e MUITOS outros tipos) você provavelmente vai ter uma classe que seja WaveHandler ou qualquer coisa do tipo, enfim, UM ÚNICO objeto (instancia da classe) que é responsável por controlar o spawn dos inimigos, por wave, por tempo, por seja la o que for. Essa classe mede quantos monstros estão vivos, quantos faltam pra wave acabar, cria os inimigos... enfim, esse cara sozinho eh quem manda no sistema de spawn. Então, usando um código bem simples, essa classe seria +- isso:

Um código bem tosco, não use isso como exemplo pra fazer o seu código de spawn =P
Se eu jogar esse código em um GameObject vazio, indicar pra ele qual o prefab, qual o ponto de spawn, quando eu der Play imediatamente ele vai criar 30 copias do prefab no ponto de spawn. Ai, minhas torres overpower vão matar os 30 bichos e é bem fácil saber o que vai acontecer depois.... absolutamente nada. A cada bicho morto, eu não to avisando pra minha classe WaveHandler que um bicho morreu (inimigosVivos - 1), então a checagem no update nunca vai dar 0. Pra minha classe ficar sabendo quando um inimigo morreu...você pode fazer de várias formas... criar um Array, colocar os inimigos nele e ficar vendo se eles ainda estão vivos... ou criar uma referencia a essa classe dentro de cada inimigo pra quando eles morrerem eles mesmos dizerem inimigosVivos --... pode criar uma classe estática que mantem controle dos inimigos vivos (é o que eu fazia até então)... OU, você pode simplesmente tornar sua classe um Singleton!

Pra isso, o código ficaria assim:

A implementação que eu mais gosto. Existem outros métodos de fazer um Singleton, mas esse é o mais simples.

Mas o que esse pedaço de código faz na prática? É muito simples... agora, de qualquer outro script do jogo, qualquer um, eu posso escrever isso aqui:


Entenderam a mágica? Agora eu não preciso de um array com todos os bichos pra ficar vendo se alguém morreu... não preciso de outra classe... não preciso criar uma referencia... arrastar no inspetor... basta eu dizer WaveHandler.Instance.qquerCoisaQueEuQuiser e eu estarei acessando o meu script WaveHandler, e a única coisa que eu preciso garantir é que esse script só exista UMA VEZ na cena.

E é basicamente isso! Esse é um tutorialzinho bem básico, assim que eu tiver um tempo de novo vou fazer um tutorial falando de Delegates e Eventos e como eles podem facilitar sua vida.

Espero que seja útil pra alguém, e qualquer dúvida deixa um comentário ou manda um e-mail pra gente!
Abraços,

quarta-feira, 3 de abril de 2013

Colhendo a Plantacao

E ae pessoal, tudo bem?

Mais de um mês se passou do nosso ultimo post, que por sinal foi numa data muito especial pra gente aqui da Fire Horse, quando completamos 1 ano de vida.

Hoje, depois de ver o comentário do sr Jose naquele post (na verdade eu vi no dia que ele comentou, comecei a escrever naquele dia... mas só estou terminando hoje =P) me senti inspirado pra voltar aqui e dar noticias de vida sobre como andam as coisas, e ainda na mesma linha do post de 1 ano, achei que seria legal fazer uma comparação de como as coisas tem sido pra gente agora, e como foram 1 ano atras, acho que estamos finalmente colhendo o que plantamos.

A verdade eh que a completa ausência aqui do blog tem um motivo: nos estamos atolados de trabalho.

Na realidade as pastas estão no Dropbox, mas é quase isso
O ano passado foi um ano como nenhum outro em nossas vidas. A gente nunca esperou que ia ganhar alguma coisa assim, no nosso primeiro ano, na verdade a gente nem sabia se conseguiria criar um jogo que realmente rodasse em celulares, enfim... foi muito melhor do que esperávamos.

No entanto, financeiramente falando... não foi um ano fácil  Nosso custo de trabalho nesse período, sem empresa formalizada, sem nenhum custo fixo... foi realmente muito baixo, mas alimentação, transporte... enfim, vida, tem um custo de toda forma, e apesar de alguns prêmios, tudo foi gasto ou para pagar dividas ou adquirir novas dívidas (como comprar Unity). Resumidamente, fechamos o ano no negativo (financeiro pelo menos).

Mas, todo o trabalho definitivamente não foi em vão, e com certeza valeu nosso esforço. Deixamos de ser apenas 3 muleques que acabaram de se formar, pra ser alguém que já mostrou que consegue fazer um jogo, não que sejam jogos do outro mundo, mas jogos que funcionam, que tem mais valor do que palavras... e graças a principalmente Knights Trial e Commander Flag, hoje estamos trabalhando em 3 projetos simultaneamente, e melhor, recebendo pra trabalhar neles!

Não estamos nadando em grana, na verdade se você precisar de um jogo barato, entra em contato com a gente que tamo quase de graça hahaha, infelizmente não posso falar de nenhum dos três projetos aqui por preferências dos clientes, mas o que posso dizer é que são projetos muito legais, dois deles são jogos de verdade enquanto o outro é mais burocrático (inclusive, precisamos de gente que manje de Construct 2 para este burocrático, é chatinho mas paga bem, se tiver interesse contact@firehorse.com.br). Parece até mentira mas eu finalmente posso dizer que estou vivendo de fazer jogo, e não pagando pra fazer jogo!

Enfim, esse post não é la muito informativo, mas os projetos devem terminar entre o começo e o fim de Maio e quando estiverem prontos podem ter certeza que vamos postar uma porrada de coisa sobre eles, sobre o processo... enfim, de verdade, só de ver o resultado, no ponto em que eles estão hoje, comparando com nossos jogos anteriores... é impressionante o quanto melhoramos de lá pra cá, nada realmente ensina mais do que praticar... e eu espero poder continuar fazendo jogos por muitos e muitos anos, quem sabe um dia a gente ta bom o suficiente pra fazer um jogo que presta? =P

Só pra terminar queria agradecer ao pessoal que teve saco de ler nosso blog, nossos posts, e muito muito feliz mesmo de ver que o pessoal curte nosso trabalho, espero num futuro próximo ter muito mais coisa pra mostrar, e também ver o trabalho desse pessoal que comentou por aqui. Curtam nossa página no facebook e assim que tiver mais o que dizer sobre os projetos a gente avisa por la sobre novo conteúdo por aqui!

Grande abraço,