前言:之前我总结过很多次的单例的写法,并且在另外一个论坛上些发表过文章,这里我就把之前写的重新总结一下(其实就是搬运)
单例有很多种写法,有比较粗暴的,也有稍许复杂一点的,在我开发和学习的过程中,我总结了3种情况下的单例的写法和用法。
一、不继承Monobehaviour的单例
这种单例是不挂载到GameObject上的,下面是详细的代码:
public abstract class Singleton<T> where T : class, new()
{
private static T _instance = null;
public static T Instance
{
get
{
if (_instance == null)
{
_instance = new T();
}
return _instance;
}
}
}
二、继承Monobehaviour的单例
这种单例是需要挂载到GameObject上的,下面是详细的代码:
using UnityEngine;
public abstract class MonoSingleton<T> : MonoBehaviour where T : MonoSingleton<T>
{
private static T _instance = null;
public static T Instance
{
get
{
if (_instance == null)
{
_instance = GameObject.FindObjectOfType(typeof(T)) as T;
}
return _instance;
}
}
}
三、继承Monobehaviour,并且不随场景的切换而销毁的单例
这种单例是必须挂载到GameObject上的,并且呢它不会随着场景的切换而销毁的,详细的代码如下:
using UnityEngine;
public class DontDesSingleton<T> : MonoBehaviour where T : DontDesSingleton<T>
{
private static T _instance = null;
public static T Instance
{
get
{
if (_instance == null)
{
GameObject obj = GameObject.Find("DontDestroy");
if (obj == null)
{
obj = new GameObject("DontDestroy");
DontDestroyOnLoad(obj);
}
_instance = obj.GetComponent<T>();
if (_instance == null)
{
_instance = obj.AddComponent<T>();
}
}
return _instance;
}
}
}
四、使用方法
1.创建脚本 UseSingleton.cs,代码如下:
using UnityEngine;
public class UseSingleton : Singleton<UseSingleton>
{
public void TestMethod()
{
Debug.Log("测试使用UseSingleton.TestMethod()方法");
}
}
2.创建脚本 UseMonoSingleton.cs,并且在Hierarchy中创建空物体,并改名为“TestMonoSingleton”,将脚本UseMonoSingleton.cs挂载到TestMonoSingleton物体上,代码如下:
using UnityEngine;
public class UseMonoSingleton : MonoSingleton<UseMonoSingleton>
{
public void TestMethod()
{
Debug.Log("测试使用UseMonoSingleton.TestMethod()方法!");
}
}
3.创建脚本 UseDontDesSingletonAA.cs,代码如下:
public class UseDontDesSingletonAA : DontDesSingleton<UseDontDesSingletonAA>
{
public void TestMethod()
{
Debug.Log("UseDontDesSingletonAA.TestMethod()");
}
}
4.创建一个脚本ScenesCtrl.cs,该脚本需要挂载到主摄像机中,代码如下:
using UnityEngine;
public class ScenesCtrl : MonoBehaviour
{
private void Update()
{
if (Input.GetMouseButtonUp(0))
{
UseSingleton.Instance.TestMethod();
UseMonoSingleton.Instance.TestMethod();
}
if (Input.GetKeyUp(KeyCode.A))
{
UseDontDesSingletonAA.Instance.TestMethod();
}
if (Input.GetKeyUp(KeyCode.B))
{
UseDontDesSingletonBB.Instance.TestMethod();
}
if (Input.GetKeyUp(KeyCode.C))
{
UseDontDesSingletonCC.Instance.TestMethod();
}
}
}
5.最终运行的结果图如下面所示: