基于MonoBehavior的单例模式

适用于需要挂载到游戏物体上的脚本对象。 类似的,使用Awake函数在游戏运行开始时对单例进行初始化,挂载到游戏物体上的脚本对象生命周期与游戏对象一致,所以用饿汉式即可,实例化放到Awake中的原因是子类继承mono单例是会自动拥有Awake并执行完成实例,效果和放在变量进行初始化一样,注意如果mono单例对Awake进行重写必须要base.awake完成实例化,可以参考GameRoot的实现。

    public abstract class SingletonMono<T> : MonoBehaviour where T : SingletonMono<T>
    {
        public static T Instance;
      	private T(){}
        protected virtual void Awake()
        {
            if (Instance == null)
            {
                Instance = this as T;
            }
        }
    }