Explorar el Código

怪物表和编辑器适配

WGL hace 2 meses
padre
commit
3f4bcfb2fa

+ 21 - 20
ActionTowerDefense/Assets/GameLevelEditor/GameMap/CoreScripts/Editor/GameMapEdPopup.cs

@@ -112,6 +112,7 @@ public class GameMapEdPopup : PopupWindowContent
 		editorWindow.Close();
 	}
 
+	//另存一个新的关卡
 	void SaveAsNewCreateEnemyData()
     {
 		GameMap gameMap = GameMapEditor.asset.maps[GameMapEditor.mapIdx];
@@ -139,6 +140,7 @@ public class GameMapEdPopup : PopupWindowContent
 
 	}
 
+	//保存关卡数据
 	void SaveCreateEnemyData(int mapIdx, bool isNew = false)
 	{
 		GameMap gameMap = GameMapEditor.asset.maps[GameMapEditor.mapIdx];
@@ -155,10 +157,11 @@ public class GameMapEdPopup : PopupWindowContent
 					return;
 				}
 			}
-			ExcelEditor.RemoveExcelRows(package, gameMap.showIdent, 10, 500);
-			ExcelEditor.ModifyExcel(package, gameMap.showIdent, "D5", GameMapEditor.mapSize_w.ToString());
-			ExcelEditor.ModifyExcel(package, gameMap.showIdent, "D6", GameMapEditor.mapSize_h.ToString());
-			ExcelEditor.ModifyExcel(package, gameMap.showIdent, "F5", gameMap.expRatio.ToString());
+			ExcelWorksheet worksheet = package.Workbook.Worksheets[gameMap.showIdent];
+			ExcelEditor.RemoveExcelRows(worksheet, 10, 500);
+			worksheet.Cells["D5"].Value = GameMapEditor.mapSize_w;
+			worksheet.Cells["D6"].Value = GameMapEditor.mapSize_h;
+			worksheet.Cells["F6"].Value = $"{gameMap.expRatio:F2}";
 
 			int cell_row = 10;
 			float idFloat = 0f;
@@ -167,22 +170,22 @@ public class GameMapEdPopup : PopupWindowContent
             {
 				GameMapLayer layer = gameMap.layers[i];
 
-				ExcelEditor.ModifyExcel(package, gameMap.showIdent, $"C{cell_row}", layer.name);
+				worksheet.Cells[$"C{cell_row}"].Value = layer.name;
 				switch (layer.waveType) 
 				{
 					case WaveType.Common:
-						ExcelEditor.ModifyExcel(package, gameMap.showIdent, $"D{cell_row}", layer.duration.ToString());
+						worksheet.Cells[$"D{cell_row}"].Value = layer.duration;
 						idInt++;
 						break;
 					case WaveType.FromTower:
-						ExcelEditor.ModifyExcel(package, gameMap.showIdent, $"E{cell_row}", layer.buildingId);
-						ExcelEditor.ModifyExcel(package, gameMap.showIdent, $"F{cell_row}", layer.buildingHp.ToString());
+						worksheet.Cells[$"E{cell_row}"].Value = layer.buildingId;
+						worksheet.Cells[$"F{cell_row}"].Value = $"{layer.buildingHp:F2}";
 						idFloat += 0.01f;
 						break;
 					case WaveType.Tower:
 						if(i == 0)
                         {
-							ExcelEditor.ModifyExcel(package, gameMap.showIdent, $"D{cell_row}", layer.duration.ToString());
+							worksheet.Cells[$"D{cell_row}"].Value = layer.duration;
 						}
 						break;
 				}
@@ -205,18 +208,18 @@ public class GameMapEdPopup : PopupWindowContent
 					switch (layer.waveType)
 					{
 						case WaveType.Common:
-							ExcelEditor.ModifyExcel(package, gameMap.showIdent, $"B{cell_row}", idInt.ToString());
+							worksheet.Cells[$"B{cell_row}"].Value = idInt;
 							break;
 						case WaveType.Tower:
-							ExcelEditor.ModifyExcel(package, gameMap.showIdent, $"B{cell_row}", "0");
-							ExcelEditor.ModifyExcel(package, gameMap.showIdent, $"C{cell_row}", layer.name);
+							worksheet.Cells[$"B{cell_row}"].Value = 0;
+							worksheet.Cells[$"C{cell_row}"].Value = layer.name;
 							break;
 						case WaveType.FromTower:
-							ExcelEditor.ModifyExcel(package, gameMap.showIdent, $"B{cell_row}", $"{idFloat:F2}");
+							worksheet.Cells[$"B{cell_row}"].Value = $"{idFloat:F2}";
 							break;
 					}
+					worksheet.Cells[$"G{cell_row}"].Value = Asset.tileAsset.GetTile(spawnTime.id).name;
 
-					ExcelEditor.ModifyExcel(package, gameMap.showIdent, $"G{cell_row}", Asset.tileAsset.GetTile(spawnTime.id).name);
 					string posString = "";
 					for (int k = 0; k < spawnTime.pos.Count; k++)
 					{
@@ -241,14 +244,12 @@ public class GameMapEdPopup : PopupWindowContent
 						}
 						posString += ",";
 					}
