您的位置:首页 > 移动开发 > Unity3D

Unity3D中的单例类

2015-08-21 14:43 387 查看
本文是我在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!这样就可以啦!有什么错误欢迎指出或者大家有什么好的建议也可以一起分享出来!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: