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, params object[] args)
  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(args);
  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, params object[] args) where T : UiBase
  123. {
  124. return (T)OpenUi(uiName, args);
  125. }
  126.  
  127. /// <summary>
  128. /// 销毁指定Ui
  129. /// </summary>
  130. public static void DisposeUi(UiBase uiBase)
  131. {
  132. uiBase.DisposeUi();
  133. }
  134.  
  135. /// <summary>
  136. /// 获取Ui实例
  137. /// </summary>
  138. public static T[] GetUiInstance<T>(string uiName) where T : UiBase
  139. {
  140. if (_recordUiMap.TryGetValue(uiName, out var list))
  141. {
  142. var result = new T[list.Count];
  143. for (var i = 0; i < list.Count; i++)
  144. {
  145. result[i] = (T)list[i];
  146. }
  147. return result;
  148. }
  149.  
  150. return new T[0];
  151. }
  152. }