查看: 3835|回复: 3
打印 上一主题 下一主题

[其他] Unity 中使用Singleton

[复制链接]

2722

主题

42

听众

3万

积分

资深设计师

Rank: 7Rank: 7Rank: 7

纳金币
38268
精华
111

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2015-1-23 01:05:41 |只看该作者 |倒序浏览
整理自己的东西的时候发现看了不少项目里面的都会用到单例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对象作为子对象添加进去。

分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏1 支持支持0 反对反对0
回复

使用道具 举报

47

主题

2

听众

2810

积分

中级设计师

Rank: 5Rank: 5

纳金币
571
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

沙发
发表于 2015-1-23 13:27:00 |只看该作者
设计模式不是对时间长常,更新频繁的项目才用吗?
回复

使用道具 举报

100

主题

3

听众

7683

积分

高级设计师

Rank: 6Rank: 6

纳金币
2378
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

板凳
发表于 2015-1-23 22:37:56 |只看该作者
感谢分享!!!!!!!!
回复

使用道具 举报

0

主题

3

听众

2200

积分

中级设计师

Rank: 5Rank: 5

纳金币
0
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

地板
发表于 2015-1-25 02:56:08 |只看该作者
谢谢楼主分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2025-1-26 07:52 , Processed in 0.075465 second(s), 28 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部