diff --git a/DungeonShooting_Godot/prefab/ui/EditorManager.tscn b/DungeonShooting_Godot/prefab/ui/EditorManager.tscn
new file mode 100644
index 0000000..3069512
--- /dev/null
+++ b/DungeonShooting_Godot/prefab/ui/EditorManager.tscn
@@ -0,0 +1,78 @@
+[gd_scene load_steps=5 format=3 uid="uid://bmm3yekrokqlb"]
+
+[ext_resource type="Script" path="res://src/game/ui/editorManager/EditorManagerPanel.cs" id="1_6qnog"]
+[ext_resource type="Texture2D" uid="uid://cajcnlimvoxk" path="res://resource/sprite/ui/commonIcon/Back.png" id="2_ykjr7"]
+[ext_resource type="PackedScene" uid="uid://dh7y03tq6v0a2" path="res://prefab/ui/MapEditorProject.tscn" id="3_hlfkf"]
+[ext_resource type="PackedScene" uid="uid://bxrpxwsvveq8i" path="res://prefab/ui/TileSetEditorProject.tscn" id="4_mejcx"]
+
+[node name="EditorManager" type="Control"]
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+script = ExtResource("1_6qnog")
+
+[node name="Bg" type="Panel" parent="."]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="VBoxContainer" type="VBoxContainer" parent="Bg"]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_constants/separation = 0
+
+[node name="Head" type="Panel" parent="Bg/VBoxContainer"]
+custom_minimum_size = Vector2(0, 70)
+layout_mode = 2
+
+[node name="Back" type="Button" parent="Bg/VBoxContainer/Head"]
+layout_mode = 2
+offset_left = 2.0
+offset_top = 2.0
+offset_right = 62.0
+offset_bottom = 68.0
+size_flags_horizontal = 0
+icon = ExtResource("2_ykjr7")
+icon_alignment = 1
+
+[node name="Title" type="Label" parent="Bg/VBoxContainer/Head"]
+layout_mode = 1
+anchors_preset = 8
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+offset_left = -4.5
+offset_top = -20.0
+offset_right = 4.5
+offset_bottom = 20.0
+grow_horizontal = 2
+grow_vertical = 2
+text = "地图管理器"
+
+[node name="TabContainer" type="TabContainer" parent="Bg/VBoxContainer"]
+layout_mode = 2
+size_flags_vertical = 3
+
+[node name="Map" type="MarginContainer" parent="Bg/VBoxContainer/TabContainer"]
+layout_mode = 2
+theme_override_constants/margin_top = 10
+
+[node name="MapEditorProject" parent="Bg/VBoxContainer/TabContainer/Map" instance=ExtResource("3_hlfkf")]
+layout_mode = 2
+
+[node name="TileSet" type="MarginContainer" parent="Bg/VBoxContainer/TabContainer"]
+visible = false
+layout_mode = 2
+theme_override_constants/margin_top = 10
+
+[node name="TileSetEditorProject" parent="Bg/VBoxContainer/TabContainer/TileSet" instance=ExtResource("4_mejcx")]
+layout_mode = 2
diff --git a/DungeonShooting_Godot/prefab/ui/MapEditorMapTile.tscn b/DungeonShooting_Godot/prefab/ui/MapEditorMapTile.tscn
index 61097d1..f277c48 100644
--- a/DungeonShooting_Godot/prefab/ui/MapEditorMapTile.tscn
+++ b/DungeonShooting_Godot/prefab/ui/MapEditorMapTile.tscn
@@ -15,7 +15,6 @@
 grow_horizontal = 2
 grow_vertical = 2
 script = ExtResource("1_gtth6")
-Layer = null
 
 [node name="VBoxContainer" type="VBoxContainer" parent="."]
 layout_mode = 1
diff --git a/DungeonShooting_Godot/prefab/ui/MapEditorTools.tscn b/DungeonShooting_Godot/prefab/ui/MapEditorTools.tscn
index 6e0d75c..ba185f0 100644
--- a/DungeonShooting_Godot/prefab/ui/MapEditorTools.tscn
+++ b/DungeonShooting_Godot/prefab/ui/MapEditorTools.tscn
@@ -32,7 +32,6 @@
 grow_vertical = 2
 mouse_filter = 1
 script = ExtResource("1_mqp1c")
-Layer = null
 metadata/_edit_vertical_guides_ = [1900.0]
 
 [node name="ToolRoot" type="Control" parent="."]
diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/inlet/Start1/Preview.png b/DungeonShooting_Godot/resource/map/tileMaps/Test1/inlet/Start1/Preview.png
index c0adc9e..3078ae9 100644
--- a/DungeonShooting_Godot/resource/map/tileMaps/Test1/inlet/Start1/Preview.png
+++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/inlet/Start1/Preview.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/inlet/Start1/RoomInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/Test1/inlet/Start1/RoomInfo.json
index 42c5e3a..b31da81 100644
--- a/DungeonShooting_Godot/resource/map/tileMaps/Test1/inlet/Start1/RoomInfo.json
+++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/inlet/Start1/RoomInfo.json
@@ -1 +1 @@
-{"Position":{"X":-6,"Y":-7},"Size":{"X":19,"Y":13},"DoorAreaInfos":[],"GroupName":"Test1","RoomType":1,"RoomName":"Start1","Weight":100,"Remark":""}
\ No newline at end of file
+{"Position":{"X":-6,"Y":-7},"Size":{"X":21,"Y":13},"DoorAreaInfos":[],"GroupName":"Test1","RoomType":1,"RoomName":"Start1","Weight":100,"Remark":""}
\ No newline at end of file
diff --git a/DungeonShooting_Godot/resource/map/tileMaps/Test1/inlet/Start1/TileInfo.json b/DungeonShooting_Godot/resource/map/tileMaps/Test1/inlet/Start1/TileInfo.json
index 189d173..a92ac30 100644
--- a/DungeonShooting_Godot/resource/map/tileMaps/Test1/inlet/Start1/TileInfo.json
+++ b/DungeonShooting_Godot/resource/map/tileMaps/Test1/inlet/Start1/TileInfo.json
@@ -1 +1 @@
-{"NavigationVertices":[{"X":170,"Y":66},{"X":-58,"Y":66},{"X":-58,"Y":-58},{"X":170,"Y":-58}],"NavigationPolygon":[[0,1,2,3]],"Floor":[3,-2,0,3,2,-2,0,3,1,-2,0,3,0,-2,0,3,-1,-2,0,3,-2,-2,0,3,-2,-1,0,3,-1,-1,0,3,0,-1,0,3,1,-1,0,3,2,-1,0,3,3,-1,0,3,3,0,0,3,2,0,0,3,1,0,0,3,0,0,0,3,-1,0,0,3,-2,0,0,3,-2,1,0,3,-1,1,0,3,0,1,0,3,1,1,0,3,2,1,0,3,3,1,0,3,3,-3,0,3,2,-3,0,3,1,-3,0,3,0,-3,0,3,-1,-3,0,3,-2,-3,0,3,4,-3,0,3,5,-3,0,3,6,-3,0,3,7,-3,0,3,8,-2,0,3,9,-2,0,3,7,-2,0,3,6,-2,0,3,5,-2,0,3,4,-2,0,3,8,-3,0,3,9,-3,0,3,10,-3,0,3,9,-4,0,3,8,-4,0,3,7,-4,0,3,6,-4,0,3,5,-4,0,3,4,-4,0,3,3,-4,0,3,2,-4,0,3,1,-4,0,3,0,-4,0,3,-1,-4,0,3,-2,-4,0,3,-3,-4,0,3,-3,-3,0,3,-3,-2,0,3,-3,-1,0,3,-3,0,0,3,-3,1,0,3,-4,1,0,3,-4,2,0,3,-3,2,0,3,-2,2,0,3,-1,2,0,3,0,2,0,3,1,2,0,3,2,2,0,3,3,2,0,3,4,2,0,3,4,1,0,3,4,0,0,3,4,-1,0,3,5,-1,0,3,6,-1,0,3,7,-1,0,3,8,-1,0,3,9,-1,0,3,10,-1,0,3,10,-2,0,3,10,0,0,3,9,0,0,3,8,0,0,3,7,0,0,3,6,0,0,3,5,0,0,3,5,1,0,3,6,1,0,3,7,1,0,3,8,1,0,3,9,1,0,3,9,2,0,3,10,2,0,3,8,2,0,3,7,2,0,3,6,2,0,3,5,2,0,3,10,1,0,3,10,3,0,3,9,3,0,3,8,3,0,3,7,3,0,3,6,3,0,3,5,3,0,3,4,3,0,3,3,3,0,3,2,3,0,3,1,3,0,3,0,3,0,3,-1,3,0,3,-2,3,0,3,-3,3,0,3,-4,0,0,3,-4,-1,0,3,-4,-2,0,3,-4,-3,0,3,-4,-4,0,3,-4,3,0,3,10,-4,0,3],"Middle":[-4,-6,63,1,-4,-5,2,2,-3,-6,63,1,-3,-5,2,2,-2,-6,63,1,-2,-5,2,2,-1,-6,63,1,-1,-5,2,2,0,-6,63,1,0,-5,2,2,1,-6,63,1,1,-5,2,2,2,-6,63,1,2,-5,2,2,3,-6,63,1,3,-5,2,2,4,-6,63,1,4,-5,2,2,5,-6,63,1,5,-5,2,2,6,-6,63,1,6,-5,2,2,7,-6,63,1,7,-5,2,2,8,-6,63,1,8,-5,2,2,9,-6,63,1,9,-5,2,2,10,-6,63,1,10,-5,2,2],"Top":[-6,-7,511,1,-6,-6,511,1,-6,-5,511,1,-6,-4,511,1,-6,-3,511,1,-6,-2,511,1,-6,-1,511,1,-6,0,511,1,-6,1,511,1,-6,2,511,1,-6,3,511,1,-6,4,511,1,-6,5,511,1,-5,-7,511,1,-5,-6,255,1,-5,-5,219,1,-5,-4,219,1,-5,-3,219,1,-5,-2,219,1,-5,-1,219,1,-5,0,219,1,-5,1,219,1,-5,2,219,1,-5,3,219,1,-5,4,507,1,-5,5,511,1,-4,-7,511,1,-4,4,504,1,-4,5,511,1,-3,-7,511,1,-3,4,504,1,-3,5,511,1,-2,-7,511,1,-2,4,504,1,-2,5,511,1,-1,-7,511,1,-1,4,504,1,-1,5,511,1,0,-7,511,1,0,4,504,1,0,5,511,1,1,-7,511,1,1,4,504,1,1,5,511,1,2,-7,511,1,2,4,504,1,2,5,511,1,3,-7,511,1,3,4,504,1,3,5,511,1,4,-7,511,1,4,4,504,1,4,5,511,1,5,-7,511,1,5,4,504,1,5,5,511,1,6,-7,511,1,6,4,504,1,6,5,511,1,7,-7,511,1,7,4,504,1,7,5,511,1,8,-7,511,1,8,4,504,1,8,5,511,1,9,-7,511,1,9,4,504,1,9,5,511,1,10,-7,511,1,10,4,504,1,10,5,511,1,11,-7,511,1,11,-6,447,1,11,-5,438,1,11,-4,438,1,11,-3,438,1,11,-2,438,1,11,-1,438,1,11,0,438,1,11,1,438,1,11,2,438,1,11,3,438,1,11,4,510,1,11,5,511,1,12,-7,511,1,12,-6,511,1,12,-5,511,1,12,-4,511,1,12,-3,511,1,12,-2,511,1,12,-1,511,1,12,0,511,1,12,1,511,1,12,2,511,1,12,3,511,1,12,4,511,1,12,5,511,1],"CustomFloor1":[],"CustomFloor2":[],"CustomFloor3":[],"CustomMiddle1":[],"CustomMiddle2":[],"CustomTop":[]}
\ No newline at end of file
+{"NavigationVertices":[{"X":202,"Y":-58},{"X":202,"Y":66},{"X":198,"Y":38},{"X":198,"Y":-14},{"X":-58,"Y":66},{"X":170,"Y":38},{"X":38,"Y":-10},{"X":38,"Y":-46},{"X":170,"Y":-14},{"X":-22,"Y":-10},{"X":-58,"Y":-58},{"X":-22,"Y":-46}],"NavigationPolygon":[[0,1,2,3],[2,1,4,5],[6,7,8,5],[6,5,4,9],[9,4,10,11],[11,10,0,7],[8,7,0,3]],"Floor":[3,-2,0,3,2,-2,0,3,-2,-2,0,3,-2,-1,0,3,-1,-1,0,3,0,-1,0,3,1,-1,0,3,2,-1,0,3,3,-1,0,3,3,0,0,3,2,0,0,3,1,0,0,3,0,0,0,3,-1,0,0,3,-2,0,0,3,-2,1,0,3,-1,1,0,3,0,1,0,3,1,1,0,3,2,1,0,3,3,1,0,3,3,-3,0,3,2,-3,0,3,-2,-3,0,3,4,-3,0,3,5,-3,0,3,6,-3,0,3,7,-3,0,3,8,-2,0,3,9,-2,0,3,7,-2,0,3,6,-2,0,3,5,-2,0,3,4,-2,0,3,8,-3,0,3,9,-3,0,3,10,-3,0,3,9,-4,0,3,8,-4,0,3,7,-4,0,3,6,-4,0,3,5,-4,0,3,4,-4,0,3,3,-4,0,3,2,-4,0,3,1,-4,0,3,0,-4,0,3,-1,-4,0,3,-2,-4,0,3,-3,-4,0,3,-3,-3,0,3,-3,-2,0,3,-3,-1,0,3,-3,0,0,3,-3,1,0,3,-4,1,0,3,-4,2,0,3,-3,2,0,3,-2,2,0,3,-1,2,0,3,0,2,0,3,1,2,0,3,2,2,0,3,3,2,0,3,4,2,0,3,4,1,0,3,4,0,0,3,4,-1,0,3,5,-1,0,3,6,-1,0,3,7,-1,0,3,8,-1,0,3,9,-1,0,3,10,-1,0,3,10,-2,0,3,10,0,0,3,9,0,0,3,8,0,0,3,7,0,0,3,6,0,0,3,5,0,0,3,5,1,0,3,6,1,0,3,7,1,0,3,8,1,0,3,9,1,0,3,9,2,0,3,10,2,0,3,8,2,0,3,7,2,0,3,6,2,0,3,5,2,0,3,10,1,0,3,10,3,0,3,9,3,0,3,8,3,0,3,7,3,0,3,6,3,0,3,5,3,0,3,4,3,0,3,3,3,0,3,2,3,0,3,1,3,0,3,0,3,0,3,-1,3,0,3,-2,3,0,3,-3,3,0,3,-4,0,0,3,-4,-1,0,3,-4,-2,0,3,-4,-3,0,3,-4,-4,0,3,-4,3,0,3,10,-4,0,3,12,-4,0,3,12,-3,0,3,12,-2,0,3,11,-2,0,3,11,-3,0,3,11,-4,0,3,12,-1,0,3,12,0,0,3,12,1,0,3,12,2,0,3,12,3,0,3,11,3,0,3,11,2,0,3],"Middle":[-4,-6,63,1,-4,-5,2,2,-3,-6,63,1,-3,-5,2,2,-2,-6,63,1,-2,-5,2,2,-1,-6,63,1,-1,-5,2,2,-1,-3,48,1,-1,-2,1,2,0,-6,63,1,0,-5,2,2,0,-3,56,1,0,-2,2,2,1,-6,63,1,1,-5,2,2,1,-3,24,1,1,-2,3,2,2,-6,63,1,2,-5,2,2,3,-6,63,1,3,-5,2,2,4,-6,63,1,4,-5,2,2,5,-6,63,1,5,-5,2,2,6,-6,63,1,6,-5,2,2,7,-6,63,1,7,-5,2,2,8,-6,63,1,8,-5,2,2,9,-6,63,1,9,-5,2,2,10,-6,63,1,10,-5,2,2,11,-6,63,1,11,-5,2,2,11,0,18,1,11,1,0,2,12,-6,63,1,12,-5,2,2],"Top":[-6,-7,511,1,-6,-6,511,1,-6,-5,511,1,-6,-4,511,1,-6,-3,511,1,-6,-2,511,1,-6,-1,511,1,-6,0,511,1,-6,1,511,1,-6,2,511,1,-6,3,511,1,-6,4,511,1,-6,5,511,1,-5,-7,511,1,-5,-6,255,1,-5,-5,219,1,-5,-4,219,1,-5,-3,219,1,-5,-2,219,1,-5,-1,219,1,-5,0,219,1,-5,1,219,1,-5,2,219,1,-5,3,219,1,-5,4,507,1,-5,5,511,1,-4,-7,511,1,-4,4,504,1,-4,5,511,1,-3,-7,511,1,-3,4,504,1,-3,5,511,1,-2,-7,511,1,-2,4,504,1,-2,5,511,1,-1,-7,511,1,-1,4,504,1,-1,5,511,1,0,-7,511,1,0,4,504,1,0,5,511,1,1,-7,511,1,1,4,504,1,1,5,511,1,2,-7,511,1,2,4,504,1,2,5,511,1,3,-7,511,1,3,4,504,1,3,5,511,1,4,-7,511,1,4,4,504,1,4,5,511,1,5,-7,511,1,5,4,504,1,5,5,511,1,6,-7,511,1,6,4,504,1,6,5,511,1,7,-7,511,1,7,4,504,1,7,5,511,1,8,-7,511,1,8,4,504,1,8,5,511,1,9,-7,511,1,9,4,504,1,9,5,511,1,10,-7,511,1,10,4,504,1,10,5,511,1,11,-7,511,1,11,-1,144,1,11,4,504,1,11,5,511,1,12,-7,511,1,12,4,504,1,12,5,511,1,13,-7,511,1,13,-6,447,1,13,-5,438,1,13,-4,438,1,13,-3,438,1,13,-2,438,1,13,-1,438,1,13,0,438,1,13,1,438,1,13,2,438,1,13,3,438,1,13,4,510,1,13,5,511,1,14,-7,511,1,14,-6,511,1,14,-5,511,1,14,-4,511,1,14,-3,511,1,14,-2,511,1,14,-1,511,1,14,0,511,1,14,1,511,1,14,2,511,1,14,3,511,1,14,4,511,1,14,5,511,1],"CustomFloor1":[],"CustomFloor2":[],"CustomFloor3":[],"CustomMiddle1":[],"CustomMiddle2":[],"CustomTop":[]}
\ No newline at end of file
diff --git a/DungeonShooting_Godot/src/framework/common/NodeExtend.cs b/DungeonShooting_Godot/src/framework/common/NodeExtend.cs
index d355f55..250aea8 100644
--- a/DungeonShooting_Godot/src/framework/common/NodeExtend.cs
+++ b/DungeonShooting_Godot/src/framework/common/NodeExtend.cs
@@ -95,7 +95,7 @@
             return false;
         }
 