-					ExcelEditor.ModifyExcel(package, gameMap.showIdent, $"H{cell_row}", posString);
-					ExcelEditor.ModifyExcel(package, gameMap.showIdent, $"I{cell_row}", spawnTime.startTime.ToString());
-					ExcelEditor.ModifyExcel(package, gameMap.showIdent, $"J{cell_row}", spawnTime.endTime.ToString());
-					ExcelEditor.ModifyExcel(package, gameMap.showIdent, $"K{cell_row}", spawnTime.num.ToString());
+					worksheet.Cells[$"H{cell_row}"].Value = posString;
+					worksheet.Cells[$"I{cell_row}"].Value = spawnTime.startTime;
+					worksheet.Cells[$"J{cell_row}"].Value = spawnTime.endTime;
+					worksheet.Cells[$"K{cell_row}"].Value = spawnTime.num;
 					cell_row++;
 				}
-
-
 			}
 			try
 			{

+ 62 - 95
ActionTowerDefense/Assets/GameLevelEditor/GameMap/CoreScripts/Editor/GameMapEditor.cs

@@ -1157,7 +1157,7 @@ public class GameMapEditor : EditorWindow
 				r.width = 80;
                 if (GUI.Button(r, GC_reload, EditorStyles.miniButton))
                 {
-					ReloadEnemyExcelData(enemyExcelPath);
+					ReloadEnemyExcelData();
 				}
 
 				r.x -= 65f;
@@ -1234,7 +1234,7 @@ public class GameMapEditor : EditorWindow
 	}
 
 	//读取怪物表数据
