Newer
Older
DungeonShooting / DungeonShooting_Godot / src / framework / ui / UiBase.cs
@小李xl 小李xl on 1 Apr 2023 3 KB 更新文档
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using Godot;
  4.  
  5. /// <summary>
  6. /// Ui 基类
  7. /// </summary>
  8. [Tool]
  9. public abstract partial class UiBase : Control
  10. {
  11. /// <summary>
  12. /// 当前 UI 所属层级
  13. /// </summary>
  14. [Export]
  15. public UiLayer Layer = UiLayer.Middle;
  16.  
  17. /// <summary>
  18. /// Ui 模式, 单例/正常模式
  19. /// </summary>
  20. [Export]
  21. public UiMode Mode = UiMode.Normal;
  22.  
  23. /// <summary>
  24. /// 阻止下层 Ui 点击
  25. /// </summary>
  26. [Export]
  27. public bool KeepOut = false;
  28.  
  29. /// <summary>
  30. /// ui名称
  31. /// </summary>
  32. public string UiName { get; }
  33. /// <summary>
  34. /// 是否已经打开ui
  35. /// </summary>
  36. public bool IsOpen { get; private set; } = false;
  37. /// <summary>
  38. /// 是否已经销毁
  39. /// </summary>
  40. public bool IsDisposed { get; private set; } = false;
  41.  
  42. //开启的协程
  43. private List<CoroutineData> _coroutineList;
  44. public UiBase(string uiName)
  45. {
  46. UiName = uiName;
  47. //记录ui打开
  48. UiManager.RecordUi(this, UiManager.RecordType.Open);
  49. }
  50. /// <summary>
  51. /// 创建当前ui时调用
  52. /// </summary>
  53. public virtual void OnCreateUi()
  54. {
  55. }
  56. /// <summary>
  57. /// 当前ui显示时调用
  58. /// </summary>
  59. public abstract void OnShowUi();
  60.  
  61. /// <summary>
  62. /// 当前ui隐藏时调用
  63. /// </summary>
  64. public abstract void OnHideUi();
  65.  
  66. /// <summary>
  67. /// 销毁当前ui时调用
  68. /// </summary>
  69. public virtual void OnDisposeUi()
  70. {
  71. }
  72.  
  73. /// <summary>
  74. /// 每帧调用一次
  75. /// </summary>
  76. public virtual void Process(float delta)
  77. {
  78. }
  79.  
  80. /// <summary>
  81. /// 显示ui
  82. /// </summary>
  83. public void ShowUi()
  84. {
  85. if (IsOpen)
  86. {
  87. return;
  88. }
  89.  
  90. IsOpen = true;
  91. Visible = true;
  92. OnShowUi();
  93. }
  94. /// <summary>
  95. /// 隐藏ui, 不会执行销毁
  96. /// </summary>
  97. public void HideUi()
  98. {
  99. if (!IsOpen)
  100. {
  101. return;
  102. }
  103.  
  104. IsOpen = false;
  105. Visible = false;
  106. OnHideUi();
  107. }
  108.  
  109. /// <summary>
  110. /// 关闭并销毁ui
  111. /// </summary>
  112. public void DisposeUi()
  113. {
  114. if (IsDisposed)
  115. {
  116. return;
  117. }
  118. //记录ui关闭
  119. UiManager.RecordUi(this, UiManager.RecordType.Close);
  120. HideUi();
  121. IsDisposed = true;
  122. OnDisposeUi();
  123. QueueFree();
  124. }
  125.  
  126. public sealed override void _Process(double delta)
  127. {
  128. var newDelta = (float)delta;
  129. Process(newDelta);
  130. //协程更新
  131. if (_coroutineList != null)
  132. {
  133. ProxyCoroutineHandler.ProxyUpdateCoroutine(ref _coroutineList, newDelta);
  134. }
  135. }
  136.  
  137. /// <summary>
  138. /// 开启一个协程, 返回协程 id, 协程是在普通帧执行的, 支持: 协程嵌套, WaitForSeconds, WaitForFixedProcess
  139. /// </summary>
  140. public long StartCoroutine(IEnumerator able)
  141. {
  142. return ProxyCoroutineHandler.ProxyStartCoroutine(ref _coroutineList, able);
  143. }
  144.  
  145. /// <summary>
  146. /// 根据协程 id 停止协程
  147. /// </summary>
  148. public void StopCoroutine(long coroutineId)
  149. {
  150. ProxyCoroutineHandler.ProxyStopCoroutine(ref _coroutineList, coroutineId);
  151. }
  152. /// <summary>
  153. /// 停止所有协程
  154. /// </summary>
  155. public void StopAllCoroutine()
  156. {
  157. ProxyCoroutineHandler.ProxyStopAllCoroutine(ref _coroutineList);
  158. }
  159. }