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

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

 

发表评论

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