- 最后登录
- 2019-12-2
- 注册时间
- 2012-8-25
- 阅读权限
- 90
- 积分
- 34660
- 纳金币
- 38268
- 精华
- 111
|
整理自己的东西的时候发现看了不少项目里面的都会用到单例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对象作为子对象添加进去。
|
|