[TUTORIAL] Singleton, A melhor forma de acessar a classe!
4 participantes
Página 1 de 1
[TUTORIAL] Singleton, A melhor forma de acessar a classe!
Bom pessoal, Andei muito assistindo vídeos de gringos e estudando sobre c#, desde então comecei a usar Singletons para facilitar a vida.
Bom, o Singleton vai ser util para classes controladoras, como por exemplo um GameController, um AudioController, e por aí vai. Caso queira saber mais sobre singletons leia aqui: https://msdn.microsoft.com/en-us/library/ff650316.aspx
Vamos ao tutorial explicando passo a passo do que deve ser feito. (É DE EXTREMA IMPORTÂNCIA QUE VOCE LEIA OS COMENTÁRIOS DENTRO DO CÓDIGO PARA ENTENDER O QUE ESTÁ ACONTECENDO!)
PASSO 1 - Criando a Instancia.
PASSO 2 - (Opcional, porém recomendado) - Criando uma forma de "Carregar" o Prefab para dentro da cena caso seja chamado.
Bom, este passo aqui serve para que voce evite de esquecer de colocar o PREFAB dentro da cena. Ele vai carregar o prefab caso você chame a instancia do GameControlle através de outro Classe, assim evitando erros.
Primeiramente, voce deve criar um GameObject em branco, colocar o script nele com o MESMO nome do script, depois, voce vai criar uma pasta chama Resources dentro da pasta Assets, e salvar o PREFAB que você criou do GameController lá dentro.
PASSO 2.1 - Melhorando o Script
PASSO 3 - Acessando o GameController em outra Classe.
Bom, o Singleton vai ser util para classes controladoras, como por exemplo um GameController, um AudioController, e por aí vai. Caso queira saber mais sobre singletons leia aqui: https://msdn.microsoft.com/en-us/library/ff650316.aspx
Vamos ao tutorial explicando passo a passo do que deve ser feito. (É DE EXTREMA IMPORTÂNCIA QUE VOCE LEIA OS COMENTÁRIOS DENTRO DO CÓDIGO PARA ENTENDER O QUE ESTÁ ACONTECENDO!)
PASSO 1 - Criando a Instancia.
- Código:
using UnityEngine;
using System.Collections;
public class GameController : MonoBehaviour {
// Vamos criar uma váriavel do TIPO "GameController" e usar o modificador "static".
// Para saber mais sobre o modificador "static": https://msdn.microsoft.com/pt-br/library/98f28cdx.aspx
private static GameControllerinstance;
// Vamos chamar o método "Awake", que é chamado antes do método "Start"
private void Awake()
{
// Iremos checar se a instancia é nula
if (instance == null)
{
// Se for, então, a instancia será a instancia desta classe.
// Para saber mais sobre "this": https://msdn.microsoft.com/pt-br/library/dk1507sz.aspx
instance = this;
// Vamos dizer para que não destrua esse OBJETO caso carreguemos outra cena
DontDestroyOnLoad(this);
}
else
{
// Agora, iremos checar se a INSTANCIA que criamos lá em cima não é igual a INSTANCIA desta CLASSE
// Pois, se tivermos 2 INSTANCIAS IGUAIS, iremos deletar esta instancia.
if (instance != this)
{
Debug.Log("INSTANCE ALREADY IN SCENE! LET'S DESTROY OURSELVES!");
Destroy(this.gameObject);
}
}
}
}
PASSO 2 - (Opcional, porém recomendado) - Criando uma forma de "Carregar" o Prefab para dentro da cena caso seja chamado.
Bom, este passo aqui serve para que voce evite de esquecer de colocar o PREFAB dentro da cena. Ele vai carregar o prefab caso você chame a instancia do GameControlle através de outro Classe, assim evitando erros.
Primeiramente, voce deve criar um GameObject em branco, colocar o script nele com o MESMO nome do script, depois, voce vai criar uma pasta chama Resources dentro da pasta Assets, e salvar o PREFAB que você criou do GameController lá dentro.
PASSO 2.1 - Melhorando o Script
- Código:
using UnityEngine;
using System.Collections;
public class UIController : MonoBehaviour {
// Vamos criar uma váriavel do TIPO "UIController" e usar o modificador "static".
// Para saber mais sobre o modificador "static": https://msdn.microsoft.com/pt-br/library/98f28cdx.aspx
private static UIController instance;
// Vamos criar um método Getter para ter acesso atraves de outras classes
// Para saber mais sobre Getters e Setters: https://msdn.microsoft.com/pt-br/library/w86s7x04.aspx
public static UIController Instance
{
get
{
// Vamos checar se a instancia esta nula, ou seja, sem nenhum valor atribuido a ela
if (instance == null)
{
// Vamos tentar procurar o objeto na cena, caso ache, a instancia vai receber o objeto, porem do tipo UIController
instance = GameObject.FindObjectOfType<UIController>();
// Caso eu não ache o GameObject na cena, entao vou ter que carregar este GameObject dos Assets...
if (instance == null)
{
// Vamos Criar um GameObject temporario para armazenar o Object instanciado
// Lembrando que, vou precisar fazer o cast do Object para GameObject
GameObject obj = (GameObject)Instantiate(Resources.Load("UIController"));
obj.name = "UIController";
// Agora, precisamos colocar dentro da instance a componente UIController.
// Pois não precisamos na realidade do GameObject, mas sim da componente UIController
instance = obj.GetComponent<UIController>();
}
// Agora vamos fazer com que o GameObject permaneça caso carregue outras cenas.
DontDestroyOnLoad(instance.gameObject);
}
return instance;
}
}
// Vamos chamar o método "Awake", que é chamado antes do método "Start"
private void Awake()
{
// Iremos checar se a instancia é nula
if (instance == null)
{
// Se for, então, a instancia será a instancia desta classe.
// Para saber mais sobre "this": https://msdn.microsoft.com/pt-br/library/dk1507sz.aspx
instance = this;
// Vamos dizer para que não destrua esse OBJETO caso carreguemos outra cena
DontDestroyOnLoad(this);
}
else
{
// Agora, iremos checar se a INSTANCIA que criamos lá em cima não é igual a INSTANCIA desta CLASSE
// Pois, se tivermos 2 INSTANCIAS IGUAIS, iremos deletar esta instancia.
if (instance != this)
{
Debug.Log("INSTANCE ALREADY IN SCENE! LET'S DESTROY OURSELVES!");
Destroy(this.gameObject);
}
}
}
// Método para Exemplificar o uso da Instancia
public void ResetGame()
{
}
}
PASSO 3 - Acessando o GameController em outra Classe.
- Código:
// Este passo é o mais simples, toda vez que desejar chamar um método, ou uma variavel de dentro do GameController
// Use a seguinte linha: (Lembrando, desde que quem voce for acessar seja publico)
GameController.Instance.ResetGame();
Weslley- Moderador
- PONTOS : 5727
REPUTAÇÃO : 744
Idade : 26
Áreas de atuação : Inversión, Desarrollo, Juegos e Web
Respeito as regras :
Re: [TUTORIAL] Singleton, A melhor forma de acessar a classe!
Dúvidas:
para fins de aprendizagem, copiei esses scripts em um projeto e estou tendo erro no script do passo 1, o erro está aparecendo em 'GameControllerinstance' e nas palavras 'instance.'
como corrijo isso?
outra coisa, a função public void ResetGame() esta vazia, mas dentro dela pode ser colocado qualquer coisa para depois ser chamada por GameController.Instance.ResetGame(); ?
para fins de aprendizagem, copiei esses scripts em um projeto e estou tendo erro no script do passo 1, o erro está aparecendo em 'GameControllerinstance' e nas palavras 'instance.'
como corrijo isso?
outra coisa, a função public void ResetGame() esta vazia, mas dentro dela pode ser colocado qualquer coisa para depois ser chamada por GameController.Instance.ResetGame(); ?
Flávio- MembroAvançado
- PONTOS : 2831
REPUTAÇÃO : 29
Áreas de atuação : Aprendizagem em:
Programação C#;
Pixelart
Respeito as regras :
Re: [TUTORIAL] Singleton, A melhor forma de acessar a classe!
ok fiz a correção, é porque GameController e instance estão juntos.
Flávio- MembroAvançado
- PONTOS : 2831
REPUTAÇÃO : 29
Áreas de atuação : Aprendizagem em:
Programação C#;
Pixelart
Respeito as regras :
Re: [TUTORIAL] Singleton, A melhor forma de acessar a classe!
Eu Faço Desse Jeito:
Porem Não é recomendado Caso Utilize MultiThreading.
Exemplo de Uso:
Porem Não é recomendado Caso Utilize MultiThreading.
- Código:
public class ClasseSingleton : MonoBehaviour
{
private static ClasseSingleton UnicaInstancia;
private byte ValorTeste = 0;
//Construtor privado
private ClasseSingleton() { }
private void Awake()
{
if (UnicaInstancia == null)
UnicaInstancia = this;
else if (UnicaInstancia != this)
Destroy(gameObject.GetComponent(UnicaInstancia.GetType()));
}
public static ClasseSingleton Instancia()
{
return UnicaInstancia;
}
}
Exemplo de Uso:
- Código:
public class ClasseTeste : MonoBehaviour
{
ClasseSingleton.Instancia().ValorTeste = 1;
}
Magnatah- Instrutor
- PONTOS : 3548
REPUTAÇÃO : 209
Idade : 24
Áreas de atuação : Dєรєиvσlvєdσя Wєb(Fяσит-єиd), Blєиdєя, υиiтy, C#, ρнρ є Jαvαรcяiρт.
Respeito as regras :
Tópicos semelhantes
» Feixe de luz - melhor forma de fazer
» Melhor forma de modelar um personagem
» Unity - Erro ao Acessar Classe de Objeto
» puzzle, qual a melhor forma de fazer este ?
» [TUTORIAL] Variável de Instancia [ CLASSE ]
» Melhor forma de modelar um personagem
» Unity - Erro ao Acessar Classe de Objeto
» puzzle, qual a melhor forma de fazer este ?
» [TUTORIAL] Variável de Instancia [ CLASSE ]
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos