编程设计格局之单例情势27111葡京的网址

单例方式,unity中一种很常用的设计方式,从“单例”字面意思上精晓为——一个类只有一个实例,即有限支撑一个类唯有一个实例的一种完毕方式,合法给出的概念是概念:保障一个类唯有一个实例,并提供一个大局访问点。

 

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

27111葡京的网址 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

27111葡京的网址,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#言语编写!

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注