-        var size = control.Size * control.Scale;
+        var size = control.Size;
         return pos.X <= size.X - border && pos.Y <= size.Y - border;
     }
 
diff --git a/DungeonShooting_Godot/src/game/manager/ResourcePath.cs b/DungeonShooting_Godot/src/game/manager/ResourcePath.cs
index 3f2bec8..821cfaf 100644
--- a/DungeonShooting_Godot/src/game/manager/ResourcePath.cs
+++ b/DungeonShooting_Godot/src/game/manager/ResourcePath.cs
@@ -74,6 +74,7 @@
     public const string prefab_ui_EditorImportCombination_tscn = "res://prefab/ui/EditorImportCombination.tscn";
     public const string prefab_ui_EditorInfo_tscn = "res://prefab/ui/EditorInfo.tscn";
     public const string prefab_ui_EditorInput_tscn = "res://prefab/ui/EditorInput.tscn";
+    public const string prefab_ui_EditorManager_tscn = "res://prefab/ui/EditorManager.tscn";
     public const string prefab_ui_EditorTips_tscn = "res://prefab/ui/EditorTips.tscn";
     public const string prefab_ui_EditorTools_tscn = "res://prefab/ui/EditorTools.tscn";
     public const string prefab_ui_EditorWindow_tscn = "res://prefab/ui/EditorWindow.tscn";
