Unity3D中的单例类

本文是我在Unity蛮牛上发的一个帖子,现在转到自己的博客上来。

这篇是我在逛国外论坛的时候看到的一篇讨论,内容的质量还不错,正好我在Unity蛮牛做翻译版块的版主,所以我就大概翻译了一下放到论坛里供大家一起学习讨论。

我们在做开发的时候,常常会一些类的变量进行访问和管理,有位程序猿就问:“在Unity3D中,有没有什么方法可以创建一个可以全局访问的单例管理类啊?然后这个类不需要我随时把它挂在场景中!”

然后有位技术大大就解答说:“这要看具体情况了,在Unity3D中一般有两种单例类!”

1、继承自MonoBehaviour,作为组件挂在GameObject身上。

2、不继承MonoBehaviour,作为一个单独的类。

下面是代码:

public class MainComponentManger {
private static MainComponentManger instance;
public static void CreateInstance () {
    if (instance == null) {
        instance = new MainComponentManger ();
        GameObject go = GameObject.Find ("Main");
        if (go == null) {
            go = new GameObject ("Main");
            instance.main = go;
            // important: make game object persistent:
            Object.DontDestroyOnLoad (go);
        }
        // trigger instantiation of other singletons
        Component c = MenuManager.SharedInstance;
        // ...
    }
}

GameObject main;

public static MainComponentManger SharedInstance {
    get {
        if (instance == null) {
            CreateInstance ();
        }
        return instance;
    }
}

public static T AddMainComponent <T> () where T : UnityEngine.Component {
    T t = SharedInstance.main.GetComponent<T> ();
    if (t != null) {
        return t;
    }
    return SharedInstance.main.AddComponent <T> ();
}

这个类主要由两部分组成:一个是用于创建单例的静态方法CreatInstance(),还有一个是用于挂载组件类的GameObject,main物体。

使用范例:

public class AudioManager : MonoBehaviour {
private static AudioManager instance = null;
public static AudioManager SharedInstance {
    get {
        if (instance == null) {
            instance = MainComponentManger.AddMainComponent<AudioManager> ();
        }
        return instance;
    }
}

本来故事就到此为止了,于是本着分享的精神,我把我们之前技术中写过的一个单例类也拿出来分享给大家。

public class Singleton<T> : MonoBehaviour
where T : Component
{
    private static T instance;
    public static T Instance
    {
        get
        {
            if (instance == null)
            {
                instance = FindObjectOfType(typeof(T)) as T;
                if (instance == null)
                {
                    GameObject obj = new GameObject();
                    DontDestroyOnLoad(obj);
                    obj.hideFlags = HideFlags.HideInHierarchy;
                    instance = obj.AddComponent<T>();
                }
            }
            return instance;
        }
    }
}

使用起来也很简单,下面是个例子:

Singleton<MonoBehaviour>.Instance.StartCoroutine(routine);

OK!这样就可以啦!有什么错误欢迎指出或者大家有什么好的建议也可以一起分享出来!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值