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,