@@ -125,6 +126,7 @@
     public const string resource_font_VonwaonBitmap16px_ttf = "res://resource/font/VonwaonBitmap-16px.ttf";
     public const string resource_map_tileSet_TileSetConfig_json = "res://resource/map/tileSet/TileSetConfig.json";
     public const string resource_map_tileSet_TileSet1_Main_png = "res://resource/map/tileSet/TileSet1/Main.png";
+    public const string resource_map_tileSet_TileSet1_Test1_png = "res://resource/map/tileSet/TileSet1/Test1.png";
     public const string resource_map_tileSet_TileSet1_TileSet_json = "res://resource/map/tileSet/TileSet1/TileSet.json";
     public const string resource_map_tileSet_TileSet2_Main_png = "res://resource/map/tileSet/TileSet2/Main.png";
     public const string resource_map_tileSet_TileSet2_Test2_png = "res://resource/map/tileSet/TileSet2/Test2.png";
diff --git a/DungeonShooting_Godot/src/game/manager/UiManager_Methods.cs b/DungeonShooting_Godot/src/game/manager/UiManager_Methods.cs
index 420d68e..95de4d9 100644
--- a/DungeonShooting_Godot/src/game/manager/UiManager_Methods.cs
+++ b/DungeonShooting_Godot/src/game/manager/UiManager_Methods.cs
@@ -12,6 +12,7 @@
         public const string EditorImportCombination = "EditorImportCombination";
         public const string EditorInfo = "EditorInfo";
         public const string EditorInput = "EditorInput";
+        public const string EditorManager = "EditorManager";
         public const string EditorTips = "EditorTips";
         public const string EditorTools = "EditorTools";
         public const string EditorWindow = "EditorWindow";
@@ -376,6 +377,54 @@
     }
 
     /// <summary>
