将UI和具体功能业务分隔开
单例脚本UIManager
声明一个画布UIManagerCanvas
使用List存储所有的BasePanel的Prefab----List<BasePanel> basePanelPrefabList
使用字典存储BasePanel和其对应的Type---- Dictionary<Type, BasePanel> panelMap
Awake():
遍历basePanelPrefabList,
首先,将所有panel的预制体实例化Instantiate到UIManagerCanvas下
然后将panel的Type存储进panelMap
默认将所有panel隐藏
BasePanel包含一些通用的方法,所有的Panel都继承自BasePanel,然后实现各自独特的功能。
BasePanel中包含的通用方法有显示隐藏panel等:
private void Awake()
{
this.gameObject.SetActive(true);
_isActive = false;
}
virtual public void ShowPanel()
{
this.gameObject.SetActive(true);
_isActive = true;
}
virtual public void HidePanel()
{
this.gameObject.SetActive(false);
_isActive = false;
}
public void TogglePanel()
{
if (_isActive)
this.HidePanel();
else
this.ShowPanel();
}
除此之外在UIManager中还包含一些:
比如获取某个已经显示的面板GetPanel<T>,展示某个面板,隐藏某个面板隐藏全部面板等等,可以自行进行补充
public BasePanel GetPanel<t>() where t : BasePanel
{
return panelMap[typeof(t)];
}
public void ShowPanel<t>() where t : BasePanel
{
panelMap[typeof(t)].ShowPanel();
}
public void HidePanel<t>() where t : BasePanel
{
panelMap[typeof(t)].HidePanel();
}
public void TogglePanel<t>() where t : BasePanel
{
panelMap[typeof(t)].TogglePanel();
}
public void HideAllPanels()
{
foreach (var panel in panelMap)
{
panel.Value.HidePanel();
}
}