Design_SubModule/Scripts/Editor/Design_Tools/Scene/MaxAreaIdEditor.cs
2026-03-30 10:48:56 +08:00

221 lines
8.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.IO;
using OfficeOpenXml;
using UnityEditor;
using UnityEngine;
using Debug = UnityEngine.Debug;
namespace DesignTools.Scene
{
/// <summary>
/// 最大场景配置工具
/// 读取 Docs/config/Constant.xlsx 的 ConstantInt Sheet仅编辑 MaxAreaId 的 ConstantValue。
/// </summary>
public class MaxAreaIdEditor : BaseDesignToolEditor
{
private const string CONSTANT_EXCEL_NAME = "Constant.xlsx";
private const string CONSTANT_INT_SHEET_NAME = "ConstantInt";
private const int HEADER_ROW = 1;
private const int DATA_START_ROW = 3;
private const string TARGET_CONSTANT_KEY = "MaxAreaId";
private ConstantIntEntry maxAreaIdEntry;
private int keyColumnIndex = -1;
private int valueColumnIndex = -1;
[MenuItem("策划工具/场景/最大场景")]
public static void ShowWindow()
{
MaxAreaIdEditor window = GetWindow<MaxAreaIdEditor>("最大场景");
window.minSize = window.GetMinWindowSize();
window.Show();
}
protected override string GetDocsPathPrefKey()
{
return "MaxAreaIdEditor_DocsPath";
}
protected override string GetWindowTitle()
{
return "最大场景工具";
}
protected override Vector2 GetMinWindowSize()
{
return new Vector2(640, 320);
}
protected override void LoadConfigData()
{
LoadConstantIntSheet();
}
protected override void DrawDataEditor()
{
EditorGUILayout.BeginVertical("box");
EditorGUILayout.HelpBox("此工具只会读取并写回 Constant.xlsx 的 ConstantInt Sheet 中 ConstantKey=MaxAreaId 这一条数据。", MessageType.Info);
EditorGUILayout.EndVertical();
EditorGUILayout.Space(6);
if (maxAreaIdEntry == null)
{
EditorGUILayout.HelpBox("未找到 MaxAreaId 配置。", MessageType.Warning);
return;
}
EditorGUILayout.BeginVertical("box");
EditorGUILayout.LabelField("配置项", EditorStyles.boldLabel);
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("ConstantKey", GUILayout.Width(100));
EditorGUILayout.SelectableLabel(maxAreaIdEntry.ConstantKey, EditorStyles.textField, GUILayout.Height(EditorGUIUtility.singleLineHeight));
EditorGUILayout.EndHorizontal();
EditorGUILayout.Space(4);
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("ConstantValue", GUILayout.Width(100));
maxAreaIdEntry.ConstantValue = EditorGUILayout.IntField(maxAreaIdEntry.ConstantValue, GUILayout.Width(180));
GUILayout.FlexibleSpace();
EditorGUILayout.EndHorizontal();
EditorGUILayout.Space(4);
EditorGUILayout.LabelField($"Excel 行号:{maxAreaIdEntry.RowIndex}", EditorStyles.miniLabel);
EditorGUILayout.EndVertical();
}
protected override void SaveDataToExcel()
{
SaveConstantIntSheet();
}
private void LoadConstantIntSheet()
{
maxAreaIdEntry = null;
keyColumnIndex = -1;
valueColumnIndex = -1;
string excelPath = GetDocsConfigFilePath(CONSTANT_EXCEL_NAME);
if (!File.Exists(excelPath))
{
throw new FileNotFoundException($"未找到 {CONSTANT_EXCEL_NAME}", excelPath);
}
using (ExcelPackage package = new ExcelPackage(new FileInfo(excelPath)))
{
ExcelWorksheet worksheet = package.Workbook.Worksheets[CONSTANT_INT_SHEET_NAME];
if (worksheet == null)
{
throw new Exception($"{CONSTANT_EXCEL_NAME} 中未找到 Sheet: {CONSTANT_INT_SHEET_NAME}");
}
if (worksheet.Dimension == null)
{
throw new Exception($"{CONSTANT_EXCEL_NAME}/{CONSTANT_INT_SHEET_NAME} 没有可读取的数据");
}
keyColumnIndex = FindColumnIndex(worksheet, "ConstantKey");
valueColumnIndex = FindColumnIndex(worksheet, "ConstantValue");
if (keyColumnIndex < 0 || valueColumnIndex < 0)
{
throw new Exception($"{CONSTANT_EXCEL_NAME}/{CONSTANT_INT_SHEET_NAME} 表结构不正确,缺少 ConstantKey 或 ConstantValue 列");
}
int rowCount = worksheet.Dimension.End.Row;
for (int row = DATA_START_ROW; row <= rowCount; row++)
{
string constantKey = worksheet.Cells[row, keyColumnIndex].Text.Trim();
if (string.IsNullOrEmpty(constantKey) || constantKey != TARGET_CONSTANT_KEY)
{
continue;
}
string valueText = worksheet.Cells[row, valueColumnIndex].Text.Trim();
if (!int.TryParse(valueText, out int constantValue))
{
throw new Exception($"{CONSTANT_INT_SHEET_NAME} Sheet 第 {row} 行 MaxAreaId 的 ConstantValue 不是有效整数:{valueText}");
}
maxAreaIdEntry = new ConstantIntEntry
{
ConstantKey = constantKey,
ConstantValue = constantValue,
RowIndex = row
};
break;
}
}
if (maxAreaIdEntry == null)
{
throw new Exception($"{CONSTANT_INT_SHEET_NAME} Sheet 中未找到 ConstantKey={TARGET_CONSTANT_KEY} 的配置");
}
Debug.Log($"最大场景配置读取完成,当前 {TARGET_CONSTANT_KEY}={maxAreaIdEntry.ConstantValue}");
}
private void SaveConstantIntSheet()
{
if (maxAreaIdEntry == null)
{
EditorUtility.DisplayDialog("提示", "当前没有可保存的数据,请先加载配置。", "确定");
return;
}
string excelPath = GetDocsConfigFilePath(CONSTANT_EXCEL_NAME);
if (!File.Exists(excelPath))
{
EditorUtility.DisplayDialog("错误", $"未找到文件:{excelPath}", "确定");
return;
}
try
{
using (ExcelPackage package = new ExcelPackage(new FileInfo(excelPath)))
{
ExcelWorksheet worksheet = package.Workbook.Worksheets[CONSTANT_INT_SHEET_NAME];
if (worksheet == null)
{
EditorUtility.DisplayDialog("错误", $"未找到 Sheet: {CONSTANT_INT_SHEET_NAME}", "确定");
return;
}
worksheet.Cells[maxAreaIdEntry.RowIndex, valueColumnIndex].Value = maxAreaIdEntry.ConstantValue;
package.Save();
}
EditorUtility.DisplayDialog("成功", $"{TARGET_CONSTANT_KEY} 已保存到 Excel", "确定");
Debug.Log($"最大场景配置保存成功,{TARGET_CONSTANT_KEY}={maxAreaIdEntry.ConstantValue}");
}
catch (Exception e)
{
EditorUtility.DisplayDialog("错误", $"保存失败: {e.Message}", "确定");
Debug.LogError($"保存最大场景配置失败: {e}");
}
}
private int FindColumnIndex(ExcelWorksheet worksheet, string columnName)
{
int columnCount = worksheet.Dimension?.End.Column ?? 0;
for (int col = 1; col <= columnCount; col++)
{
if (string.Equals(worksheet.Cells[HEADER_ROW, col].Text.Trim(), columnName, StringComparison.OrdinalIgnoreCase))
{
return col;
}
}
return -1;
}
[Serializable]
private class ConstantIntEntry
{
public string ConstantKey;
public int ConstantValue;
public int RowIndex;
}
}
}