+    /// 创建 EditorManager, 并返回UI实例, 该函数不会打开 Ui
+    /// </summary>
+    public static UI.EditorManager.EditorManagerPanel Create_EditorManager()
+    {
+        return CreateUi<UI.EditorManager.EditorManagerPanel>(UiNames.EditorManager);
+    }
+
+    /// <summary>
+    /// 打开 EditorManager, 并返回UI实例
+    /// </summary>
+    public static UI.EditorManager.EditorManagerPanel Open_EditorManager()
+    {
+        return OpenUi<UI.EditorManager.EditorManagerPanel>(UiNames.EditorManager);
+    }
+
+    /// <summary>
+    /// 隐藏 EditorManager 的所有实例
+    /// </summary>
+    public static void Hide_EditorManager()
+    {
+        var uiInstance = Get_EditorManager_Instance();
+        foreach (var uiPanel in uiInstance)
+        {
+            uiPanel.HideUi();
+        }
+    }
+
+    /// <summary>
+    /// 销毁 EditorManager 的所有实例
+    /// </summary>
+    public static void Destroy_EditorManager()
+    {
+        var uiInstance = Get_EditorManager_Instance();
+        foreach (var uiPanel in uiInstance)
+        {
+            uiPanel.Destroy();
+        }
+    }
+
+    /// <summary>
+    /// 获取所有 EditorManager 的实例, 如果没有实例, 则返回一个空数组
+    /// </summary>
+    public static UI.EditorManager.EditorManagerPanel[] Get_EditorManager_Instance()
+    {
+        return GetUiInstance<UI.EditorManager.EditorManagerPanel>(nameof(UI.EditorManager.EditorManager));
+    }
+
+    /// <summary>
     /// 创建 EditorTips, 并返回UI实例, 该函数不会打开 Ui
     /// </summary>
     public static UI.EditorTips.EditorTipsPanel Create_EditorTips()
