diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/ClassCodeData.cs b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/ClassCodeData.cs
index d6bd036..204fc84 100644
--- a/Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/ClassCodeData.cs
+++ b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/ClassCodeData.cs
@@ -6,11 +6,11 @@ namespace Tools.ExcelResolver.Editor
{
internal class ClassCodeData : IDisposable
{
- public TableType tableType;
- public string className;
- public FieldData[] fields;
- public int[] keyIndex;
- public FieldData[] keyField;
+ public readonly TableType tableType;
+ public readonly string className;
+ public readonly FieldData[] fields;
+ public readonly int[] keyIndex;
+ public readonly FieldData[] keyField;
public ClassCodeData(TableType tableType, string className, FieldData[] fields, int[] keyIndex)
{
@@ -28,10 +28,7 @@ namespace Tools.ExcelResolver.Editor
public void Dispose()
{
- className = null;
fields.ForEach(field => field.Dispose());
- fields = null;
- keyIndex = null;
}
}
}
\ No newline at end of file
diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.CreateAndSaveSO.cs b/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.CreateAndSaveSO.cs
deleted file mode 100644
index 141c844..0000000
--- a/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.CreateAndSaveSO.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-using UnityEditor;
-using UnityEngine;
-
-namespace Tools.ExcelResolver.Editor
-{
- public sealed partial class ExcelResolverEditorWindow
- {
- private void CreateSO(ClassCodeData classCodeData)
- {
- var so = ScriptableObject.CreateInstance(classCodeData.className + "SO");
- AssetDatabase.CreateAsset(so, $"{excelResolverConfig.SOPathRoot}/{classCodeData.className}SO.asset");
- AssetDatabase.SaveAssets();
- }
- }
-}
\ No newline at end of file
diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.ReadExcel.cs b/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.ReadExcel.cs
index 08f2912..67cc16b 100644
--- a/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.ReadExcel.cs
+++ b/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.ReadExcel.cs
@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using OfficeOpenXml;
+using UnityEditor;
using UnityEngine;
using UnityEngine.Assertions;
@@ -35,10 +36,9 @@ namespace Tools.ExcelResolver.Editor
WriteDataCode(classCodeData);
WriteSOCode(classCodeData);
- CreateSO(classCodeData);
+ WriteSOData(worksheet, classCodeData);
}
- // AssetDatabase.Refresh();
}
private TableType CheckTableType(ExcelWorksheet worksheet, out int[] keyIndex)
diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOData.cs b/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOData.cs
new file mode 100644
index 0000000..88ee065
--- /dev/null
+++ b/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOData.cs
@@ -0,0 +1,65 @@
+using System;
+using System.IO;
+using OfficeOpenXml;
+using UnityEditor;
+using UnityEngine;
+
+namespace Tools.ExcelResolver.Editor
+{
+ public sealed partial class ExcelResolverEditorWindow
+ {
+ private void WriteSOData(ExcelWorksheet worksheet, ClassCodeData classCodeData)
+ {
+ ScriptableObject instance;
+ Type soType = ExcelResolverUtil.GetOrCacheTypeByName(classCodeData.className);
+
+ if (soType == null)
+ {
+ Debug.LogError($"Class '{classCodeData.className}SO' not found. Please generate classes first (or check namespace).");
+ return;
+ }
+
+ string fullPath = $"{excelResolverConfig.SOPathRoot}/{classCodeData.className}SO.asset";
+
+ if (File.Exists(fullPath))
+ {
+ Debug.Log("已存在SO文件,无需创建");
+
+ }
+ else
+ {
+ instance = ScriptableObject.CreateInstance(soType);
+ AssetDatabase.CreateAsset(instance, $"{excelResolverConfig.SOPathRoot}/{classCodeData.className}SO.asset");
+ AssetDatabase.SaveAssets();
+ }
+
+ for (int row = 7; row < worksheet.Dimension.End.Row; row++)
+ {
+ // 跳过注释行
+ if (worksheet.Cells[row, 1].Text == "##") continue;
+
+ for (int col = 2; col < worksheet.Dimension.End.Column; col++)
+ {
+ var keyText = worksheet.Cells[row, classCodeData.keyField[0].colIndex].Text;
+ switch (classCodeData.tableType)
+ {
+ case TableType.SingleKeyTable:
+
+ break;
+ case TableType.UnionMultiKeyTable:
+ break;
+ case TableType.MultiKeyTable:
+ break;
+ case TableType.NotKetTable:
+ break;
+ case TableType.ColumnTable:
+ break;
+ default:
+ throw new ArgumentOutOfRangeException();
+ }
+
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.CreateAndSaveSO.cs.meta b/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOData.cs.meta
similarity index 100%
rename from Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.CreateAndSaveSO.cs.meta
rename to Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOData.cs.meta
diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverUtil.cs b/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverUtil.cs
new file mode 100644
index 0000000..94231b8
--- /dev/null
+++ b/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverUtil.cs
@@ -0,0 +1,54 @@
+using System;
+using System.Collections.Generic;
+
+namespace Tools.ExcelResolver.Editor
+{
+ public static class ExcelResolverUtil
+ {
+ ///
+ /// 类型缓存,避免重复反射查找
+ ///
+ public static readonly Dictionary TypeCache = new(StringComparer.OrdinalIgnoreCase);
+
+ ///
+ /// 通过类名(含命名空间)获取 Type,并缓存
+ ///
+ public static Type GetOrCacheTypeByName(string typeName)
+ {
+ if (TypeCache.TryGetValue(typeName, out Type cachedType))
+ {
+ return cachedType;
+ }
+
+ string namespacedType = $"Tools.ExcelResolver.{typeName}";
+ Type type = Type.GetType(namespacedType, false, true) ?? GetTypeFromAllAssemblies(namespacedType);
+
+ if (type != null)
+ {
+ TypeCache[typeName] = type;
+ }
+
+ return type;
+ }
+
+ public static Type GetTypeFromAllAssemblies(string typeName)
+ {
+ foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
+ {
+ var type = assembly.GetType(typeName);
+ if (type != null)
+ {
+ TypeCache[typeName] = type;
+ return type;
+ }
+ }
+
+ throw new ArgumentException($"Unsupported type: {typeName}");
+ }
+
+ public static void Dispose()
+ {
+ TypeCache.Clear();
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverUtil.cs.meta b/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverUtil.cs.meta
new file mode 100644
index 0000000..7683781
--- /dev/null
+++ b/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverUtil.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 6a147be71de54f3ba8176c35faa8f853
+timeCreated: 1736069796
\ No newline at end of file