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的创建或者销毁, 子 ui 通过 UiBase.RecordNestedUi() 来记录
  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"/><br/>
  107. /// 该函数不会自动打开Ui, 需要手动调用 ShowUi() 函数来显示Ui
  108. /// </summary>
  109. public static UiBase CreateUi(string uiName)
  110. {
  111. var packedScene = ResourceManager.Load<PackedScene>("res://" + GameConfig.UiPrefabDir + uiName + ".tscn");
  112. var uiBase = packedScene.Instantiate<UiBase>();
  113. var canvasLayer = GetUiLayer(uiBase.Layer);
  114. canvasLayer.AddChild(uiBase);
  115. uiBase.OnCreateUi();
  116. uiBase.OnInitNestedUi();
  117. return uiBase;
  118. }
  119.  
  120. /// <summary>
  121. /// 根据Ui资源路径创建Ui, 并返回Ui实例, 该Ui资源的场景根节点必须继承<see cref="UiBase"/><br/>
  122. /// 该函数不会自动打开Ui, 需要手动调用 ShowUi() 函数来显示Ui
  123. /// </summary>
  124. public static T CreateUi<T>(string uiName) where T : UiBase
  125. {
  126. return (T)CreateUi(uiName);
  127. }
  128. /// <summary>
  129. /// 根据Ui资源路径打开Ui, 并返回Ui实例, 该Ui资源的场景根节点必须继承<see cref="UiBase"/>
  130. /// </summary>
  131. public static UiBase OpenUi(string uiName)
  132. {
  133. var uiBase = CreateUi(uiName);
  134. uiBase.ShowUi();
  135. return uiBase;
  136. }
  137.  
  138. /// <summary>
  139. /// 根据Ui资源路径打开Ui, 并返回Ui实例, 该Ui资源的场景根节点必须继承<see cref="UiBase"/>
  140. /// </summary>
  141. public static T OpenUi<T>(string uiName) where T : UiBase
  142. {
  143. return (T)OpenUi(uiName);
  144. }
  145.  
  146. /// <summary>
  147. /// 销毁指定Ui
  148. /// </summary>
  149. public static void DisposeUi(UiBase uiBase)
  150. {
  151. uiBase.DisposeUi();
  152. }
  153.  
  154. /// <summary>
  155. ///
  156. /// </summary>
  157. public static void HideUi(UiBase uiBase)
  158. {
  159. uiBase.HideUi();
  160. }
  161. /// <summary>
  162. /// 销毁所有Ui
  163. /// </summary>
  164. public static void DisposeAllUi()
  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.DisposeUi();
  176. }
  177. }
  178. }
  179.  
  180. /// <summary>
  181. /// 隐藏所有Ui
  182. /// </summary>
  183. public static void HideAllUi()
  184. {
  185. var map = new Dictionary<string, List<UiBase>>();
  186. foreach (var item in _recordUiMap)
  187. {
  188. map.Add(item.Key, new List<UiBase>(item.Value));
  189. }
  190. foreach (var item in map)
  191. {
  192. foreach (var uiBase in item.Value)
  193. {
  194. uiBase.HideUi();
  195. }
  196. }
  197. }
  198.  
  199. /// <summary>
  200. /// 获取Ui实例
  201. /// </summary>
  202. public static T[] GetUiInstance<T>(string uiName) where T : UiBase
  203. {
  204. if (_recordUiMap.TryGetValue(uiName, out var list))
  205. {
  206. var result = new T[list.Count];
  207. for (var i = 0; i < list.Count; i++)
  208. {
  209. result[i] = (T)list[i];
  210. }
  211. return result;
  212. }
  213.  
  214. return new T[0];
  215. }
  216. }