diff --git a/DungeonShooting_Godot/src/framework/generator/UiGenerator.cs b/DungeonShooting_Godot/src/framework/generator/UiGenerator.cs index decc0ad..a0e8c08 100644 --- a/DungeonShooting_Godot/src/framework/generator/UiGenerator.cs +++ b/DungeonShooting_Godot/src/framework/generator/UiGenerator.cs @@ -24,28 +24,28 @@ File.WriteAllText(path, code); } - private static string GenerateClassCode(UiNode uiNode) + private static string GenerateClassCode(UiNodeInfo uiNodeInfo) { - return $"namespace UI.{uiNode.OriginName};\n\n" + + return $"namespace UI.{uiNodeInfo.OriginName};\n\n" + $"/// \n" + $"/// Ui代码, 该类是根据ui场景自动生成的, 请不要手动编辑该类, 以免造成代码丢失\n" + $"/// \n" + - $"public abstract partial class {uiNode.OriginName} : UiBase\n" + + $"public abstract partial class {uiNodeInfo.OriginName} : UiBase\n" + $"{{\n" + - GeneratePropertyListClassCode("", uiNode.OriginName + ".", uiNode, " ") + + GeneratePropertyListClassCode("", uiNodeInfo.OriginName + ".", uiNodeInfo, " ") + $"\n\n" + - GenerateAllChildrenClassCode(uiNode.OriginName + ".", uiNode, " ") + + GenerateAllChildrenClassCode(uiNodeInfo.OriginName + ".", uiNodeInfo, " ") + $"}}\n"; } - private static string GenerateAllChildrenClassCode(string parent, UiNode uiNode, string retraction) + private static string GenerateAllChildrenClassCode(string parent, UiNodeInfo uiNodeInfo, string retraction) { var str = ""; - if (uiNode.Children != null) + if (uiNodeInfo.Children != null) { - for (var i = 0; i < uiNode.Children.Count; i++) + for (var i = 0; i < uiNodeInfo.Children.Count; i++) { - var item = uiNode.Children[i]; + var item = uiNodeInfo.Children[i]; str += GenerateAllChildrenClassCode(parent + item.OriginName + ".", item, retraction); str += GenerateChildrenClassCode(parent, item, retraction); } @@ -54,31 +54,31 @@ return str; } - private static string GenerateChildrenClassCode(string parent, UiNode uiNode, string retraction) + private static string GenerateChildrenClassCode(string parent, UiNodeInfo uiNodeInfo, string retraction) { return retraction + $"/// \n" + - retraction + $"/// 类型: , 路径: {parent}{uiNode.OriginName}\n" + + retraction + $"/// 类型: , 路径: {parent}{uiNodeInfo.OriginName}\n" + retraction + $"/// \n" + - retraction + $"public class {uiNode.ClassName}\n" + + retraction + $"public class {uiNodeInfo.ClassName} : IUiNode<{uiNodeInfo.TypeName}, {uiNodeInfo.ClassName}>\n" + retraction + $"{{\n" + retraction + $" /// \n" + - retraction + $" /// Ui节点实例, 节点类型: , 节点路径: {parent}{uiNode.OriginName}\n" + + retraction + $" /// Ui节点实例, 节点类型: , 节点路径: {parent}{uiNodeInfo.OriginName}\n" + retraction + $" /// \n" + - retraction + $" public {uiNode.TypeName} Instance {{ get; }}\n\n" + - GeneratePropertyListClassCode("Instance.", parent, uiNode, retraction + " ") + - retraction + $" public {uiNode.ClassName}({uiNode.TypeName} node) => Instance = node;\n" + - retraction + $" public {uiNode.ClassName} Clone() => new (({uiNode.TypeName})Instance.Duplicate());\n" + + retraction + $" public {uiNodeInfo.TypeName} Instance {{ get; }}\n\n" + + GeneratePropertyListClassCode("Instance.", parent, uiNodeInfo, retraction + " ") + + retraction + $" public {uiNodeInfo.ClassName}({uiNodeInfo.TypeName} node) => Instance = node;\n" + + retraction + $" public {uiNodeInfo.ClassName} Clone() => new (({uiNodeInfo.TypeName})Instance.Duplicate());\n" + retraction + $"}}\n\n"; } - private static string GeneratePropertyListClassCode(string target, string parent, UiNode uiNode, string retraction) + private static string GeneratePropertyListClassCode(string target, string parent, UiNodeInfo uiNodeInfo, string retraction) { var str = ""; - if (uiNode.Children != null) + if (uiNodeInfo.Children != null) { - for (var i = 0; i < uiNode.Children.Count; i++) + for (var i = 0; i < uiNodeInfo.Children.Count; i++) { - var item = uiNode.Children[i]; + var item = uiNodeInfo.Children[i]; str += GeneratePropertyCode(target, parent, item, retraction); } } @@ -86,26 +86,26 @@ return str; } - private static string GeneratePropertyCode(string target, string parent, UiNode uiNode, string retraction) + private static string GeneratePropertyCode(string target, string parent, UiNodeInfo uiNodeInfo, string retraction) { return retraction + $"/// \n" + - retraction + $"/// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: {parent}{uiNode.OriginName}\n" + + retraction + $"/// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: {parent}{uiNodeInfo.OriginName}\n" + retraction + $"/// \n" + - retraction + $"public {uiNode.ClassName} {uiNode.Name}\n" + + retraction + $"public {uiNodeInfo.ClassName} {uiNodeInfo.Name}\n" + retraction + $"{{\n" + retraction + $" get\n" + retraction + $" {{\n" + - retraction + $" if (_{uiNode.Name} == null) _{uiNode.Name} = new {uiNode.ClassName}({target}GetNode<{uiNode.TypeName}>(\"{uiNode.OriginName}\"));\n" + - retraction + $" return _{uiNode.Name};\n" + + retraction + $" if (_{uiNodeInfo.Name} == null) _{uiNodeInfo.Name} = new {uiNodeInfo.ClassName}({target}GetNodeOrNull<{uiNodeInfo.TypeName}>(\"{uiNodeInfo.OriginName}\"));\n" + + retraction + $" return _{uiNodeInfo.Name};\n" + retraction + $" }}\n" + retraction + $"}}\n" + - retraction + $"private {uiNode.ClassName} _{uiNode.Name};\n\n"; + retraction + $"private {uiNodeInfo.ClassName} _{uiNodeInfo.Name};\n\n"; } - private static UiNode EachNode(Node node) + private static UiNodeInfo EachNode(Node node) { var name = Regex.Replace(node.Name, "[^\\w_]", ""); - var uiNode = new UiNode("L_" + name, name, "UiNode" + (_nodeIndex++) + "_" + name, node.GetType().FullName); + var uiNode = new UiNodeInfo("L_" + name, name, "UiNode" + (_nodeIndex++) + "_" + name, node.GetType().FullName); var childCount = node.GetChildCount(); if (childCount > 0) @@ -117,7 +117,7 @@ { if (uiNode.Children == null) { - uiNode.Children = new List(); + uiNode.Children = new List(); } uiNode.Children.Add(EachNode(children)); @@ -128,15 +128,15 @@ return uiNode; } - private class UiNode + private class UiNodeInfo { public string Name; public string OriginName; public string ClassName; public string TypeName; - public List Children; + public List Children; - public UiNode(string name, string originName, string className, string typeName) + public UiNodeInfo(string name, string originName, string className, string typeName) { Name = name; OriginName = originName; diff --git a/DungeonShooting_Godot/src/framework/ui/IUiNode.cs b/DungeonShooting_Godot/src/framework/ui/IUiNode.cs new file mode 100644 index 0000000..f2b9214 --- /dev/null +++ b/DungeonShooting_Godot/src/framework/ui/IUiNode.cs @@ -0,0 +1,20 @@ + +using Godot; + +/// +/// Ui节点代码接口 +/// +/// Godot中的节点类型 +/// 克隆该对象返回的类型 +public interface IUiNode where TNodeType : Node +{ + /// + /// Godot节点实例 + /// + TNodeType Instance { get; } + /// + /// 克隆当前对象, 并返回新的对象, + /// 注意: 如果子节点改名或者移动层级, 那么有可能对导致属性中的子节点无法访问 + /// + TCloneType Clone(); +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/ui/roomUI/RoomUI.cs b/DungeonShooting_Godot/src/game/ui/roomUI/RoomUI.cs index c296c7c..b34326a 100644 --- a/DungeonShooting_Godot/src/game/ui/roomUI/RoomUI.cs +++ b/DungeonShooting_Godot/src/game/ui/roomUI/RoomUI.cs @@ -12,7 +12,7 @@ { get { - if (_L_InteractiveTipBar == null) _L_InteractiveTipBar = new UiNode1_InteractiveTipBar(GetNode("InteractiveTipBar")); + if (_L_InteractiveTipBar == null) _L_InteractiveTipBar = new UiNode1_InteractiveTipBar(GetNodeOrNull("InteractiveTipBar")); return _L_InteractiveTipBar; } } @@ -25,7 +25,7 @@ { get { - if (_L_ReloadBar == null) _L_ReloadBar = new UiNode5_ReloadBar(GetNode("ReloadBar")); + if (_L_ReloadBar == null) _L_ReloadBar = new UiNode5_ReloadBar(GetNodeOrNull("ReloadBar")); return _L_ReloadBar; } } @@ -38,31 +38,18 @@ { get { - if (_L_Control == null) _L_Control = new UiNode8_Control(GetNode("Control")); + if (_L_Control == null) _L_Control = new UiNode8_Control(GetNodeOrNull("Control")); return _L_Control; } } private UiNode8_Control _L_Control; - /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomUI.Cursor - /// - public UiNode18_Cursor L_Cursor - { - get - { - if (_L_Cursor == null) _L_Cursor = new UiNode18_Cursor(GetNode("Cursor")); - return _L_Cursor; - } - } - private UiNode18_Cursor _L_Cursor; - /// /// 类型: , 路径: RoomUI.InteractiveTipBar.Icon /// - public class UiNode2_Icon + public class UiNode2_Icon : IUiNode { /// /// Ui节点实例, 节点类型: , 节点路径: RoomUI.InteractiveTipBar.Icon @@ -76,7 +63,7 @@ /// /// 类型: , 路径: RoomUI.InteractiveTipBar.InteractiveIcon /// - public class UiNode3_InteractiveIcon + public class UiNode3_InteractiveIcon : IUiNode { /// /// Ui节点实例, 节点类型: , 节点路径: RoomUI.InteractiveTipBar.InteractiveIcon @@ -90,7 +77,7 @@ /// /// 类型: , 路径: RoomUI.InteractiveTipBar.Line2D /// - public class UiNode4_Line2D + public class UiNode4_Line2D : IUiNode { /// /// Ui节点实例, 节点类型: , 节点路径: RoomUI.InteractiveTipBar.Line2D @@ -104,7 +91,7 @@ /// /// 类型: , 路径: RoomUI.InteractiveTipBar /// - public class UiNode1_InteractiveTipBar + public class UiNode1_InteractiveTipBar : IUiNode { /// /// Ui节点实例, 节点类型: , 节点路径: RoomUI.InteractiveTipBar @@ -118,7 +105,7 @@ { get { - if (_L_Icon == null) _L_Icon = new UiNode2_Icon(Instance.GetNode("Icon")); + if (_L_Icon == null) _L_Icon = new UiNode2_Icon(Instance.GetNodeOrNull("Icon")); return _L_Icon; } } @@ -131,7 +118,7 @@ { get { - if (_L_InteractiveIcon == null) _L_InteractiveIcon = new UiNode3_InteractiveIcon(Instance.GetNode("InteractiveIcon")); + if (_L_InteractiveIcon == null) _L_InteractiveIcon = new UiNode3_InteractiveIcon(Instance.GetNodeOrNull("InteractiveIcon")); return _L_InteractiveIcon; } } @@ -144,7 +131,7 @@ { get { - if (_L_Line2D == null) _L_Line2D = new UiNode4_Line2D(Instance.GetNode("Line2D")); + if (_L_Line2D == null) _L_Line2D = new UiNode4_Line2D(Instance.GetNodeOrNull("Line2D")); return _L_Line2D; } } @@ -157,7 +144,7 @@ /// /// 类型: , 路径: RoomUI.ReloadBar.Slot.Block /// - public class UiNode7_Block + public class UiNode7_Block : IUiNode { /// /// Ui节点实例, 节点类型: , 节点路径: RoomUI.ReloadBar.Slot.Block @@ -171,7 +158,7 @@ /// /// 类型: , 路径: RoomUI.ReloadBar.Slot /// - public class UiNode6_Slot + public class UiNode6_Slot : IUiNode { /// /// Ui节点实例, 节点类型: , 节点路径: RoomUI.ReloadBar.Slot @@ -185,7 +172,7 @@ { get { - if (_L_Block == null) _L_Block = new UiNode7_Block(Instance.GetNode("Block")); + if (_L_Block == null) _L_Block = new UiNode7_Block(Instance.GetNodeOrNull("Block")); return _L_Block; } } @@ -198,7 +185,7 @@ /// /// 类型: , 路径: RoomUI.ReloadBar /// - public class UiNode5_ReloadBar + public class UiNode5_ReloadBar : IUiNode { /// /// Ui节点实例, 节点类型: , 节点路径: RoomUI.ReloadBar @@ -212,7 +199,7 @@ { get { - if (_L_Slot == null) _L_Slot = new UiNode6_Slot(Instance.GetNode("Slot")); + if (_L_Slot == null) _L_Slot = new UiNode6_Slot(Instance.GetNodeOrNull("Slot")); return _L_Slot; } } @@ -225,7 +212,7 @@ /// /// 类型: , 路径: RoomUI.Control.HealthBar.HpSlot.HpBar /// - public class UiNode11_HpBar + public class UiNode11_HpBar : IUiNode { /// /// Ui节点实例, 节点类型: , 节点路径: RoomUI.Control.HealthBar.HpSlot.HpBar @@ -239,7 +226,7 @@ /// /// 类型: , 路径: RoomUI.Control.HealthBar.HpSlot /// - public class UiNode10_HpSlot + public class UiNode10_HpSlot : IUiNode { /// /// Ui节点实例, 节点类型: , 节点路径: RoomUI.Control.HealthBar.HpSlot @@ -253,7 +240,7 @@ { get { - if (_L_HpBar == null) _L_HpBar = new UiNode11_HpBar(Instance.GetNode("HpBar")); + if (_L_HpBar == null) _L_HpBar = new UiNode11_HpBar(Instance.GetNodeOrNull("HpBar")); return _L_HpBar; } } @@ -266,7 +253,7 @@ /// /// 类型: , 路径: RoomUI.Control.HealthBar.ShieldSlot.ShieldBar /// - public class UiNode13_ShieldBar + public class UiNode13_ShieldBar : IUiNode { /// /// Ui节点实例, 节点类型: , 节点路径: RoomUI.Control.HealthBar.ShieldSlot.ShieldBar @@ -280,7 +267,7 @@ /// /// 类型: , 路径: RoomUI.Control.HealthBar.ShieldSlot /// - public class UiNode12_ShieldSlot + public class UiNode12_ShieldSlot : IUiNode { /// /// Ui节点实例, 节点类型: , 节点路径: RoomUI.Control.HealthBar.ShieldSlot @@ -294,7 +281,7 @@ { get { - if (_L_ShieldBar == null) _L_ShieldBar = new UiNode13_ShieldBar(Instance.GetNode("ShieldBar")); + if (_L_ShieldBar == null) _L_ShieldBar = new UiNode13_ShieldBar(Instance.GetNodeOrNull("ShieldBar")); return _L_ShieldBar; } } @@ -307,7 +294,7 @@ /// /// 类型: , 路径: RoomUI.Control.HealthBar /// - public class UiNode9_HealthBar + public class UiNode9_HealthBar : IUiNode { /// /// Ui节点实例, 节点类型: , 节点路径: RoomUI.Control.HealthBar @@ -321,7 +308,7 @@ { get { - if (_L_HpSlot == null) _L_HpSlot = new UiNode10_HpSlot(Instance.GetNode("HpSlot")); + if (_L_HpSlot == null) _L_HpSlot = new UiNode10_HpSlot(Instance.GetNodeOrNull("HpSlot")); return _L_HpSlot; } } @@ -334,7 +321,7 @@ { get { - if (_L_ShieldSlot == null) _L_ShieldSlot = new UiNode12_ShieldSlot(Instance.GetNode("ShieldSlot")); + if (_L_ShieldSlot == null) _L_ShieldSlot = new UiNode12_ShieldSlot(Instance.GetNodeOrNull("ShieldSlot")); return _L_ShieldSlot; } } @@ -347,7 +334,7 @@ /// /// 类型: , 路径: RoomUI.Control.MapBar /// - public class UiNode14_MapBar + public class UiNode14_MapBar : IUiNode { /// /// Ui节点实例, 节点类型: , 节点路径: RoomUI.Control.MapBar @@ -361,7 +348,7 @@ /// /// 类型: , 路径: RoomUI.Control.GunBar.GunSprite /// - public class UiNode16_GunSprite + public class UiNode16_GunSprite : IUiNode { /// /// Ui节点实例, 节点类型: , 节点路径: RoomUI.Control.GunBar.GunSprite @@ -375,7 +362,7 @@ /// /// 类型: , 路径: RoomUI.Control.GunBar.BulletText /// - public class UiNode17_BulletText + public class UiNode17_BulletText : IUiNode { /// /// Ui节点实例, 节点类型: , 节点路径: RoomUI.Control.GunBar.BulletText @@ -389,7 +376,7 @@ /// /// 类型: , 路径: RoomUI.Control.GunBar /// - public class UiNode15_GunBar + public class UiNode15_GunBar : IUiNode { /// /// Ui节点实例, 节点类型: , 节点路径: RoomUI.Control.GunBar @@ -403,7 +390,7 @@ { get { - if (_L_GunSprite == null) _L_GunSprite = new UiNode16_GunSprite(Instance.GetNode("GunSprite")); + if (_L_GunSprite == null) _L_GunSprite = new UiNode16_GunSprite(Instance.GetNodeOrNull("GunSprite")); return _L_GunSprite; } } @@ -416,7 +403,7 @@ { get { - if (_L_BulletText == null) _L_BulletText = new UiNode17_BulletText(Instance.GetNode("BulletText")); + if (_L_BulletText == null) _L_BulletText = new UiNode17_BulletText(Instance.GetNodeOrNull("BulletText")); return _L_BulletText; } } @@ -429,7 +416,7 @@ /// /// 类型: , 路径: RoomUI.Control /// - public class UiNode8_Control + public class UiNode8_Control : IUiNode { /// /// Ui节点实例, 节点类型: , 节点路径: RoomUI.Control @@ -443,7 +430,7 @@ { get { - if (_L_HealthBar == null) _L_HealthBar = new UiNode9_HealthBar(Instance.GetNode("HealthBar")); + if (_L_HealthBar == null) _L_HealthBar = new UiNode9_HealthBar(Instance.GetNodeOrNull("HealthBar")); return _L_HealthBar; } } @@ -456,7 +443,7 @@ { get { - if (_L_MapBar == null) _L_MapBar = new UiNode14_MapBar(Instance.GetNode("MapBar")); + if (_L_MapBar == null) _L_MapBar = new UiNode14_MapBar(Instance.GetNodeOrNull("MapBar")); return _L_MapBar; } } @@ -469,7 +456,7 @@ { get { - if (_L_GunBar == null) _L_GunBar = new UiNode15_GunBar(Instance.GetNode("GunBar")); + if (_L_GunBar == null) _L_GunBar = new UiNode15_GunBar(Instance.GetNodeOrNull("GunBar")); return _L_GunBar; } } @@ -479,126 +466,4 @@ public UiNode8_Control Clone() => new ((Godot.Control)Instance.Duplicate()); } - /// - /// 类型: , 路径: RoomUI.Cursor.LT - /// - public class UiNode19_LT - { - /// - /// Ui节点实例, 节点类型: , 节点路径: RoomUI.Cursor.LT - /// - public Godot.Sprite2D Instance { get; } - - public UiNode19_LT(Godot.Sprite2D node) => Instance = node; - public UiNode19_LT Clone() => new ((Godot.Sprite2D)Instance.Duplicate()); - } - - /// - /// 类型: , 路径: RoomUI.Cursor.LB - /// - public class UiNode20_LB - { - /// - /// Ui节点实例, 节点类型: , 节点路径: RoomUI.Cursor.LB - /// - public Godot.Sprite2D Instance { get; } - - public UiNode20_LB(Godot.Sprite2D node) => Instance = node; - public UiNode20_LB Clone() => new ((Godot.Sprite2D)Instance.Duplicate()); - } - - /// - /// 类型: , 路径: RoomUI.Cursor.RT - /// - public class UiNode21_RT - { - /// - /// Ui节点实例, 节点类型: , 节点路径: RoomUI.Cursor.RT - /// - public Godot.Sprite2D Instance { get; } - - public UiNode21_RT(Godot.Sprite2D node) => Instance = node; - public UiNode21_RT Clone() => new ((Godot.Sprite2D)Instance.Duplicate()); - } - - /// - /// 类型: , 路径: RoomUI.Cursor.RB - /// - public class UiNode22_RB - { - /// - /// Ui节点实例, 节点类型: , 节点路径: RoomUI.Cursor.RB - /// - public Godot.Sprite2D Instance { get; } - - public UiNode22_RB(Godot.Sprite2D node) => Instance = node; - public UiNode22_RB Clone() => new ((Godot.Sprite2D)Instance.Duplicate()); - } - - /// - /// 类型: , 路径: RoomUI.Cursor - /// - public class UiNode18_Cursor - { - /// - /// Ui节点实例, 节点类型: , 节点路径: RoomUI.Cursor - /// - public Cursor Instance { get; } - - /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomUI.LT - /// - public UiNode19_LT L_LT - { - get - { - if (_L_LT == null) _L_LT = new UiNode19_LT(Instance.GetNode("LT")); - return _L_LT; - } - } - private UiNode19_LT _L_LT; - - /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomUI.LB - /// - public UiNode20_LB L_LB - { - get - { - if (_L_LB == null) _L_LB = new UiNode20_LB(Instance.GetNode("LB")); - return _L_LB; - } - } - private UiNode20_LB _L_LB; - - /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomUI.RT - /// - public UiNode21_RT L_RT - { - get - { - if (_L_RT == null) _L_RT = new UiNode21_RT(Instance.GetNode("RT")); - return _L_RT; - } - } - private UiNode21_RT _L_RT; - - /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: RoomUI.RB - /// - public UiNode22_RB L_RB - { - get - { - if (_L_RB == null) _L_RB = new UiNode22_RB(Instance.GetNode("RB")); - return _L_RB; - } - } - private UiNode22_RB _L_RB; - - public UiNode18_Cursor(Cursor node) => Instance = node; - public UiNode18_Cursor Clone() => new ((Cursor)Instance.Duplicate()); - } - } diff --git a/DungeonShooting_Godot/src/test/TestUi/Test.cs b/DungeonShooting_Godot/src/test/TestUi/Test.cs index d577cb9..b462db9 100644 --- a/DungeonShooting_Godot/src/test/TestUi/Test.cs +++ b/DungeonShooting_Godot/src/test/TestUi/Test.cs @@ -14,7 +14,7 @@ { get { - if (_c1 == null) _c1 = new UiNode2_c1(GetNode("c1")); + if (_c1 == null) _c1 = new UiNode2_c1(GetNodeOrNull("c1")); return _c1; } } @@ -22,7 +22,7 @@ { get { - if (_c2 == null) _c2 = new UiNode3_c2(GetNode("c2")); + if (_c2 == null) _c2 = new UiNode3_c2(GetNodeOrNull("c2")); return _c2; } } @@ -30,7 +30,7 @@ private UiNode2_c1 _c1; private UiNode3_c2 _c2; - public class UiNode1_c11 + public class UiNode1_c11 : IUiNode { public Control Instance { get; } @@ -45,7 +45,7 @@ } } - public class UiNode2_c1 + public class UiNode2_c1 : IUiNode { public Control Instance { get; } @@ -53,7 +53,7 @@ { get { - if (_c11 == null) _c11 = new UiNode1_c11(Instance.GetNode("c11")); + if (_c11 == null) _c11 = new UiNode1_c11(Instance.GetNodeOrNull("c11")); return _c11; } } @@ -71,7 +71,7 @@ } } - public class UiNode3_c2 + public class UiNode3_c2 : IUiNode { public Control Instance { get; }