父类,基础MonoBehaviour,这样可以自由使用协程了
using UnityEngine;
using System.Collections;
public class Singleton<T> : MonoBehaviour where T : Singleton<T>
{
private static T _instance;
public static T GetInstance()
{
return _instance;
}
public void SetInstance(T t)
{
if(_instance ==null )
{
_instance = t;
}
}
public virtual void Init()
{
return;
}
public virtual void Release()
{
return;
}
}
using UnityEngine;
using System.Collections;
using System;
using System.Collections.Generic;
public class GameRoot : MonoBehaviour
{
private static GameObject _rootObj;
private static List<Action> _singletonReleaseList = new List<Action>();
public void Awake()
{
_rootObj = this.gameObject;
GameObject.DontDestroyOnLoad(_rootObj);
StartCoroutine(InitSingletons());
}
public void OnApplicationQuit()
{
for (int i = 0; i < _singletonReleaseList.Count - 1; i++)
{
_singletonReleaseList[i]();
}
}
private IEnumerator InitSingletons()
{
ClearCanvas();
yield return null;
}
private static void AddSingleton<T>() where T :Singleton <T>
{
if(_rootObj .GetComponent <T>()==null )
{
T t = _rootObj.AddComponent<T>();
t.SetInstance(t);
t.Init();
_singletonReleaseList.Add(delegate()
{
t.Release();
});
}
}
public static T GetSingleton<T>() where T:Singleton <T>
{
T t = _rootObj.GetComponent<T>();
if(t==null )
{
AddSingleton<T>();
}
return t;
}
public void ClearCanvas()
{
Transform canvas = GameObject.Find("Canvas").transform;
foreach (Transform panel in canvas )
{
GameObject.Destroy(panel.gameObject);
}
}
}