-	void ReloadEnemyExcelData(string path)
+	void ReloadEnemyExcelData()
     {
 		ExcelEditor.RunBat();
 		for (int i = asset.tileAsset.tiles.Count - 1; i>=0 ; i--)
@@ -1250,51 +1250,30 @@ public class GameMapEditor : EditorWindow
 		Tables allCfgData = new Tables(ExcelEditor.Loader);
 		int id = 0;
 
-		List<string> excelsSheets = new();
-		FileInfo fileInfo = new FileInfo(createEnemyExcelPath);
-		using (ExcelPackage package = new ExcelPackage(fileInfo))
+		foreach (var item in allCfgData.CfgEnemy.DataMap)
 		{
-			excelsSheets = ExcelEditor.ReadExcelSheetsInfo(package);
-			foreach (var item in allCfgData.CfgEnemy.DataMap)
-			{
-				SingleEnemyConfig cfgEnemy = item.Value;
-				asset.tileAsset.AddTile();
-				GameMapTile tile = asset.tileAsset.tiles[asset.tileAsset.tiles.Count - 1];
-
-				Sprite sprite = AssetDatabase.LoadAssetAtPath<Sprite>($"Assets/GameLevelEditor/Ui_Textures/{cfgEnemy.SpriteName}.png");
-				tile.name = cfgEnemy.Name;
-				foreach (var sheetName in excelsSheets)
-				{
-					ExcelEditor.ModifyExcel(package, sheetName, 7, 3 + id, tile.name);
-				}
-
-				tile.sprite = sprite;
-				ColorUtility.TryParseHtmlString(cfgEnemy.Color, out tile.color);
-				Enum.TryParse(cfgEnemy.Type, out tile.type);
-				Enum.TryParse(cfgEnemy.EnemyPrefab, out tile.ch);
-				tile.radius = new Vector2(cfgEnemy.Radius[0], cfgEnemy.Radius[1]);
-				tile.parameter.HP = cfgEnemy.HP;
-				tile.parameter.Attack_summon = cfgEnemy.AttackSummon;
-				tile.parameter.Attack_march = new List<int>(cfgEnemy.AttackMarch);
-				tile.parameter.MinMoveSpeed = cfgEnemy.MinMoveSpeed;
-				tile.parameter.MaxMoveSpeed = cfgEnemy.MaxMoveSpeed;
-
-				TileDef def = new TileDef() { id = tile.id };
-				UpdateCachedValues(def, tile, false);
-				tileCache.Add(def.id, def);
-				id++;
-			}
-			for (int i = 0; i < 100; i++)
-			{
-				foreach (var sheetName in excelsSheets)
-				{
-					ExcelEditor.ModifyExcel(package, sheetName, 7, 3 + id + i, "");
-				}
-			}
+			SingleEnemyConfig cfgEnemy = item.Value;
+			asset.tileAsset.AddTile();
+			GameMapTile tile = asset.tileAsset.tiles[asset.tileAsset.tiles.Count - 1];
+
+			Sprite sprite = AssetDatabase.LoadAssetAtPath<Sprite>($"Assets/GameLevelEditor/Ui_Textures/{cfgEnemy.SpriteName}.png");
+			tile.name = cfgEnemy.Name;
+			tile.sprite = sprite;
+			ColorUtility.TryParseHtmlString(cfgEnemy.Color, out tile.color);
+			Enum.TryParse(cfgEnemy.Type, out tile.type);
+			tile.prefab = cfgEnemy.EnemyPrefab;
+			tile.radius = new Vector2(cfgEnemy.Radius[0], cfgEnemy.Radius[1]);
+			tile.parameter.HP = cfgEnemy.HP;
+			tile.parameter.Attack_summon = cfgEnemy.AttackSummon;
+			tile.parameter.Attack_march = new List<int>(cfgEnemy.AttackMarch);
+			tile.parameter.MinMoveSpeed = cfgEnemy.MinMoveSpeed;
+			tile.parameter.MaxMoveSpeed = cfgEnemy.MaxMoveSpeed;
 
-			package.Save();
+			TileDef def = new TileDef() { id = tile.id };
+			UpdateCachedValues(def, tile, false);
+			tileCache.Add(def.id, def);
+			id++;
 		}
-
 		doRepaint = true;
 		Debug.Log("怪物表数据导入完毕!");
 	}
