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