网演高层钦州
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

78 lines
2.6 KiB

using UnityEngine;
/// <summary>
/// 继承MonoBehaviour,因为需要Coroutines.
/// </summary>
public class Singleton<T> : MonoBehaviour where T : MonoBehaviour
{
//静态私有字段
private static T _instance;
//静态锁
private static object _lock = new object();
//静态公共属性
public static T Instance
{
//获取对象
get
{
//对象是单例的,程序运行期间只会创建一次,销毁后就不存在了。
if (applicationIsQuitting)
{
Debug.LogWarning("[Singleton] Instance '" + typeof(T) +
"' 已经销毁." +
" 不需要再次创建.");
return null;
}
//加锁
lock (_lock)
{
if (_instance == null)
{
_instance = (T)FindObjectOfType(typeof(T));
if (FindObjectsOfType(typeof(T)).Length > 1)
{
Debug.LogError("[Singleton] 发生异常 " +
" - 单例类只能有1个" +
" 修复错误");
return _instance;
}
if (_instance == null)
{
GameObject singleton = new GameObject();
_instance = singleton.AddComponent<T>();
singleton.name = "(Singleton) " + typeof(T).ToString();
DontDestroyOnLoad(singleton);
Debug.LogWarning("[Singleton] " + typeof(T) +
" 不存在场景中 '" + singleton +
"' 已经通过 DontDestroyOnLoad 创建");
}
else
{
Debug.LogWarning("[Singleton] 已经创建: " +
_instance.gameObject.name);
}
}
//返回单例字段
return _instance;
}
}
}
//静态私有字段,判断开关
private static bool applicationIsQuitting = false;
/// <summary>
/// Unity退出的时候,销毁顺序是随机的.
/// 正常情况, 单例只会在程序退出后销毁.
/// 如果脚本调用实例时它已经被销毁,
/// 它将会创建一个对象停留在编辑器场景
/// 即使你停止播放器也不可以销毁它.
/// 这样会确保不会创建这种BUG
/// </summary>
public void OnDestroy()
{
applicationIsQuitting = true;
}
}