@@ -1303,74 +1282,62 @@ public class GameMapEditor : EditorWindow
 	void SaveToEnemyExcel()
 	{
 		string path = enemyExcelPath;
-		List<string> excelsSheets = new();
-		FileInfo fileInfo = null;
-		for (int i = 0; i < 9; i++)
+		FileInfo fileInfo = new FileInfo(path);
+		using (ExcelPackage package = new ExcelPackage(fileInfo))
         {
-			fileInfo = new FileInfo(createEnemyExcelPath + $"/出怪表{i}.xlsx");
-			using (ExcelPackage package = new ExcelPackage(fileInfo))
+			ExcelWorksheet worksheet = package.Workbook.Worksheets[1];
+			ExcelEditor.RemoveExcelRowsFrom(worksheet, 6);
+			worksheet.Cells["A6"].Value = "##";
+			worksheet.Cells["B6"].Value = "小怪";
+			worksheet.Cells["A7"].Value = "##";
+			worksheet.Cells["B7"].Value = "阴灵";
+			worksheet.Cells["A8"].Value = "##";
+			worksheet.Cells["B8"].Value = "Boss";
+			ExcelEditor.SetMultipleRowsBackgroundColor(worksheet, 6, 8, System.Drawing.Color.FromArgb(191, 191, 191));
+			List<int> rowIndex = new List<int> { 6, 7, 8, 9 };
+			for (int i = 0; i < asset.tileAsset.tiles.Count; i++)
 			{
-				excelsSheets = ExcelEditor.ReadExcelSheetsInfo(package);
-				for (int j = 0; j < asset.tileAsset.tiles.Count; j++)
-				{
-					GameMapTile tile = asset.tileAsset.tiles[j];
-					foreach (var sheetName in excelsSheets)
-					{
-						ExcelEditor.ModifyExcel(package, sheetName, 7, 3 + j, tile.name);
-					}
-				}
-				for (int j = 0; j < 100; j++)
-				{
-					foreach (var sheetName in excelsSheets)
-					{
-						ExcelEditor.ModifyExcel(package, sheetName, 7, 3 + asset.tileAsset.tiles.Count + j, "");
-					}
-				}
-                try
+				GameMapTile tile = asset.tileAsset.tiles[i];
+				int rowId = rowIndex[(int)tile.type - 1];
+				worksheet.InsertRow(rowId, 1);
+				for(int j = (int)tile.type - 1; j < 4; j++)
                 {
-                    package.Save();
+					rowIndex[j]++;
                 }
-                catch (System.InvalidOperationException e)
+				worksheet.Cells[$"B{rowId}"].Value = tile.name;
+				worksheet.Cells[$"C{rowId}"].Value = tile.sprite.name;
+				worksheet.Cells[$"D{rowId}"].Value = $"#{ColorUtility.ToHtmlStringRGB(tile.color)}";
+				worksheet.Cells[$"E{rowId}"].Value = Enum.GetName(typeof(GameMapTile.Type), tile.type);
+				worksheet.Cells[$"F{rowId}"].Value = tile.prefab;
+				worksheet.Cells[$"G{rowId}"].Value = $"{tile.radius.x},{tile.radius.y}";
+				if(tile.type != GameMapTile.Type.Boss)
                 {
-                    Debug.LogError($"出怪表未关闭请重试");
-                    Debug.LogException(e);
-                    return;
-                }
-            }
-		}
+					worksheet.Cells[$"H{rowId}"].Value = tile.parameter.HP;
+					worksheet.Cells[$"I{rowId}"].Value = tile.parameter.Attack_summon;
+					string attack_marchStr = $"{tile.parameter.Attack_march[0]}";
+					for(int j = 1; j < tile.parameter.Attack_march.Count; j++)
+                    {
+						attack_marchStr += $",{tile.parameter.Attack_march[j]}";
+                    }
+					worksheet.Cells[$"J{rowId}"].Value = attack_marchStr;
+					worksheet.Cells[$"K{rowId}"].Value = $"{tile.parameter.MinMoveSpeed:F2}";
+					worksheet.Cells[$"L{rowId}"].Value = $"{tile.parameter.MaxMoveSpeed:F2}";
 
-		fileInfo = new FileInfo(path);
-		using (ExcelPackage package = new ExcelPackage(fileInfo))
-        {
-			for (int i = 0; i < asset.tileAsset.tiles.Count; i++)
-			{
-				GameMapTile tile = asset.tileAsset.tiles[i];
-				ExcelEditor.ModifyExcel(package, "CfgEnemy", $"B{8 + i}", tile.name);
-				ExcelEditor.ModifyExcel(package, "CfgEnemy", $"C{8 + i}", tile.sprite.name);
-				ExcelEditor.ModifyExcel(package, "CfgEnemy", $"D{8 + i}", $"#{ColorUtility.ToHtmlStringRGB(tile.color)}");
-				ExcelEditor.ModifyExcel(package, "CfgEnemy", $"E{8 + i}", Enum.GetName(typeof(GameMapTile.Type), tile.type));
-				ExcelEditor.ModifyExcel(package, "CfgEnemy", $"F{8 + i}", Enum.GetName(typeof(GameMapTile.CH), tile.ch));
-				ExcelEditor.ModifyExcel(package, "CfgEnemy", $"G{8 + i}", $"{tile.radius.x},{tile.radius.y}");
-				ExcelEditor.ModifyExcel(package, "CfgEnemy", $"H{8 + i}", tile.parameter.HP.ToString());
-				ExcelEditor.ModifyExcel(package, "CfgEnemy", $"I{8 + i}", tile.parameter.Attack_summon.ToString());
-				ExcelEditor.ModifyExcel(package, "CfgEnemy", $"J{8 + i}", tile.parameter.Attack_march.ToString());
-				ExcelEditor.ModifyExcel(package, "CfgEnemy", $"K{8 + i}", tile.parameter.MinMoveSpeed.ToString());
-				ExcelEditor.ModifyExcel(package, "CfgEnemy", $"L{8 + i}", tile.parameter.MaxMoveSpeed.ToString());
+				}
 			}
-			ExcelEditor.RemoveExcelRows(package, "CfgEnemy", 8 + asset.tileAsset.tiles.Count, 108 + asset.tileAsset.tiles.Count);
 			try
 			{
 				package.Save();
+				ExcelEditor.RunBat();
+				Debug.Log("怪物表数据保存完毕!");
 			}
 			catch (System.InvalidOperationException e)
 			{
-				Debug.LogError($"怪物表未关闭请重试");
+				EditorUtility.DisplayDialog("Error", $"怪物表未关闭或出现其他错误。\n\n{e}", "OK");
 				Debug.LogException(e);
 				return;
 			}
 		}
