Il Singleton Pattern è un pattern di progettazione che garantisce l’esistenza di una sola istanza di una classe e fornisce un punto di accesso globale a essa. Serve quando un sistema deve essere unico per tutta l’applicazione, come un gestore di audio, input o stato di gioco.
In Unity è spesso usato per manager globali che devono essere accessibili da qualunque script senza passare riferimenti. Il singleton semplifica l’architettura perché riduce le dipendenze esplicite tra oggetti ma va usato con attenzione perché può creare accoppiamento forte e dipendenze nascoste.
public class MySingleton<T> : MonoBehaviour where T : Component
{
protected static T _instance;
public static bool HasInstance => _instance != null;
public static T TryGetInstance() => HasInstance ? _instance : null;
public static T SharedInstance
{
get
{
if (_instance == null)
{
_instance = FindAnyObjectByType<T>();
if (_instance == null)
{
GameObject obj = new GameObject();
obj.name = typeof(T).Name + "_AutoCreated";
_instance = obj.AddComponent<T>();
}
}
return _instance;
}
}
protected virtual void Awake()
{
if (!Application.isPlaying)
{
return;
}
if (_instance != null && _instance != this)
{
Destroy(gameObject);
return;
}
_instance = this as T;
}
protected virtual void OnDestroy()
{
if (_instance == this)
_instance = null;
}
}

