Unity3D中的单例类
2015-08-21 14:43
387 查看
本文是我在Unity蛮牛上发的一个帖子,现在转到自己的博客上来。
这篇是我在逛国外论坛的时候看到的一篇讨论,内容的质量还不错,正好我在Unity蛮牛做翻译版块的版主,所以我就大概翻译了一下放到论坛里供大家一起学习讨论。
我们在做开发的时候,常常会一些类的变量进行访问和管理,有位程序猿就问:“在Unity3D中,有没有什么方法可以创建一个可以全局访问的单例管理类啊?然后这个类不需要我随时把它挂在场景中!”
然后有位技术大大就解答说:“这要看具体情况了,在Unity3D中一般有两种单例类!”
1、继承自MonoBehaviour,作为组件挂在GameObject身上。
2、不继承MonoBehaviour,作为一个单独的类。
下面是代码:
这个类主要由两部分组成:一个是用于创建单例的静态方法CreatInstance(),还有一个是用于挂载组件类的GameObject,main物体。
使用范例:
本来故事就到此为止了,于是本着分享的精神,我把我们之前技术中写过的一个单例类也拿出来分享给大家。
使用起来也很简单,下面是个例子:
OK!这样就可以啦!有什么错误欢迎指出或者大家有什么好的建议也可以一起分享出来!
这篇是我在逛国外论坛的时候看到的一篇讨论,内容的质量还不错,正好我在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!这样就可以啦!有什么错误欢迎指出或者大家有什么好的建议也可以一起分享出来!
相关文章推荐
- Unity3D动作类游戏中两种相机抖动
- Unity3D中Layers和LayerMask解析
- Unity3D中人物角色被攻击变色,死亡渐隐消失,墙后显示的Shader
- Unity3d NGUI Button 简单地动态修改颜色
- Unity3D NGUI事件 UIEvents
- 使用Unity3D的50个技巧:Unity3D最佳实践
- unity3d编辑器界面扩展,编辑状态下显示选择对象的所有脚本组件代码内容
- C# Memory Management for Unity Developers
- UNITY EDITOR EXTENSIONS – MENU ITEMS[详]
- Unity中uGUI的控件事件穿透逻辑
- Unity Asset(5)iTween
- Unity3D开发——LeRunning角色选择界面制作
- Unity3D脚本自动添加tag和Layer
- unity播放音效(一)
- unity, iOS下画面错乱解法
- [Unity]Unity开发NGUI代码实现ScrollView(放大视图)
- IOS与Unity交互
- 在 Unity3d 中使用 GLSL
- unity摄像机投影
- unity换装,SkinnedMeshRender