-		ExcelEditor.RunBat();
-		Debug.Log("怪物表数据保存完毕!");
 	}
 
 	private void OnAutoTileChange(int idx)

+ 3 - 18
ActionTowerDefense/Assets/GameLevelEditor/GameMap/CoreScripts/GameMapTile.cs

@@ -43,24 +43,9 @@ public class GameMapTile
 	//	(of course the demo script makes use of them so update it too)
 	//	Remember to add/remove fields to CopyTo() function too
 
-	public enum Type { Null = 0,  Tower=1, Enemy=2}
+	public enum Type { Null = 0,  Tower=1, Enemy=2, ESpirits = 3, Boss = 4}
 	public Type type = Type.Null;   // the runtime might use something like this to identify what the placed tile means
-    public enum CH { 
-		Tower, 
-		EnemyTower,
-		Enemy_1001, 
-		Enemy_1002, 
-		Enemy_1003, 
-		Enemy_1004,
-		Enemy_1005, 
-		Enemy_1006, 
-		Enemy_1007, 
-		Enemy_1013, 
-		Enemy_1014, 
-		Enemy_Polliwog,
-		ESpirits_Assassin
-	};            // this value could depend on the chosen type. For example, if NPC then this could indicate which NPC prefab to spawn from an array of NPC prefabs.
-    public CH ch;
+    public string prefab;
 
 	public Vector2 radius;
 	
@@ -79,7 +64,7 @@ public class GameMapTile
 		t.id = id;
 		t.sprite = sprite;
 		t.type = type;
-		t.ch = ch;
+		t.prefab = prefab;
 		t.color = color;
 		t.radius = radius;
 		t.name = name;

+ 1 - 1
ActionTowerDefense/Assets/GameLevelEditor/GameMap/Sample/Scripts/Main.cs

