纳金网

标题: Unity 中使用Singleton [打印本页]

作者: 狂风大尉    时间: 2015-1-23 01:05
标题: Unity 中使用Singleton
整理自己的东西的时候发现看了不少项目里面的都会用到单例Singleton,然而都是一堆小伙伴一起开发一个项目,最后项目里面的Singleton也是各式各样的,所以在这里整理一下希望是有用的。在C#中Singleton的实现方式不少网上也都能找到。
          基于MonoBehaviour 的单例
public class TemplateSingleton : MonoBehaviour
{
          private static TemplateSingleton m_Instance;

          public static TemplateSingleton Instance
          {
                   get
                   {
                             if (m_Instance== null)
                             {
                                              m_Instance= new GameObject ("TemplateSingleton ").AddComponent<TemplateSingleton > ();
                             }

                             return m_Instance;
                  }
          }

          public void OnApplicationQuit ()
         {
                     m_Instance= null;
         }
}
看着项目里面分布着这样各种的相似的代码,而且不同的命名方式,还有些不同的实现方式心里就受不了(不知道是不是有点强迫症)。
          基于MonoBehaviour 的通用单例
          MonoSingleton   看到这个用Unity的同学就很容易知道这是什么,MonoBehaviour的单例实现。MonoSingleton就是为了解决项目里面各式各样的单例而存在的,至于来源是在插件EasyTouch中有实现。实现很简单,如果项目中没有使用到EasyTouch,也可以自己实现。以下贴出代码,感觉这里发代码不怎么合适啊

public abstract class MonoSingleton<T> : MonoBehaviour where T : MonoSingleton<T>{

private static T m_Instance = null;
   
public static T instance{
        get{
   if( m_Instance == null ){
             m_Instance = GameObject.FindObjectOfType(typeof(T)) as T;
                if( m_Instance == null ){
                    //这里可以看到生成的Singleton对象是在Hierarchy中以Singleton of 单例类名 形式存在的,单例过多会导致Hierarchy看着混乱,可以整理到一个对象下去
                    m_Instance = new GameObject("Singleton of " + typeof(T).ToString(), typeof(T)).GetComponent<T>();
                    //在创建的时候这种情况一般不会发生
                    if( m_Instance == null ) {
                        Debug.LogError("Problem during the creation of " + typeof(T).ToString());
                    }
                    m_Instance.Init();
      
                }
               
            }
            return m_Instance;
        }
    }
    private void Awake(){
   
        if( m_Instance == null ){
            m_Instance = this as T;
            m_Instance.Init();
        }
    }
    //该函数用来初始化一些数据
    public virtual void Init(){}

    //确保在程序退出时销毁实例。
    private void OnApplicationQuit(){
        m_Instance = null;
    }
}
         接下来就是MonoSingleton的使用了。游戏中一般网络,声音,操作杆之类的都是实现为Singleton。使用的时候只需要注意Init()用来完成初始化工作的就可以了。其他和MonoBehaviour 差别不大
public class RedPointManager : MonoSingleton< RedPointManager >
{
public int test= 0;
public override void Init(){ tes= 100;  }

// Update is called once per frame
void Update ()
{

}
}
这样看着是不是干净了很多,而且在Hierarchy视图中可以进行统一管理,方法就是在创建的时候创建一个根对象将所有Singleton对象作为子对象添加进去。


作者: KISS2015    时间: 2015-1-23 13:27
设计模式不是对时间长常,更新频繁的项目才用吗?
作者: tianhett    时间: 2015-1-23 22:37
感谢分享!!!!!!!!
作者: tangqizuse    时间: 2015-1-25 02:56
谢谢楼主分享




欢迎光临 纳金网 (http://go.narkii.com/club/) Powered by Discuz! X2.5