5Unity-3d Day06

继续搞单例模式  在实战中体会了一下单例模式 

唉  还是搞不懂  虽然知道了怎么写  但在哪用还是很模糊  等以后写多了就好了吧

回顾一下,单例模式的定义是:保证一个类只有一个实例,并且提供一个访问它的全局访问点。单例对象的类必须保证只有一个实例存在。在我们的场景中,全局脚本的对象只会创建一次,保证单例,然后它(全局单例类)提供给各个脚本访问单例对象的方法,并且所有其他脚本的公共数据都会存储在全局单例脚本中。

单例模式可以很方便地提供数据、对象的访问方式,单例仅允许被实例一次,这就保证了他在各个程序模块间的唯一性。大家可能会想到全局变量,是的,确实可以用全局变量来做。不过为了提供代码的可维护性,全局是有很大局限的。你又想在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!

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。