@@ -157,7 +157,7 @@ public class Main : MonoBehaviour
 				{
 					GameMapTile t = mapsAsset.tileAsset.GetTile(grid[idx++]);
 					if (t == null) continue;
-					SpriteRenderer ren = new GameObject($"{t.ch}").AddComponent<SpriteRenderer>();
+					SpriteRenderer ren = new GameObject(t.prefab).AddComponent<SpriteRenderer>();
 					ren.sprite = t.sprite;
 					switch (t.type)
 					{

+ 23 - 5
ActionTowerDefense/Assets/Gen/SingleEnemyConfig.cs

@@ -54,30 +54,48 @@ public sealed partial class SingleEnemyConfig :  Bright.Config.BeanBase
     }
 
     /// <summary>
-    /// 角色类型汇总:
+    /// 角色
     /// </summary>
     public string Name { get; private set; }
     /// <summary>
-    /// Enemy
+    /// 图标名
     /// </summary>
     public string SpriteName { get; private set; }
     /// <summary>
-    /// Tower
+    /// 图标颜色
     /// </summary>
     public string Color { get; private set; }
     /// <summary>
-    /// ESpirits
+    /// 角色类型
     /// </summary>
     public string Type { get; private set; }
     /// <summary>
-    /// Boss
+    /// 怪物Prefab
     /// </summary>
     public string EnemyPrefab { get; private set; }
+    /// <summary>
+    /// 刷新范围
+    /// </summary>
     public System.Collections.Generic.List<int> Radius { get; private set; }
+    /// <summary>
+    /// 基础血量
+    /// </summary>
     public int HP { get; private set; }
+    /// <summary>
+    /// 起手式攻击力
+    /// </summary>
     public int AttackSummon { get; private set; }
+    /// <summary>
+    /// 行军式攻击力
+    /// </summary>
     public System.Collections.Generic.List<int> AttackMarch { get; private set; }
+    /// <summary>
+    /// 最小移动速度
+    /// </summary>
     public float MinMoveSpeed { get; private set; }
+    /// <summary>
+    /// 最大移动速度
+    /// </summary>
     public float MaxMoveSpeed { get; private set; }
 
     public const int __ID__ = 491839330;

+ 44 - 21
ActionTowerDefense/Assets/Scripts/ExcelEditor.cs

@@ -6,6 +6,7 @@ using System;
 using SimpleJSON;
 using System.Diagnostics;
 using UnityEngine;
+using OfficeOpenXml.Style;
 
 /*使用方法
     using System.IO;
@@ -68,13 +69,15 @@ public class ExcelEditor
         return value?.ToString() ?? string.Empty;
     }
 
-    //修改excel文件(地址索引)
-    public static bool ModifyExcel(ExcelPackage package, string sheetMame, string cellId, string newData)
+    //删除连续多行数据[start_row, end_row]
+    public static bool RemoveExcelRows(ExcelWorksheet worksheet, int start_row, int end_row)
     {
         try
         {
-            ExcelWorksheet worksheet = package.Workbook.Worksheets[sheetMame];
-            worksheet.Cells[cellId].Value = newData; // 通过单元格地址
+            for (int i = end_row; i >= start_row; i--)
+            {
+                worksheet.DeleteRow(i);
+            }
             return true;
         }
         catch (System.InvalidOperationException e)
@@ -89,58 +92,78 @@ public class ExcelEditor
         }
     }
 
-    //修改excel文件(行列索引)
-    public static bool ModifyExcel(ExcelPackage package, string sheetMame, int cell_row, int cell_column, string newData)
+    //删除从指定行开始到末尾所有行
+    public static void RemoveExcelRowsFrom(ExcelWorksheet worksheet, int startRow)
     {
         try
         {
-            ExcelWorksheet worksheet = package.Workbook.Worksheets[sheetMame];
-            worksheet.Cells[cell_row, cell_column].Value = newData; // 通过行列索引
-            return true;
+            int endRow = worksheet.Dimension.End.Row;
+            for (int i = endRow; i >= startRow; i--)
+            {
+                worksheet.DeleteRow(i);
+            }
         }
         catch (System.InvalidOperationException e)
         {
             UnityEngine.Debug.LogError($"请关闭Excel后重试");
-            UnityEngine.Debug.LogException(e);
-            return false;
         }
         catch (System.Exception e)
         {
             UnityEngine.Debug.LogException(e);
-            return false;
         }
     }
-
-    //删除连续多行数据[start_row, end_row]
-    public static bool RemoveExcelRows(ExcelPackage package, string sheetMame, int start_row, int end_row)
+    //清空从指定行开始到末尾所有行
+    public static void ClearExcelRowsFrom(ExcelWorksheet worksheet, int startRow)
     {
-        ExcelWorksheet worksheet = package.Workbook.Worksheets[sheetMame];
         try
         {
-            for (int i = end_row; i >= start_row; i--)
+            int endRow = worksheet.Dimension.End.Row;
+            int endCol = worksheet.Dimension.End.Column;
+            var cellsToClear = worksheet.Cells[startRow, 1, endRow, endCol];
+            foreach (var cell in cellsToClear)
             {
-                worksheet.DeleteRow(i);
+                cell.Value = null;
+                cell.Formula = null;
             }
-            return true;
         }
         catch (System.InvalidOperationException e)
         {
             UnityEngine.Debug.LogError($"请关闭Excel后重试");
-            return false;
         }
         catch (System.Exception e)
         {
             UnityEngine.Debug.LogException(e);
-            return false;
         }
     }
 
+
+
     //读取excel的jason参数
     public static JSONNode Loader(string fileName)
     {
         return JSON.Parse(File.ReadAllText("GenerateDatas/json/" + fileName + ".json"));
     }
 
+    //修改多行背景色
+    public static void SetMultipleRowsBackgroundColor(ExcelWorksheet worksheet, int startRow, int endRow, System.Drawing.Color color)
+    {
+        try
+        {
+            int columnCount = worksheet.Dimension.End.Column;
+            var multiRowRange = worksheet.Cells[startRow, 1, endRow, columnCount];
+            multiRowRange.Style.Fill.PatternType = ExcelFillStyle.Solid;
+            multiRowRange.Style.Fill.BackgroundColor.SetColor(color);
+        }
+        catch (System.InvalidOperationException e)
+        {
+            UnityEngine.Debug.LogError($"请关闭Excel后重试");
+        }
+        catch (System.Exception e)
+        {
+            UnityEngine.Debug.LogException(e);
+        }
+    }
+
     //运行.bat文件
     public static void RunBat()
     {

BIN
ActionTowerDefense/Luban/Config/Datas/怪物表.xlsx