Estudar, entender e saber como e quando usar os Design Patrerns, é fundamental para todos os programadores.
Afinal todos tem os seus pros e contras, e é fundamental usar com sabedoria cada Pattern disponível.
E o Singleton é um Pattern fácil de implementar, mas que pode trazer grandes problemas, se mal utilizado.
O que é um Singleton?
Em jogos é comum, termos diversos scripts nos objetos, e muitos responsáveis por determinadas funções.
E ao precisarmos acessar outro script, no próprio objeto, ou algum outro em cena, precisamos referencia-lo.
E é aí que entra a facilidade de um Singleton, pois, você referencia essa classe apenas uma vez.
E consegue acesso a ela de qualquer outro script, apenas chamando essa classe, e acessando as funções presentes nela.
Mas, é preciso usar quando realmente for necessário, por isso, essas classes são comuns em controladores.
Pois, normalmente esses Game Objects gerenciam vários dados do jogo, e precisam ser acessados a todo instante.
E isso casa perfeitamente com a ideia de Singleton, gerenciando assim dados que vários outros objetos precisam manipular.
Quais as vantagens?
Além da sua fácil implementação, um Singleton torna uma classe muito mais fácil de ser acessada.
E nela podemos armazenar dados como valores de moeda, UIs do jogo, sistema de sons, sistema de Save, etc.
Ou seja, qualquer lógica de jogo ou dado que precisa ser amplamente usado, pode estar em uma classe Singleton.
Por exemplo, você cria um sistema de dia e noite em seu game, e terão eventos diferentes com base nisso.
E então alguns inimigos aparecem de dia e outros apenas a noite, ou seja, diversos objetos precisam destas informações.
Você poderia guardar os dados se é dia ou noite em um Singleton e facilitar o acesso dessas informações a todos.
E inclusive tendo a possibilidade de levar esses dados para outras cenas, em resumo, essas informações estariam centralizadas.
Enfim, um Singleton é bastante eficiente para centralizar, armazenar e gerenciar dados e funções dos games.
Quais as desvantagens?
Apesar da fácil implementação, um Singleton deve ser usado em pouquíssimas ocasiões, e quando realmente necessário.
Pois, ele pode trazer diversos problemas para seu jogo, então esquece a ideia de transformar todos os scripts em Singleton.
Porque só pode ter uma instância dessa classe, por exemplo, só um inimigo poderia ter um script “Inimigo”, se for Singleton.
E um problema comum, é quando usamos um comando que impede que o script seja destruído nas transições de cena.
Então, corre o risco de se criar diversos scripts duplicados de um Singleton, e o sistema não sabe qual deles acessar.
Outro problema é que por ser uma classe de fácil acesso, seus dados também podem ser facilmente alterados.
E assim qualquer script que dependa dessas informações, corre grandes riscos de bugar, por diversas incompatibilidades.
E dificulta também na hora de encontrar bugs, pois, essa classe pode estar sendo chamada literalmente de qualquer lugar.
Em resumo, é necessário de fato saber quando usar e como implementar da forma correta esse Pattern.
Como implementar um Singleton?
Agora que você está ciente das vantagens e desvantagens desse Pattern, podemos implementar.
E primeiro você precisa declarar uma variável public e static do mesmo tipo da classe, e nomeá-la de instance.
Porém, o nome dessa variável pode ser outro também, de preferência o nome da classe por organização.
E então podemos declarar ela no Awake de preferência, que é uma função chamada antes de qualquer Start.
E assim evitaremos erros de referência, onde um outro script tenta acessar essa classe antes de ela ser referenciada.
E então verificamos se está variável é nula, e se é diferente dela mesma (não tenha um instance já declarado).
Pois, essas verificações vão checar se já existe um Singleton dessa classe em cena, e destruir caso exista.
E só depois de garantir que não há duplicatas, referenciarmos a variável, prevenindo assim de vários bugs.
E para acessar basta digitar o nome da classe, acessar o Instance ou o nome que deu a variável.
E com isso terá acesso a todas as variáveis e funções públicas dessa classe, de qualquer outro script.
Bom esperamos que tenha ficado tudo mais claro sobre esse Pattern, suas vantagens e desvantagens.
E é muito importante sempre buscar entender e aprender mais sobre o funcionamento dos Design Patterns.
Pois, todos tem suas vantagens, mas podem também ser vilões, caso sejam mal implementados.
Seja o primeiro a comentar.