J'ai vu plusieurs vidéos et tutoriels pour la création d'objets singleton dans Unity, principalement pour un GameManager
, qui semblent utiliser différentes approches pour instancier et valider un singleton.
Existe-t-il une approche correcte, ou plutôt préférée, à cet égard?
Les deux principaux exemples que j'ai rencontrés sont:
Première
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);
}
}
Seconde
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 principale différence que je peux voir entre les deux est la suivante:
La première approche tentera de naviguer dans la pile d’objets du jeu pour trouver une instance de ce GameManager
qui, bien que cela ne se produise (ou ne devrait se produire), semble une fois que cela pourrait être très non optimisé à mesure que la taille des scènes augmente au cours du développement.
En outre, la première approche marque que l’objet ne doit pas être supprimé lorsque l’application change de scène, ce qui garantit la persistance de cet objet entre les scènes. La deuxième approche ne semble pas adhérer à cela.
La deuxième approche semble étrange car dans le cas où l'instance est nulle dans le getter, elle créera un nouveau GameObject et lui affectera un composant GameManger. Cependant, cela ne peut pas s'exécuter sans que ce composant GameManager soit déjà attaché à un objet de la scène, ce qui me confond.
Existe-t-il d'autres approches qui seraient recommandées, ou un hybride des deux ci-dessus? Il existe de nombreuses vidéos et tutoriels sur les singletons, mais ils diffèrent tous tellement qu'il est difficile d'établir des comparaisons entre les deux et donc de déterminer laquelle est la meilleure approche / la meilleure approche.
GameManager
faire, mais plutôt de s’assurer qu’il n’existe qu’une seule instance de l’objet et le meilleur moyen de le faire respecter.