Newer
Older
DungeonShooting / DungeonShooting_Godot / src / framework / ui / UiManager.cs
  1. using System.Collections.Generic;
  2. using Godot;
  3.  
  4. /// <summary>
  5. /// ui管理类
  6. /// </summary>
  7. public static partial class UiManager
  8. {
  9. public enum RecordType
  10. {
  11. Open,
  12. Close,
  13. }
  14. private static bool _init = false;
  15.  
  16. private static CanvasLayer _bottomLayer;
  17. private static CanvasLayer _middleLayer;
  18. private static CanvasLayer _heightLayer;
  19. private static CanvasLayer _popLayer;
  20.  
  21. private static Dictionary<string, List<UiBase>> _recordUiMap = new Dictionary<string, List<UiBase>>();
  22.  
  23. public static void Init()
  24. {
  25. if (_init)
  26. {
  27. return;
  28. }
  29.  
  30. _init = true;
  31. //创建ui层
  32. //Bottom
  33. _bottomLayer = new CanvasLayer();
  34. _bottomLayer.Name = "BottomLayer";
  35. _bottomLayer.Layer = 5;
  36. GameApplication.Instance.AddChild(_bottomLayer);
  37. //Middle
  38. _middleLayer = new CanvasLayer();
  39. _middleLayer.Name = "MiddleLayer";
  40. _middleLayer.Layer = 15;
  41. GameApplication.Instance.AddChild(_middleLayer);
  42. //Height
  43. _heightLayer = new CanvasLayer();
  44. _heightLayer.Name = "HeightLayer";
  45. _heightLayer.Layer = 25;
  46. GameApplication.Instance.AddChild(_heightLayer);
  47. //Pop
  48. _popLayer = new CanvasLayer();
  49. _popLayer.Name = "PopLayer";
  50. _popLayer.Layer = 35;
  51. GameApplication.Instance.AddChild(_popLayer);
  52. }
  53.  
  54. /// <summary>
  55. /// 获取指定的Ui层根节点
  56. /// </summary>
  57. public static CanvasLayer GetUiLayer(UiLayer uiLayer)
  58. {
  59. switch (uiLayer)
  60. {
  61. case UiLayer.Bottom:
  62. return _bottomLayer;
  63. case UiLayer.Middle:
  64. return _middleLayer;
  65. case UiLayer.Height:
  66. return _heightLayer;
  67. case UiLayer.Pop:
  68. return _popLayer;
  69. }
  70.  
  71. return null;
  72. }
  73.  
  74. /// <summary>
  75. /// 记录ui的创建或者销毁
  76. /// </summary>
  77. public static void RecordUi(UiBase uiBase, RecordType type)
  78. {
  79. if (type == RecordType.Open)
  80. {
  81. if (_recordUiMap.TryGetValue(uiBase.UiName, out var list))
  82. {
  83. list.Add(uiBase);
  84. }
  85. else
  86. {
  87. list = new List<UiBase>();
  88. list.Add(uiBase);
  89. _recordUiMap.Add(uiBase.UiName, list);
  90. }
  91. }
  92. else
  93. {
  94. if (_recordUiMap.TryGetValue(uiBase.UiName, out var list))
  95. {
  96. list.Remove(uiBase);
  97. if (list.Count == 0)
  98. {
  99. _recordUiMap.Remove(uiBase.UiName);
  100. }
  101. }
  102. }
  103. }
  104.  
  105. /// <summary>
  106. /// 根据Ui资源路径打开Ui, 并返回Ui实例, 该Ui资源的场景根节点必须继承<see cref="UiBase"/>
  107. /// </summary>
  108. public static UiBase OpenUi(string uiName)
  109. {
  110. var packedScene = ResourceManager.Load<PackedScene>("res://" + GameConfig.UiPrefabDir + uiName + ".tscn");
  111. var uiBase = packedScene.Instantiate<UiBase>();
  112. var canvasLayer = GetUiLayer(uiBase.Layer);
  113. canvasLayer.AddChild(uiBase);
  114. uiBase.OnCreateUi();
  115. uiBase.ShowUi();
  116. return uiBase;
  117. }
  118.  
  119. /// <summary>
  120. /// 根据Ui资源路径打开Ui, 并返回Ui实例, 该Ui资源的场景根节点必须继承<see cref="UiBase"/>
  121. /// </summary>
  122. public static T OpenUi<T>(string uiName) where T : UiBase
  123. {
  124. return (T)OpenUi(uiName);
  125. }
  126.  
  127. /// <summary>
  128. /// 销毁指定Ui
  129. /// </summary>
  130. public static void DisposeUi(UiBase uiBase)
  131. {
  132. uiBase.DisposeUi();
  133. }
  134.  
  135. /// <summary>
  136. ///
  137. /// </summary>
  138. public static void HideUi(UiBase uiBase)
  139. {
  140. uiBase.HideUi();
  141. }
  142. /// <summary>
  143. /// 销毁所有Ui
  144. /// </summary>
  145. public static void DisposeAllUi()
  146. {
  147. var map = new Dictionary<string, List<UiBase>>();
  148. foreach (var item in _recordUiMap)
  149. {
  150. map.Add(item.Key, new List<UiBase>(item.Value));
  151. }
  152. foreach (var item in map)
  153. {
  154. foreach (var uiBase in item.Value)
  155. {
  156. uiBase.DisposeUi();
  157. }
  158. }
  159. }
  160.  
  161. /// <summary>
  162. /// 隐藏所有Ui
  163. /// </summary>
  164. public static void HideAllUi()
  165. {
  166. var map = new Dictionary<string, List<UiBase>>();
  167. foreach (var item in _recordUiMap)
  168. {
  169. map.Add(item.Key, new List<UiBase>(item.Value));
  170. }
  171. foreach (var item in map)
  172. {
  173. foreach (var uiBase in item.Value)
  174. {
  175. uiBase.HideUi();
  176. }
  177. }
  178. }
  179.  
  180. /// <summary>
  181. /// 获取Ui实例
  182. /// </summary>
  183. public static T[] GetUiInstance<T>(string uiName) where T : UiBase
  184. {
  185. if (_recordUiMap.TryGetValue(uiName, out var list))
  186. {
  187. var result = new T[list.Count];
  188. for (var i = 0; i < list.Count; i++)
  189. {
  190. result[i] = (T)list[i];
  191. }
  192. return result;
  193. }
  194.  
  195. return new T[0];
  196. }
  197. }