diff --git a/DungeonShooting_Godot/src/game/ui/editorManager/EditorManager.cs b/DungeonShooting_Godot/src/game/ui/editorManager/EditorManager.cs
new file mode 100644
index 0000000..6edd3bd
--- /dev/null
+++ b/DungeonShooting_Godot/src/game/ui/editorManager/EditorManager.cs
@@ -0,0 +1,313 @@
+namespace UI.EditorManager;
+
+/// <summary>
+/// Ui代码, 该类是根据ui场景自动生成的, 请不要手动编辑该类, 以免造成代码丢失
+/// </summary>
+public abstract partial class EditorManager : UiBase
+{
+    /// <summary>
+    /// 使用 Instance 属性获取当前节点实例对象, 节点类型: <see cref="Godot.Panel"/>, 节点路径: EditorManager.Bg
+    /// </summary>
+    public Bg L_Bg
+    {
+        get
+        {
+            if (_L_Bg == null) _L_Bg = new Bg((EditorManagerPanel)this, GetNode<Godot.Panel>("Bg"));
+            return _L_Bg;
+        }
+    }
+    private Bg _L_Bg;
+
+
+    public EditorManager() : base(nameof(EditorManager))
+    {
+    }
+
+    public sealed override void OnInitNestedUi()
+    {
+
+        var inst1 = L_Bg.L_VBoxContainer.L_TabContainer.L_Map;
+        RecordNestedUi(inst1.L_MapEditorProject.Instance, inst1, UiManager.RecordType.Open);
+        inst1.L_MapEditorProject.Instance.OnCreateUi();
+        inst1.L_MapEditorProject.Instance.OnInitNestedUi();
+
+        var inst2 = L_Bg.L_VBoxContainer.L_TabContainer.L_TileSet;
+        RecordNestedUi(inst2.L_TileSetEditorProject.Instance, inst2, UiManager.RecordType.Open);
+        inst2.L_TileSetEditorProject.Instance.OnCreateUi();
+        inst2.L_TileSetEditorProject.Instance.OnInitNestedUi();
+
+    }
+
+    /// <summary>
+    /// 类型: <see cref="Godot.Button"/>, 路径: EditorManager.Bg.VBoxContainer.Head.Back
+    /// </summary>
+    public class Back : UiNode<EditorManagerPanel, Godot.Button, Back>
+    {
+        public Back(EditorManagerPanel uiPanel, Godot.Button node) : base(uiPanel, node) {  }
+        public override Back Clone() => new (UiPanel, (Godot.Button)Instance.Duplicate());
+    }
+
+    /// <summary>
+    /// 类型: <see cref="Godot.Label"/>, 路径: EditorManager.Bg.VBoxContainer.Head.Title
+    /// </summary>
+    public class Title : UiNode<EditorManagerPanel, Godot.Label, Title>
+    {
+        public Title(EditorManagerPanel uiPanel, Godot.Label node) : base(uiPanel, node) {  }
+        public override Title Clone() => new (UiPanel, (Godot.Label)Instance.Duplicate());
+    }
+
+    /// <summary>
+    /// 类型: <see cref="Godot.Panel"/>, 路径: EditorManager.Bg.VBoxContainer.Head
+    /// </summary>
+    public class Head : UiNode<EditorManagerPanel, Godot.Panel, Head>
+    {
+        /// <summary>
+        /// 使用 Instance 属性获取当前节点实例对象, 节点类型: <see cref="Godot.Button"/>, 节点路径: EditorManager.Bg.VBoxContainer.Back
+        /// </summary>
+        public Back L_Back
+        {
+            get
+            {
+                if (_L_Back == null) _L_Back = new Back(UiPanel, Instance.GetNode<Godot.Button>("Back"));
+                return _L_Back;
+            }
+        }
+        private Back _L_Back;
+
+        /// <summary>
+        /// 使用 Instance 属性获取当前节点实例对象, 节点类型: <see cref="Godot.Label"/>, 节点路径: EditorManager.Bg.VBoxContainer.Title
+        /// </summary>
+        public Title L_Title
+        {
+            get
+            {
+                if (_L_Title == null) _L_Title = new Title(UiPanel, Instance.GetNode<Godot.Label>("Title"));
+                return _L_Title;
+            }
+        }
+        private Title _L_Title;
+
+        public Head(EditorManagerPanel uiPanel, Godot.Panel node) : base(uiPanel, node) {  }
+        public override Head Clone() => new (UiPanel, (Godot.Panel)Instance.Duplicate());
+    }
+
+    /// <summary>
+    /// 类型: <see cref="UI.MapEditorProject.MapEditorProjectPanel"/>, 路径: EditorManager.Bg.VBoxContainer.TabContainer.Map.MapEditorProject
+    /// </summary>
+    public class MapEditorProject : UiNode<EditorManagerPanel, UI.MapEditorProject.MapEditorProjectPanel, MapEditorProject>
+    {
+        public MapEditorProject(EditorManagerPanel uiPanel, UI.MapEditorProject.MapEditorProjectPanel node) : base(uiPanel, node) {  }
+        public override MapEditorProject Clone()
+        {
+            var uiNode = new MapEditorProject(UiPanel, (UI.MapEditorProject.MapEditorProjectPanel)Instance.Duplicate());
+            UiPanel.RecordNestedUi(uiNode.Instance, this, UiManager.RecordType.Open);
+            uiNode.Instance.OnCreateUi();
+            uiNode.Instance.OnInitNestedUi();
+            return uiNode;
+        }
+    }
+
+    /// <summary>
+    /// 类型: <see cref="Godot.MarginContainer"/>, 路径: EditorManager.Bg.VBoxContainer.TabContainer.Map
+    /// </summary>
+    public class Map : UiNode<EditorManagerPanel, Godot.MarginContainer, Map>
+    {
+        /// <summary>
+        /// 使用 Instance 属性获取当前节点实例对象, 节点类型: <see cref="UI.MapEditorProject.MapEditorProjectPanel"/>, 节点路径: EditorManager.Bg.VBoxContainer.TabContainer.MapEditorProject
+        /// </summary>
+        public MapEditorProject L_MapEditorProject
+        {
+            get
+            {
+                if (_L_MapEditorProject == null) _L_MapEditorProject = new MapEditorProject(UiPanel, Instance.GetNode<UI.MapEditorProject.MapEditorProjectPanel>("MapEditorProject"));
+                return _L_MapEditorProject;
+            }
+        }
+        private MapEditorProject _L_MapEditorProject;
+
+        public Map(EditorManagerPanel uiPanel, Godot.MarginContainer node) : base(uiPanel, node) {  }
+        public override Map Clone() => new (UiPanel, (Godot.MarginContainer)Instance.Duplicate());
+    }
+
+    /// <summary>
+    /// 类型: <see cref="UI.TileSetEditorProject.TileSetEditorProjectPanel"/>, 路径: EditorManager.Bg.VBoxContainer.TabContainer.TileSet.TileSetEditorProject
+    /// </summary>
+    public class TileSetEditorProject : UiNode<EditorManagerPanel, UI.TileSetEditorProject.TileSetEditorProjectPanel, TileSetEditorProject>
+    {
+        public TileSetEditorProject(EditorManagerPanel uiPanel, UI.TileSetEditorProject.TileSetEditorProjectPanel node) : base(uiPanel, node) {  }
+        public override TileSetEditorProject Clone()
+        {
+            var uiNode = new TileSetEditorProject(UiPanel, (UI.TileSetEditorProject.TileSetEditorProjectPanel)Instance.Duplicate());
+            UiPanel.RecordNestedUi(uiNode.Instance, this, UiManager.RecordType.Open);
+            uiNode.Instance.OnCreateUi();
+            uiNode.Instance.OnInitNestedUi();
+            return uiNode;
+        }
+    }
+
+    /// <summary>
+    /// 类型: <see cref="Godot.MarginContainer"/>, 路径: EditorManager.Bg.VBoxContainer.TabContainer.TileSet
+    /// </summary>
+    public class TileSet : UiNode<EditorManagerPanel, Godot.MarginContainer, TileSet>
+    {
+        /// <summary>
+        /// 使用 Instance 属性获取当前节点实例对象, 节点类型: <see cref="UI.TileSetEditorProject.TileSetEditorProjectPanel"/>, 节点路径: EditorManager.Bg.VBoxContainer.TabContainer.TileSetEditorProject
+        /// </summary>
+        public TileSetEditorProject L_TileSetEditorProject
+        {
+            get
+            {
+                if (_L_TileSetEditorProject == null) _L_TileSetEditorProject = new TileSetEditorProject(UiPanel, Instance.GetNode<UI.TileSetEditorProject.TileSetEditorProjectPanel>("TileSetEditorProject"));
+                return _L_TileSetEditorProject;
+            }
+        }
+        private TileSetEditorProject _L_TileSetEditorProject;
+
+        public TileSet(EditorManagerPanel uiPanel, Godot.MarginContainer node) : base(uiPanel, node) {  }
+        public override TileSet Clone() => new (UiPanel, (Godot.MarginContainer)Instance.Duplicate());
+    }
+
+    /// <summary>
+    /// 类型: <see cref="Godot.TabContainer"/>, 路径: EditorManager.Bg.VBoxContainer.TabContainer
+    /// </summary>
+    public class TabContainer : UiNode<EditorManagerPanel, Godot.TabContainer, TabContainer>
+    {
+        /// <summary>
+        /// 使用 Instance 属性获取当前节点实例对象, 节点类型: <see cref="Godot.MarginContainer"/>, 节点路径: EditorManager.Bg.VBoxContainer.Map
+        /// </summary>
+        public Map L_Map
+        {
+            get
+            {
+                if (_L_Map == null) _L_Map = new Map(UiPanel, Instance.GetNode<Godot.MarginContainer>("Map"));
+                return _L_Map;
+            }
+        }
+        private Map _L_Map;
+
+        /// <summary>
+        /// 使用 Instance 属性获取当前节点实例对象, 节点类型: <see cref="Godot.MarginContainer"/>, 节点路径: EditorManager.Bg.VBoxContainer.TileSet
+        /// </summary>
+        public TileSet L_TileSet
+        {
+            get
+            {
+                if (_L_TileSet == null) _L_TileSet = new TileSet(UiPanel, Instance.GetNode<Godot.MarginContainer>("TileSet"));
+                return _L_TileSet;
+            }
+        }
+        private TileSet _L_TileSet;
+
+        public TabContainer(EditorManagerPanel uiPanel, Godot.TabContainer node) : base(uiPanel, node) {  }
+        public override TabContainer Clone() => new (UiPanel, (Godot.TabContainer)Instance.Duplicate());
+    }
+
+    /// <summary>
+    /// 类型: <see cref="Godot.VBoxContainer"/>, 路径: EditorManager.Bg.VBoxContainer
+    /// </summary>
+    public class VBoxContainer : UiNode<EditorManagerPanel, Godot.VBoxContainer, VBoxContainer>
+    {
+        /// <summary>
+        /// 使用 Instance 属性获取当前节点实例对象, 节点类型: <see cref="Godot.Panel"/>, 节点路径: EditorManager.Bg.Head
+        /// </summary>
+        public Head L_Head
+        {
+            get
+            {
+                if (_L_Head == null) _L_Head = new Head(UiPanel, Instance.GetNode<Godot.Panel>("Head"));
+                return _L_Head;
+            }
+        }
+        private Head _L_Head;
+
+        /// <summary>
+        /// 使用 Instance 属性获取当前节点实例对象, 节点类型: <see cref="Godot.TabContainer"/>, 节点路径: EditorManager.Bg.TabContainer
+        /// </summary>
+        public TabContainer L_TabContainer
+        {
+            get
+            {
+                if (_L_TabContainer == null) _L_TabContainer = new TabContainer(UiPanel, Instance.GetNode<Godot.TabContainer>("TabContainer"));
+                return _L_TabContainer;
+            }
+        }
+        private TabContainer _L_TabContainer;
+
+        public VBoxContainer(EditorManagerPanel uiPanel, Godot.VBoxContainer node) : base(uiPanel, node) {  }
+        public override VBoxContainer Clone() => new (UiPanel, (Godot.VBoxContainer)Instance.Duplicate());
+    }
+
+    /// <summary>
+    /// 类型: <see cref="Godot.Panel"/>, 路径: EditorManager.Bg
+    /// </summary>
+    public class Bg : UiNode<EditorManagerPanel, Godot.Panel, Bg>
+    {
+        /// <summary>
+        /// 使用 Instance 属性获取当前节点实例对象, 节点类型: <see cref="Godot.VBoxContainer"/>, 节点路径: EditorManager.VBoxContainer
+        /// </summary>
+        public VBoxContainer L_VBoxContainer
+        {
+            get
+            {
+                if (_L_VBoxContainer == null) _L_VBoxContainer = new VBoxContainer(UiPanel, Instance.GetNode<Godot.VBoxContainer>("VBoxContainer"));
+                return _L_VBoxContainer;
+            }
+        }
+        private VBoxContainer _L_VBoxContainer;
+
+        public Bg(EditorManagerPanel uiPanel, Godot.Panel node) : base(uiPanel, node) {  }
+        public override Bg Clone() => new (UiPanel, (Godot.Panel)Instance.Duplicate());
+    }
+
+
+    /// <summary>
+    /// 场景中唯一名称的节点, 节点类型: <see cref="Godot.Button"/>, 节点路径: EditorManager.Bg.VBoxContainer.Head.Back
+    /// </summary>
+    public Back S_Back => L_Bg.L_VBoxContainer.L_Head.L_Back;
+
+    /// <summary>
+    /// 场景中唯一名称的节点, 节点类型: <see cref="Godot.Label"/>, 节点路径: EditorManager.Bg.VBoxContainer.Head.Title
+    /// </summary>
+    public Title S_Title => L_Bg.L_VBoxContainer.L_Head.L_Title;
+
+    /// <summary>
+    /// 场景中唯一名称的节点, 节点类型: <see cref="Godot.Panel"/>, 节点路径: EditorManager.Bg.VBoxContainer.Head
+    /// </summary>
+    public Head S_Head => L_Bg.L_VBoxContainer.L_Head;
+
+    /// <summary>
+    /// 场景中唯一名称的节点, 节点类型: <see cref="UI.MapEditorProject.MapEditorProjectPanel"/>, 节点路径: EditorManager.Bg.VBoxContainer.TabContainer.Map.MapEditorProject
+    /// </summary>
+    public MapEditorProject S_MapEditorProject => L_Bg.L_VBoxContainer.L_TabContainer.L_Map.L_MapEditorProject;
+
+    /// <summary>
+    /// 场景中唯一名称的节点, 节点类型: <see cref="Godot.MarginContainer"/>, 节点路径: EditorManager.Bg.VBoxContainer.TabContainer.Map
+    /// </summary>
+    public Map S_Map => L_Bg.L_VBoxContainer.L_TabContainer.L_Map;
+
+    /// <summary>
+    /// 场景中唯一名称的节点, 节点类型: <see cref="UI.TileSetEditorProject.TileSetEditorProjectPanel"/>, 节点路径: EditorManager.Bg.VBoxContainer.TabContainer.TileSet.TileSetEditorProject
+    /// </summary>
+    public TileSetEditorProject S_TileSetEditorProject => L_Bg.L_VBoxContainer.L_TabContainer.L_TileSet.L_TileSetEditorProject;
+
+    /// <summary>
+    /// 场景中唯一名称的节点, 节点类型: <see cref="Godot.MarginContainer"/>, 节点路径: EditorManager.Bg.VBoxContainer.TabContainer.TileSet
+    /// </summary>
+    public TileSet S_TileSet => L_Bg.L_VBoxContainer.L_TabContainer.L_TileSet;
+
+    /// <summary>
+    /// 场景中唯一名称的节点, 节点类型: <see cref="Godot.TabContainer"/>, 节点路径: EditorManager.Bg.VBoxContainer.TabContainer
+    /// </summary>
+    public TabContainer S_TabContainer => L_Bg.L_VBoxContainer.L_TabContainer;
+
+    /// <summary>
+    /// 场景中唯一名称的节点, 节点类型: <see cref="Godot.VBoxContainer"/>, 节点路径: EditorManager.Bg.VBoxContainer
+    /// </summary>
+    public VBoxContainer S_VBoxContainer => L_Bg.L_VBoxContainer;
+
+    /// <summary>
+    /// 场景中唯一名称的节点, 节点类型: <see cref="Godot.Panel"/>, 节点路径: EditorManager.Bg
+    /// </summary>
+    public Bg S_Bg => L_Bg;
+
+}
diff --git a/DungeonShooting_Godot/src/game/ui/editorManager/EditorManagerPanel.cs b/DungeonShooting_Godot/src/game/ui/editorManager/EditorManagerPanel.cs
new file mode 100644
index 0000000..03876cc
--- /dev/null
+++ b/DungeonShooting_Godot/src/game/ui/editorManager/EditorManagerPanel.cs
@@ -0,0 +1,18 @@
+using Godot;
+
+namespace UI.EditorManager;
+
+public partial class EditorManagerPanel : EditorManager
+{
+
+    public override void OnCreateUi()
+    {
+        
+    }
+
+    public override void OnDestroyUi()
+    {
+        
+    }
+
+}
diff --git a/DungeonShooting_Godot/src/game/ui/mapEditor/tileView/EditorTileMap.cs b/DungeonShooting_Godot/src/game/ui/mapEditor/tileView/EditorTileMap.cs
index 38a0517..1434c94 100644
--- a/DungeonShooting_Godot/src/game/ui/mapEditor/tileView/EditorTileMap.cs
+++ b/DungeonShooting_Godot/src/game/ui/mapEditor/tileView/EditorTileMap.cs
@@ -105,8 +105,9 @@
     private bool _initLayer = false;
 
     //--------- 配置数据 -------------
