单例模式,unity中一种很常用的设计模式,从“单例”字面意思上理解为——一个类只有一个实例,即保证一个类只有一个实例的一种实现方法,官方给出的定义是定义:确保一个类只有一个实例,并提供一个全局访问点。
这里运用老师的思路自己弄的一张设计UGUI框架的图:

这里的运用就是单例模式,就像开汽车,我不必去做其它的事,只需要掌握驾驶室,就可以操作整个汽车。
启动器:
public class GameRoot : MonoBehaviour {
 
	void Start () {
        UIManager.Instance.PushPanel(UIPanelType.MainMenu);     //实例化入口,这是单例模式的关键
	}
}
UI管理器:
public class UIManager {
 //单例核心:
    //1.定义一个静态的对象 在外界访问 在内部构造
    //2.构造方法私有化
private static UIManager _instance;
    public static UIManager Instance
    {
        get
        {
            if(_instance == null)
            {
                _instance = new UIManager();
            }
            return _instance;
        }
    }
    private Transform canvastransform;
    private Transform CanvasTransform
    {
        get
        {
            if(canvastransform == null )
            {
                canvastransform = GameObject.Find("Canvas").transform;
            }
            return canvastransform;
        }
    }
    
    private Dictionary<UIPanelType, string> panelPathDict;    //存储面板prefab路径
    private Dictionary<UIPanelType, BasePanel> panelDict;      // 保存所有实例化的面板上的BasePanel组件
    private Stack<BasePanel> panelStack;
    private UIManager()
    {
        ParseUIPanelTypeJson();
    }
    public void PushPanel(UIPanelType panelType)  // 显示界面
    {
        if(panelStack == null)
        {
            panelStack = new Stack<BasePanel>();
        }
        //判断是否有页面
        if(panelStack.Count > 0)
        {
            BasePanel topPanel = panelStack.Peek();
            topPanel.OnPause();
        }
        BasePanel panel = GetPanel(panelType);
        panel.OnEnter();
        panelStack.Push(panel);
    }
    public void PopPanel()    //出栈,移除界面
    {
        if (panelStack == null)
        {
            panelStack = new Stack<BasePanel>();
        }
        if(panelStack.Count<=0)
        {
            return;
        }
        //关闭栈顶页面
        BasePanel topPanel = panelStack.Pop();
        topPanel.OnExit();
        if(panelStack.Count<=0)
        {
            return;
        }
        BasePanel topPanel2 = panelStack.Peek();
        topPanel2.OnResume();
        
}
    public BasePanel GetPanel(UIPanelType panelType)
    {
        if(panelDict == null)
        {
            panelDict = new Dictionary<UIPanelType, BasePanel>();
        }
        //BasePanel panel;
        //panelDict.TryGetValue(panelType, out panel); //TOOD
        BasePanel panel = panelDict.TryGet(panelType);
        if(panel == null)
        {
            //如果找不到,就将找到prefab的路径,然后去实例化面板
            //string path;
            //panelPathDict.TryGetValue(panelType, out path);
            string path = panelPathDict.TryGet(panelType);
           
            GameObject instPanel= GameObject.Instantiate(Resources.Load(path))as GameObject;
            instPanel.transform.SetParent(CanvasTransform,false); //TOOD
            panelDict.Add(panelType, instPanel.GetComponent<BasePanel>());
            return instPanel.GetComponent<BasePanel>();
}
        else
        {
            return panel;
        }
    }
    [Serializable]
    class UIPanelTypeJson
    {
        public List<UIPanelInfo> infoList;
    }
    private void ParseUIPanelTypeJson()
    {
        panelPathDict = new Dictionary<UIPanelType, string>();
        TextAsset ta = Resources.Load<TextAsset>("UIPanelType");
UIPanelTypeJson jsonObject= JsonUtility.FromJson<UIPanelTypeJson>(ta.text);
        foreach(UIPanelInfo info in jsonObject.infoList)
        {
            //Debug.Log(info.panelType);
            panelPathDict.Add(info.panelType, info.path);
        }
    }
    //测试方法;
    public void Test()
    {
        string path;
        panelPathDict.TryGetValue(UIPanelType.Knapsack, out path);
        Debug.Log(path);
    }
  
}
后面部分:就是创建一个json格式或xml格式交互数据,然后创造一个library来管理所有的类型等数据,然后用这个用这个library来管理物体的实例方法,此代码运用了栈的特点,像”吃薯片“那样,控制面板实例化,其实作为一名学习者,很多东西其实看起不难,然而自己去敲敲,差别就大多了,所以,学习编程,买个好的机械键盘,天天劈里啪啦吧,哈哈。
注:此处是用的C#语言编写!
原文:http://www.cnblogs.com/redkop/p/7697072.html