编程设计格局之单例格局

单例格局,unity中一种很常用的设计形式,从“单例”字面意思上精通为——一个类唯有一个实例,即确保一个类唯有一个实例的一种实现模式,官方给出的概念是概念:保证一个类只有一个实例,并提供一个大局访问点。

 

这里运用老师的笔触自己弄的一张设计UGUI框架的图:

机械键盘 1

 

此处的采纳就是单例情势,就像开汽车,我不必去做其它的事,只需要控制驾驶室,就可以操作整个汽车。

 

启动器:

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#言语编写!

 

相关文章