-    private int _terrainSet = 0;
-    private int _terrain = 0;
+    private int _mainSource = 0;
+    private int _mainTerrainSet = 0;
+    private int _mainTerrain = 0;
     private AutoTileConfig _autoTileConfig;
 
     /// <summary>
@@ -792,6 +793,8 @@
                 foreach (var item in CurrBrush)
                 {
                     SetCell(CurrLayer.Layer, position + item + _brushOffset, CurrSourceIndex, item);
+                    //标记有修改数据
+                    EventManager.EmitEvent(EventEnum.OnTileMapDirty);
                 }
             }
         }
@@ -843,6 +846,8 @@
         else //自定义层
         {
             EraseCell(CurrLayer.Layer, position);
+            //标记有修改数据
+            EventManager.EmitEvent(EventEnum.OnTileMapDirty);
         }
     }
     
@@ -1014,7 +1019,7 @@
         }
         var arr = new Array<Vector2I>(list);
         //绘制自动图块
-        SetCellsTerrainConnect(MapLayer.AutoFloorLayer, arr, _terrainSet, _terrain, false);
+        SetCellsTerrainConnect(MapLayer.AutoFloorLayer, arr, _mainTerrainSet, _mainTerrain, false);
         
         //擦除临时边界
         for (var i = 0; i < temp1.Count; i++)
