微信登录

Manager - UIManager.cs - 经理_UI

  1. public class UIManager: BaseManager
  2. {
  3. private Transform canvasTransform;
  4. private Transform CanvasTransform{}
  5. private Dictionary<UIPanelType, string> panelPathDict;//存储所有面板Prefab的路径
  6. private Dictionary<UIPanelType, BasePanel> panelDict;//保存所有实例化面板的游戏物体身上的BasePanel组件
  7. private Stack<BasePanel> panelStack;
  8. private MessagePanel msgPanel;
  9. private UIPanelType panelTypeToPush = UIPanelType.None;
  10. public UIManager(GameFacade facade) : base(facade){}
  11. public override void OnInit(){}
  12. public override void Update(){}
  13. public void PushPanelSync(UIPanelType panelType){}
  14. /// 把某个页面入栈, 把某个页面显示在界面上
  15. public BasePanel PushPanel(UIPanelType panelType){}
  16. /// 出栈 ,把页面从界面上移除
  17. public void PopPanel(){}
  18. /// 根据面板类型 得到实例化的面板
  19. private BasePanel GetPanel(UIPanelType panelType){}
  20. [Serializable]
  21. class UIPanelTypeJson{}
  22. private void ParseUIPanelTypeJson(){}
  23. public void InjectMsgPanel(MessagePanel msgPanel){}
  24. public void ShowMessage(string msg){}
  25. public void ShowMessageSync(string msg){}
  26. }
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System;
  5. public class UIManager: BaseManager
  6. {
  7. ///
  8. /// 单例模式的核心
  9. /// 1,定义一个静态的对象 在外界访问 在内部构造
  10. /// 2,构造方法私有化
  11. //private static UIManager _instance;
  12. //public static UIManager Instance
  13. //{
  14. // get
  15. // {
  16. // if (_instance == null)
  17. // {
  18. // _instance = new UIManager();
  19. // }
  20. // return _instance;
  21. // }
  22. //}
  23. private Transform canvasTransform;
  24. private Transform CanvasTransform
  25. {
  26. get
  27. {
  28. if (canvasTransform == null)
  29. {
  30. canvasTransform = GameObject.Find("Canvas").transform;
  31. }
  32. return canvasTransform;
  33. }
  34. }
  35. private Dictionary<UIPanelType, string> panelPathDict;//存储所有面板Prefab的路径
  36. private Dictionary<UIPanelType, BasePanel> panelDict;//保存所有实例化面板的游戏物体身上的BasePanel组件
  37. private Stack<BasePanel> panelStack;
  38. private MessagePanel msgPanel;
  39. private UIPanelType panelTypeToPush = UIPanelType.None;
  40. public UIManager(GameFacade facade) : base(facade)
  41. {
  42. ParseUIPanelTypeJson();
  43. }
  44. public override void OnInit()
  45. {
  46. base.OnInit();
  47. PushPanel(UIPanelType.Message);
  48. PushPanel(UIPanelType.Start);
  49. }
  50. public override void Update()
  51. {
  52. if (panelTypeToPush != UIPanelType.None)
  53. {
  54. PushPanel(panelTypeToPush);
  55. panelTypeToPush = UIPanelType.None;
  56. }
  57. }
  58. public void PushPanelSync(UIPanelType panelType)
  59. {
  60. panelTypeToPush = panelType;
  61. }
  62. /// <summary>
  63. /// 把某个页面入栈, 把某个页面显示在界面上
  64. /// </summary>
  65. public BasePanel PushPanel(UIPanelType panelType)
  66. {
  67. if (panelStack == null)
  68. panelStack = new Stack<BasePanel>();
  69. //判断一下栈里面是否有页面
  70. if (panelStack.Count > 0)
  71. {
  72. BasePanel topPanel = panelStack.Peek();
  73. topPanel.OnPause();
  74. }
  75. BasePanel panel = GetPanel(panelType);
  76. panel.OnEnter();
  77. panelStack.Push(panel);
  78. return panel;
  79. }
  80. /// <summary>
  81. /// 出栈 ,把页面从界面上移除
  82. /// </summary>
  83. public void PopPanel()
  84. {
  85. if (panelStack == null)
  86. panelStack = new Stack<BasePanel>();
  87. if (panelStack.Count <= 0) return;
  88. //关闭栈顶页面的显示
  89. BasePanel topPanel = panelStack.Pop();
  90. topPanel.OnExit();
  91. if (panelStack.Count <= 0) return;
  92. BasePanel topPanel2 = panelStack.Peek();
  93. topPanel2.OnResume();
  94. }
  95. /// <summary>
  96. /// 根据面板类型 得到实例化的面板
  97. /// </summary>
  98. /// <returns></returns>
  99. private BasePanel GetPanel(UIPanelType panelType)
  100. {
  101. if (panelDict == null)
  102. {
  103. panelDict = new Dictionary<UIPanelType, BasePanel>();
  104. }
  105. //BasePanel panel;
  106. //panelDict.TryGetValue(panelType, out panel);//TODO
  107. BasePanel panel = panelDict.TryGet(panelType);
  108. if (panel == null)
  109. {
  110. //如果找不到,那么就找这个面板的prefab的路径,然后去根据prefab去实例化面板
  111. //string path;
  112. //panelPathDict.TryGetValue(panelType, out path);
  113. string path = panelPathDict.TryGet(panelType);
  114. GameObject instPanel = GameObject.Instantiate(Resources.Load(path)) as GameObject;
  115. instPanel.transform.SetParent(CanvasTransform,false);
  116. instPanel.GetComponent<BasePanel>().UIMng = this;
  117. instPanel.GetComponent<BasePanel>().Facade = facade;
  118. panelDict.Add(panelType, instPanel.GetComponent<BasePanel>());
  119. return instPanel.GetComponent<BasePanel>();
  120. }
  121. else
  122. {
  123. return panel;
  124. }
  125. }
  126. [Serializable]
  127. class UIPanelTypeJson
  128. {
  129. public List<UIPanelInfo> infoList;
  130. }
  131. private void ParseUIPanelTypeJson()
  132. {
  133. panelPathDict = new Dictionary<UIPanelType, string>();
  134. TextAsset ta = Resources.Load<TextAsset>("UIPanelType");
  135. UIPanelTypeJson jsonObject = JsonUtility.FromJson<UIPanelTypeJson>(ta.text);
  136. foreach (UIPanelInfo info in jsonObject.infoList)
  137. {
  138. //Debug.Log(info.panelType);
  139. panelPathDict.Add(info.panelType, info.path);
  140. }
  141. }
  142. public void InjectMsgPanel(MessagePanel msgPanel)
  143. {
  144. this.msgPanel = msgPanel;
  145. }
  146. public void ShowMessage(string msg)
  147. {
  148. if (msgPanel == null)
  149. {
  150. Debug.Log("无法显示提示信息,MsgPanel为空");return;
  151. }
  152. msgPanel.ShowMessage(msg);
  153. }
  154. public void ShowMessageSync(string msg)
  155. {
  156. if (msgPanel == null)
  157. {
  158. Debug.Log("无法显示提示信息,MsgPanel为空"); return;
  159. }
  160. msgPanel.ShowMessageSync(msg);
  161. }
  162. /// <summary>
  163. /// just for test
  164. /// </summary>
  165. //public void Test()
  166. //{
  167. // string path ;
  168. // panelPathDict.TryGetValue(UIPanelType.Knapsack,out path);
  169. // Debug.Log(path);
  170. //}
  171. }