// allows all non-static instances to access the same static instance
public class NonStaticClass : MonoBehaviour {
private static NonStaticClass staticInstance;
}
void Awake()
{
if (instance == null)
instance = this;
else if (instance != this)
Destroy(gameObject);
}
public class SomeClass : MonoBehaviour {
private static SomeClass _instance;
public static SomeClass Instance { get { return _instance; } }
private void Awake()
{
if (_instance != null && _instance != this)
{
Destroy(this.gameObject);
} else {
_instance = this;
DontDestroyOnLoad(gameObject);
}
}
}
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public abstract class Singleton<T> : MonoBehaviour where T : Singleton<T>
{
#region Variables
protected static bool Quitting { get; private set; }
private static readonly object Lock = new object();
private static Dictionary<System.Type, Singleton<T>> _instances;
public static T Instance
{
get
{
if (Quitting)
{
return null;
}
lock (Lock)
{
if (_instances == null)
_instances = new Dictionary<System.Type, Singleton<T>>();
if (_instances.ContainsKey(typeof(T)))
return (T)_instances[typeof(T)];
else
return null;
}
}
}
#endregion
#region Methods
private void OnEnable()
{
if (!Quitting)
{
bool iAmSingleton = false;
lock (Lock)
{
if (_instances == null)
_instances = new Dictionary<System.Type, Singleton<T>>();
if (_instances.ContainsKey(this.GetType()))
Destroy(this.gameObject);
else
{
iAmSingleton = true;
_instances.Add(this.GetType(), this);
DontDestroyOnLoad(gameObject);
}
}
if(iAmSingleton)
OnEnableCallback();
}
}
private void OnApplicationQuit()
{
Quitting = true;
OnApplicationQuitCallback();
}
protected abstract void OnApplicationQuitCallback();
protected abstract void OnEnableCallback();
#endregion
}
public class example : MonoBehaviour
{
public static example my_object { get; private set; } ;
float my_player_health=100;
private void Awake()
{
if (my_object != null && my_object != this)
{
Destroy(this);
} else {
my_object = this;
}
DontDestroyOnLoad(this.gameObject);
}
}