93 lines
1.9 KiB
C#
93 lines
1.9 KiB
C#
using System;
|
|
using UnityEngine;
|
|
|
|
public class MonoSingleton<T> : MonoBehaviour where T : Component
|
|
{
|
|
private static T _instance;
|
|
|
|
public static T Instance
|
|
{
|
|
get
|
|
{
|
|
if (_instance == null)
|
|
{
|
|
CreateInstance();
|
|
}
|
|
return _instance;
|
|
}
|
|
}
|
|
|
|
private static void CreateInstance()
|
|
{
|
|
Type theType = typeof(T);
|
|
|
|
_instance = (T)FindObjectOfType(theType);
|
|
|
|
if (_instance == null)
|
|
{
|
|
var go = new GameObject(typeof(T).Name);
|
|
_instance = go.AddComponent<T>();
|
|
|
|
GameObject rootObj = GameObject.Find("TapSDKSingletons");
|
|
if (rootObj == null)
|
|
{
|
|
rootObj = new GameObject("TapSDKSingletons");
|
|
DontDestroyOnLoad(rootObj);
|
|
}
|
|
go.transform.SetParent(rootObj.transform);
|
|
}
|
|
}
|
|
|
|
public static void DestroyInstance()
|
|
{
|
|
if (_instance != null)
|
|
{
|
|
Destroy(_instance.gameObject);
|
|
}
|
|
}
|
|
|
|
public static bool HasInstance()
|
|
{
|
|
return _instance != null;
|
|
}
|
|
|
|
protected virtual void Awake()
|
|
{
|
|
if (_instance != null && _instance.gameObject != gameObject)
|
|
{
|
|
if (Application.isPlaying)
|
|
{
|
|
Destroy(gameObject);
|
|
}
|
|
else
|
|
{
|
|
DestroyImmediate(gameObject); // UNITY_EDITOR
|
|
}
|
|
return;
|
|
}
|
|
else if (_instance == null)
|
|
{
|
|
_instance = GetComponent<T>();
|
|
}
|
|
|
|
DontDestroyOnLoad(gameObject);
|
|
|
|
Init();
|
|
}
|
|
|
|
protected virtual void OnDestroy()
|
|
{
|
|
Uninit();
|
|
|
|
if (_instance != null && _instance.gameObject == gameObject)
|
|
{
|
|
_instance = null;
|
|
}
|
|
}
|
|
|
|
protected virtual void Init() {}
|
|
|
|
public virtual void Uninit() {}
|
|
|
|
}
|