Newer
Older
DungeonShooting / DungeonShooting_Godot / src / framework / ui / UiNode.cs
  1.  
  2. using Godot;
  3.  
  4. /// <summary>
  5. /// Ui节点父类, 无泛型无属性
  6. /// </summary>
  7. public abstract class UiNode
  8. {
  9. }
  10.  
  11. /// <summary>
  12. /// Ui节点父类
  13. /// </summary>
  14. /// <typeparam name="TUi">所属Ui面板类型</typeparam>
  15. /// <typeparam name="TNodeType">Godot中的节点类型</typeparam>
  16. /// <typeparam name="TCloneType">克隆该对象返回的类型</typeparam>
  17. public abstract class UiNode<TUi, TNodeType, TCloneType>
  18. : UiNode, IUiCellNode, IClone<TCloneType>
  19. where TUi : UiBase
  20. where TNodeType : Node
  21. where TCloneType : IUiCellNode
  22. {
  23. /// <summary>
  24. /// 当前Ui节点所属的Ui面板对象
  25. /// </summary>
  26. public TUi UiPanel { get; }
  27. /// <summary>
  28. /// Godot节点实例
  29. /// </summary>
  30. public TNodeType Instance { get; }
  31. /// <summary>
  32. /// 克隆当前对象, 并返回新的对象,
  33. /// 注意: 如果子节点改名或者移动层级, 那么有可能对导致属性中的子节点无法访问
  34. /// </summary>
  35. public abstract TCloneType Clone();
  36.  
  37. public UiNode(TUi uiPanel, TNodeType node)
  38. {
  39. UiPanel = uiPanel;
  40. Instance = node;
  41. }
  42. /// <summary>
  43. /// 嵌套打开子ui
  44. /// </summary>
  45. public UiBase OpenNestedUi(string uiName)
  46. {
  47. var packedScene = ResourceManager.Load<PackedScene>("res://" + GameConfig.UiPrefabDir + uiName + ".tscn");
  48. var uiBase = packedScene.Instantiate<UiBase>();
  49. Instance.AddChild(uiBase);
  50. UiPanel.RecordNestedUi(uiBase, UiManager.RecordType.Open);
  51. uiBase.OnCreateUi();
  52. uiBase.OnInitNestedUi();
  53. if (UiPanel.IsOpen)
  54. {
  55. uiBase.ShowUi();
  56. }
  57. return uiBase;
  58. }
  59. /// <summary>
  60. /// 嵌套打开子ui
  61. /// </summary>
  62. public T OpenNestedUi<T>(string uiName) where T : UiBase
  63. {
  64. return (T)OpenNestedUi(uiName);
  65. }
  66.  
  67. public Node GetUiInstance()
  68. {
  69. return Instance;
  70. }
  71.  
  72. public IUiCellNode CloneUiCell()
  73. {
  74. return Clone();
  75. }
  76. }