Vi vários vídeos e tutoriais para criar objetos singleton no Unity, principalmente para um GameManager
, que parecem usar abordagens diferentes para instanciar e validar um singleton.
Existe uma abordagem correta, ou melhor, preferida para isso?
Os dois exemplos principais que encontrei são:
Primeiro
public class GameManager
{
private static GameManager _instance;
public static GameManager Instance
{
get
{
if(_instance == null)
{
_instance = GameObject.FindObjectOfType<GameManager>();
}
return _instance;
}
}
void Awake()
{
DontDestroyOnLoad(gameObject);
}
}
Segundo
public class GameManager
{
private static GameManager _instance;
public static GameManager Instance
{
get
{
if(_instance == null)
{
instance = new GameObject("Game Manager");
instance.AddComponent<GameManager>();
}
return _instance;
}
}
void Awake()
{
_instance = this;
}
}
A principal diferença que posso ver entre os dois é:
A primeira abordagem tentará navegar na pilha de objetos do jogo para encontrar uma instância da GameManager
qual, mesmo que isso só aconteça (ou só aconteça), uma vez parece que pode ser muito não otimizado à medida que as cenas aumentam de tamanho durante o desenvolvimento.
Além disso, a primeira abordagem marca o objeto a não ser excluído quando o aplicativo muda de cena, o que garante que o objeto persista entre as cenas. A segunda abordagem não parece aderir a isso.
A segunda abordagem parece estranha, pois no caso em que a instância é nula no getter, ela cria um novo GameObject e atribui um componente GameManger a ele. No entanto, isso não pode ser executado sem que o componente GameManager já esteja anexado a um objeto na cena, então isso está me causando alguma confusão.
Existem outras abordagens recomendadas ou um híbrido dos dois acima? Existem muitos vídeos e tutoriais sobre singletons, mas todos diferem tanto que é difícil fazer comparações entre os dois e, portanto, uma conclusão sobre qual é a melhor / preferida abordagem.
GameManager
deve fazer, mas de como garantir que exista apenas uma instância do objeto e a melhor maneira de aplicá-lo.