@@ -1088,7 +1093,7 @@
                         continue;
                     }
                     EraseCell(MapLayer.AutoFloorLayer, pos);
-                    SetCell(layer, pos, CurrSourceIndex, atlasCoords);
+                    SetCell(layer, pos, _mainSource, atlasCoords);
                 }
             }
         }
diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorMapTile/FreeTileTab.cs b/DungeonShooting_Godot/src/game/ui/mapEditorMapTile/FreeTileTab.cs
index 9165e15..1d54ce1 100644
--- a/DungeonShooting_Godot/src/game/ui/mapEditorMapTile/FreeTileTab.cs
+++ b/DungeonShooting_Godot/src/game/ui/mapEditorMapTile/FreeTileTab.cs
@@ -55,7 +55,7 @@
 
         if (@event is InputEventMouseButton mouseButton)
         {
-            if (mouseButton.ButtonIndex == MouseButton.Left)
+            if (mouseButton.ButtonIndex == MouseButton.Left && UiNode.L_TabRoot.Instance.IsMouseInRect())
             {
                 _leftPressed = mouseButton.Pressed;
                 if (_leftPressed)
@@ -71,7 +71,7 @@
                 }
             }
         }
-        else if (_leftPressed && @event is InputEventMouseMotion)
+        else if (_leftPressed && @event is InputEventMouseMotion && UiNode.L_TabRoot.Instance.IsMouseInRect())
         {
             //多选格子
             var atlasCoords = Utils.GetMouseCellPosition(UiNode.L_TabRoot.Instance);