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
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; |
|
} |
|
} |