浏览代码

关卡编辑器波次增减功能与出怪表绑定

wgl 6 月之前
父节点
当前提交
1472ff4df3

+ 34 - 17
ActionTowerDefense/Assets/GameLevelEditor/GameMap/CoreScripts/Editor/GameMapEditor.cs

@@ -707,13 +707,13 @@ public class GameMapEditor : EditorWindow
 		Tables allCfgData = new Tables(Loader);
 		List<SingleCreateEnemyConfig> cfgCreateEnemy = allCfgData.CfgCreateEnemy.DataList;
 
+		//导入关卡数据
         if (mapIdx >= excelWorksheets.Count)
         {
 			mapIdx = 0;
 		}
 		if (asset.maps.Count > excelWorksheets.Count)
         {
-			
 			for(int i = asset.maps.Count - 1; i>= excelWorksheets.Count; i--)
             {
 				asset.RemoveMapAtIndex(i);
@@ -733,6 +733,28 @@ public class GameMapEditor : EditorWindow
 		mapSize_w = asset.maps[mapIdx].width;
 		mapSize_h = asset.maps[mapIdx].height;
 
+		//导入波次数据
+		currLayer = -1;
+		int mapId = -1;
+		String waveName = "";
+		for(int i = 0; i < cfgCreateEnemy.Count; i++)
+        {
+			if(cfgCreateEnemy[i].WaveName == "这一行不要动")
+            {
+				mapId++;
+				ArrayUtility.Clear(ref asset.maps[mapId].layers);
+				continue;
+            }
+			if(cfgCreateEnemy[i].WaveName != waveName)
+            {
+				waveName = cfgCreateEnemy[i].WaveName;
+                ArrayUtility.Add(ref asset.maps[mapId].layers, new GameMapLayer());
+                asset.maps[mapId].InitLayer(asset.maps[mapId].layers.Length);
+            }
+		}
+
+
+		doRepaint = true;
 		Debug.Log("出怪表导入成功!");
 	}
 
@@ -796,18 +818,16 @@ public class GameMapEditor : EditorWindow
 				r.x = r.xMax - 28f; r.width = 25f; r.height = 15f;
 
 				GUI.enabled = currLayer >= 0;
+				GameMap gameMap = asset.maps[mapIdx];
 				if (GUI.Button(r, GC_rem, EditorStyles.miniButtonRight))
 				{
-					Undo.RecordObject(asset, "Remove Layer");
-					//foreach (GameMapTile tile in asset.tileAsset.tiles)
-					//{
-					//	if (currLayer<tile.spawnTime.Count && tile.spawnTime[currLayer].curLayer == asset.maps[mapIdx].layers[currLayer].name)
-					//	{
-					//		tile.spawnTime.RemoveAt(currLayer);
-					//	}
 
-					//}
-					ArrayUtility.RemoveAt(ref asset.maps[mapIdx].layers, currLayer);
+					ExcelEditor.RemoveExcelRows(enemyExcelPath, gameMap.ident, (ws, row) =>
+					{
+						return ws.Cells[row, 2].Text == gameMap.layers[currLayer].name;
+					});
+					Undo.RecordObject(asset, "Remove Layer");
+					ArrayUtility.RemoveAt(ref gameMap.layers, currLayer);
 
 					EditorUtility.SetDirty(asset);
 					currLayer--;
@@ -817,14 +837,11 @@ public class GameMapEditor : EditorWindow
 				GUI.enabled = true;
 				if (GUI.Button(r, GC_add, EditorStyles.miniButtonLeft))
 				{
-
+					int length = gameMap.layers.Length + 1;
+					ExcelEditor.ModifyExcel(enemyExcelPath, gameMap.ident, $"B{length + 8}", length);
 					Undo.RecordObject(asset, "Add Layer");
-					ArrayUtility.Add(ref asset.maps[mapIdx].layers, new GameMapLayer());
-					asset.maps[mapIdx].InitLayer(asset.maps[mapIdx].layers.Length);
-					//foreach (GameMapTile tile in asset.tileAsset.tiles)
-					//{
-					//	tile.spawnTime.Add(new SpawnTimeList());
-					//}
+					ArrayUtility.Add(ref gameMap.layers, new GameMapLayer());
+					gameMap.InitLayer(length);
 					EditorUtility.SetDirty(asset);
 					doRepaint = true;
 				}

+ 3 - 11
ActionTowerDefense/Assets/GameLevelEditor/GameMap/CoreScripts/GameMap.cs

@@ -169,17 +169,9 @@ public class GameMap
     /// idx=0 refers to the grid[] while anything higher will be layers[idx-1].grid </summary>
     public void InitLayer(int idx)
     {
-        if (idx == 0)
-        {
-            grid = new int[width * height];
-            ClearLayer(0);
-        }
-        else
-        {
-            layers[idx-1].grid = new int[width * height];
-            ClearLayer(idx);
-        }
-    }
+		layers[idx-1].grid = new int[width * height];
+		ClearLayer(idx);
+	}
 
     /// <summary> idx=0 refers to the grid[] while anything higher will be layers[idx-1].grid </summary>
     public void ClearLayer(int idx)

+ 30 - 0
ActionTowerDefense/Assets/Scripts/ExcelEditor.cs

@@ -3,6 +3,7 @@ using System.Collections.Generic;
 using UnityEngine;
 using OfficeOpenXml;
 using System.IO;
+using System;
 
 public class ExcelEditor
 {
@@ -63,4 +64,33 @@ public class ExcelEditor
             package.Save();
         }
     }
+
+    //删除符合条件的几行数据
+    public static void RemoveExcelRows(string filePath, string sheetMame, Func<ExcelWorksheet, int, bool> rowCondition)
+    {
+        FileInfo fileInfo = new FileInfo(filePath);
+
+        using (ExcelPackage package = new ExcelPackage(fileInfo))
+        {
+            ExcelWorksheet worksheet = package.Workbook.Worksheets[sheetMame];
+            int rowCount = worksheet.Dimension.Rows;
+            int deletedRows = 0;
+
+            // 从最后一行开始遍历,避免索引问题
+            for (int row = rowCount; row >= 1; row--)
+            {
+                if (rowCondition(worksheet, row))
+                {
+                    worksheet.DeleteRow(row);
+                    deletedRows++;
+                }
+            }
+
+            if (deletedRows > 0)
+            {
+                package.Save();
+                Debug.Log($"已删除 {deletedRows} 行");
+            }
+        }
+    }
 }

二进制
ActionTowerDefense/Luban/Config/Datas/出怪表.xlsx