Ho visto diversi video ed esercitazioni per la creazione di oggetti singleton in Unity, principalmente per a GameManager
, che sembrano utilizzare approcci diversi per istanziare e convalidare un singleton.
Esiste un approccio corretto, o meglio, preferito a questo?
I due esempi principali che ho riscontrato sono:
Primo
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);
}
}
Secondo
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;
}
}
La differenza principale che posso vedere tra i due è:
Il primo approccio proverà a navigare nello stack degli oggetti di gioco per trovare un'istanza della GameManager
quale, anche se ciò accade (o dovrebbe accadere solo) una volta sembra che potrebbe essere molto non ottimizzato mentre le scene aumentano di dimensioni durante lo sviluppo.
Inoltre, il primo approccio indica che l'oggetto non deve essere eliminato quando l'applicazione cambia scena, il che assicura che l'oggetto sia persistente tra le scene. Il secondo approccio non sembra aderire a questo.
Il secondo approccio sembra strano come nel caso in cui l'istanza sia nulla nel getter, creerà un nuovo GameObject e gli assegnerà un componente GameManger. Tuttavia, questo non può essere eseguito senza prima avere questo componente GameManager già collegato a un oggetto nella scena, quindi questo mi sta creando confusione.
Ci sono altri approcci che potrebbero essere raccomandati o un ibrido dei due precedenti? Ci sono molti video e tutorial riguardanti i singoli, ma differiscono tutti così tanto che è difficile trarre un confronto tra i due e quindi una conclusione su quale sia l'approccio migliore / preferito.
GameManager
dovrebbe fare, piuttosto come garantire che ci sia sempre e solo un'istanza dell'oggetto e il modo migliore per applicarlo.