继续搞单例模式 在实战中体会了一下单例模式
唉 还是搞不懂 虽然知道了怎么写 但在哪用还是很模糊 等以后写多了就好了吧
回顾一下,单例模式的定义是:保证一个类只有一个实例,并且提供一个访问它的全局访问点。单例对象的类必须保证只有一个实例存在。在我们的场景中,全局脚本的对象只会创建一次,保证单例,然后它(全局单例类)提供给各个脚本访问单例对象的方法,并且所有其他脚本的公共数据都会存储在全局单例脚本中。
单例模式可以很方便地提供数据、对象的访问方式,单例仅允许被实例一次,这就保证了他在各个程序模块间的唯一性。大家可能会想到全局变量,是的,确实可以用全局变量来做。不过为了提供代码的可维护性,全局是有很大局限的。你又想在Unity里经常还可Static 变量会共享信息,不过你还发现他被声明在各处。对的,不好找,不好维护。
至于使用嘛 我也在研究 基本上都是在控制游戏的流程啊 背景音乐啊 切换场景啊什么的时候用到单例模式
以下是模型的单例模式:模型的单例不能有构造器 不 能 有 构 造 器 ! 而且要注意Awake和start的执行顺序。
using UnityEngine; using System.Collections; //对象单例模式 public class GameManager : MonoBehaviour { private static GameManager m_manager; public static GameManager M_manager { get { if (m_manager == null) { m_manager = new GameObject("GameManager").AddComponent<GameManager>(); } return m_manager; } } //注意执行顺序 void Awake() { //添加音频组件 gameObject.AddComponent<AudioSource>(); } // Use this for initialization void Start() { } //添加音频 public void PlayAudio(AudioClip clip){ audio.PlayOneShot(clip); } // Update is called once per frame void Update() { } }
在摄像机脚本中简简单单调用一下就好了
void Start() { GameManager manager = GameManager.M_manager; manager.PlayAudio(clip); ModelManager modelManager = ModelManager.M_mamager; }
还有对象的单例,用法和c#时候没什么两样
using UnityEngine; using System.Collections; //模型单例 public class ModelManager{ private static ModelManager m_mamager; public static ModelManager M_mamager { get { if (m_mamager == null) { m_mamager = new ModelManager(); } return ModelManager.m_mamager; } } public Mouse[] mouses = new Mouse[10]; public ModelManager() { for (int i = 0; i < 10; i++) { mouses[i] = new Mouse(); } } }
下面是一些Application类的使用 感觉还是一样 都是公式 :
using UnityEngine; using System.Collections; public class GameController : MonoBehaviour { public AudioClip clip; // Use this for initialization void Start() { GameManager manager = GameManager.M_manager; manager.PlayAudio(clip); ModelManager modelManager = ModelManager.M_mamager; } // Update is called once per frame void Update() { } void OnGUI() { GUILayout.Label(Application.platform.ToString()); GUILayout.Label(Application.runInBackground.ToString()); GUILayout.Label(Application.dataPath.ToString()); GUILayout.Label(Application.persistentDataPath.ToString()); GUILayout.Label(Application.temporaryCachePath.ToString()); GUILayout.Label(Application.loadedLevel.ToString()); //切换场景 if (GUILayout.Button("level")) { //销毁之前场景 Application.LoadLevel(1); //不销毁之前场景 Application.LoadLevelAdditive(1); } //退出 if (GUILayout.Button("quit")) { Application.Quit(); } //链接 打开网页 if (GUILayout.Button("baidu")) { Application.OpenURL("http://www.baidu.com"); } } }
今天就研究这么多啦 good night buddies!