Skip to content

Instantly share code, notes, and snippets.

@twobob
Forked from mstevenson/MonoBehaviourSingleton.cs
Created April 15, 2017 03:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save twobob/f575ca6dbb9b6f1568d8702c5f151ba9 to your computer and use it in GitHub Desktop.
Save twobob/f575ca6dbb9b6f1568d8702c5f151ba9 to your computer and use it in GitHub Desktop.
Generic Singleton classes for Unity. Use MonoBehaviourSingletonPersistent for any singleton that must survive a level load.
using UnityEngine;
using System.Collections;
public class MonoBehaviourSingleton<T> : MonoBehaviour
where T : Component
{
private static T _instance;
public static T Instance {
get {
if (_instance == null) {
var objs = FindObjectsOfType (typeof(T)) as T[];
if (objs.Length > 0)
_instance = objs[0];
if (objs.Length > 1) {
Debug.LogError ("There is more than one " + typeof(T).Name + " in the scene.");
}
if (_instance == null) {
GameObject obj = new GameObject ();
obj.hideFlags = HideFlags.HideAndDontSave;
_instance = obj.AddComponent<T> ();
}
}
return _instance;
}
}
}
public class MonoBehaviourSingletonPersistent<T> : MonoBehaviour
where T : Component
{
public static T Instance { get; private set; }
public virtual void Awake ()
{
if (Instance == null) {
Instance = this as T;
DontDestroyOnLoad (this);
} else {
Destroy (gameObject);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment