diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core.meta b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core.meta new file mode 100644 index 0000000..77a6398 --- /dev/null +++ b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 074eed021c3f4ca6abafc0acf2b85a81 +timeCreated: 1736085541 \ No newline at end of file diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/Data.meta b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Data.meta similarity index 100% rename from Assets/Unity-Tools/Core/ExcelResolver/Editor/Data.meta rename to Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Data.meta diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/ClassCodeData.cs b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Data/ClassCodeData.cs similarity index 100% rename from Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/ClassCodeData.cs rename to Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Data/ClassCodeData.cs diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/ClassCodeData.cs.meta b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Data/ClassCodeData.cs.meta similarity index 100% rename from Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/ClassCodeData.cs.meta rename to Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Data/ClassCodeData.cs.meta diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/FieldData.cs b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Data/FieldData.cs similarity index 91% rename from Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/FieldData.cs rename to Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Data/FieldData.cs index 1b5e9fc..b75c730 100644 --- a/Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/FieldData.cs +++ b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Data/FieldData.cs @@ -10,7 +10,7 @@ namespace Tools.ExcelResolver.Editor public string varName; public string typeString; - public Type type; + public TType type; public string info; public string description; public string path; @@ -33,7 +33,7 @@ namespace Tools.ExcelResolver.Editor { Attributes = MemberAttributes.Public, Name = field.varName, - Type = new CodeTypeReference(field.type), + Type = new CodeTypeReference(field.type.RealType), CustomAttributes = new CodeAttributeDeclarationCollection() { new CodeAttributeDeclaration("SerializeField") diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/FieldData.cs.meta b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Data/FieldData.cs.meta similarity index 100% rename from Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/FieldData.cs.meta rename to Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Data/FieldData.cs.meta diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/TableType.cs b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Data/TableType.cs similarity index 100% rename from Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/TableType.cs rename to Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Data/TableType.cs diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/TableType.cs.meta b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Data/TableType.cs.meta similarity index 100% rename from Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/TableType.cs.meta rename to Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Data/TableType.cs.meta diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/DataVisitors.meta b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/DataVisitors.meta new file mode 100644 index 0000000..287113e --- /dev/null +++ b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/DataVisitors.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e2fd51fb4a2e4c9295c832372c69badb +timeCreated: 1736086194 \ No newline at end of file diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/DataVisitors/ExcelStreamDataCreator.cs b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/DataVisitors/ExcelStreamDataCreator.cs new file mode 100644 index 0000000..0dd0875 --- /dev/null +++ b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/DataVisitors/ExcelStreamDataCreator.cs @@ -0,0 +1,7 @@ +namespace Tools.ExcelResolver.Editor.Core.DataVisitors +{ + public class ExcelStreamDataCreator + { + + } +} \ No newline at end of file diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/DataVisitors/ExcelStreamDataCreator.cs.meta b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/DataVisitors/ExcelStreamDataCreator.cs.meta new file mode 100644 index 0000000..279647e --- /dev/null +++ b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/DataVisitors/ExcelStreamDataCreator.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a4c1ffa2921644ac84e4b21f34f77766 +timeCreated: 1736086204 \ No newline at end of file diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Types.meta b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Types.meta new file mode 100644 index 0000000..89e3af3 --- /dev/null +++ b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Types.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 844ba2c958ce4573b3978cbac07358fa +timeCreated: 1736085556 \ No newline at end of file diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Types/TBool.cs b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Types/TBool.cs new file mode 100644 index 0000000..3dce5cd --- /dev/null +++ b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Types/TBool.cs @@ -0,0 +1,22 @@ +using System; + +namespace Tools.ExcelResolver.Editor +{ + public class TBool : TType + { + public override string TypeName => "bool"; + + public override Type RealType => typeof(bool); + + public override bool TryParseFrom(string s, out object o) + { + if (bool.TryParse(s, out var b)) + { + o = b; + return true; + } + o = null; + return false; + } + } +} \ No newline at end of file diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Types/TBool.cs.meta b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Types/TBool.cs.meta new file mode 100644 index 0000000..d799c8c --- /dev/null +++ b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Types/TBool.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 92b5580e41c043c2aeb43c9221a049db +timeCreated: 1736086791 \ No newline at end of file diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Types/TFloat.cs b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Types/TFloat.cs new file mode 100644 index 0000000..4becdcc --- /dev/null +++ b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Types/TFloat.cs @@ -0,0 +1,22 @@ +using System; + +namespace Tools.ExcelResolver.Editor +{ + public class TFloat : TType + { + public override string TypeName => "float"; + + public override Type RealType => typeof(float); + + public override bool TryParseFrom(string s, out object o) + { + if (float.TryParse(s, out float f)) + { + o = f; + return true; + } + o = null; + return false; + } + } +} \ No newline at end of file diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Types/TFloat.cs.meta b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Types/TFloat.cs.meta new file mode 100644 index 0000000..67d6ea6 --- /dev/null +++ b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Types/TFloat.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e4714110328f46fa975f1902a0f00c35 +timeCreated: 1736086750 \ No newline at end of file diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Types/TInt.cs b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Types/TInt.cs new file mode 100644 index 0000000..9d3528e --- /dev/null +++ b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Types/TInt.cs @@ -0,0 +1,18 @@ +using System; + +namespace Tools.ExcelResolver.Editor +{ + public class TInt : TType + { + public override string TypeName => "int"; + + public override Type RealType => typeof(int); + + public override bool TryParseFrom(string s, out object o) + { + var b = int.TryParse(s, out var i); + o = i; + return b; + } + } +} \ No newline at end of file diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Types/TInt.cs.meta b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Types/TInt.cs.meta new file mode 100644 index 0000000..7e73a7a --- /dev/null +++ b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Types/TInt.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3d33275bda624ab0b31156910aa23891 +timeCreated: 1736085651 \ No newline at end of file diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Types/TString.cs b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Types/TString.cs new file mode 100644 index 0000000..074aa39 --- /dev/null +++ b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Types/TString.cs @@ -0,0 +1,17 @@ +using System; + +namespace Tools.ExcelResolver.Editor +{ + public class TString : TType + { + public override string TypeName => "string"; + + public override Type RealType => typeof(string); + + public override bool TryParseFrom(string s, out object o) + { + o = s; + return true; + } + } +} \ No newline at end of file diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Types/TString.cs.meta b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Types/TString.cs.meta new file mode 100644 index 0000000..e00fc11 --- /dev/null +++ b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Types/TString.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: fba001041d5043989d675568a184fe9d +timeCreated: 1736086717 \ No newline at end of file diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Types/TType.cs b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Types/TType.cs new file mode 100644 index 0000000..4f80bc6 --- /dev/null +++ b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Types/TType.cs @@ -0,0 +1,13 @@ +using System; + +namespace Tools.ExcelResolver.Editor +{ + public abstract class TType + { + public abstract string TypeName { get; } + + public abstract Type RealType { get; } + + public abstract bool TryParseFrom(string s, out object o); + } +} \ No newline at end of file diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Types/TType.cs.meta b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Types/TType.cs.meta new file mode 100644 index 0000000..95bee81 --- /dev/null +++ b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Core/Types/TType.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 06b8bf65d01947f5811f39a18abf478c +timeCreated: 1736085568 \ 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 ce31bcb..95ee1a4 100644 --- a/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.ReadExcel.cs +++ b/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.ReadExcel.cs @@ -13,10 +13,11 @@ namespace Tools.ExcelResolver.Editor { private void ReadExcel() { + classCodeDataDict = new Dictionary(); + // 获取Excel文件 excelResolverConfig.MakeSureDirectory(); - var excelFiles = new DirectoryInfo(excelResolverConfig.ExcelPathRoot).GetFiles("*.xlsx") - .Where(f => !f.Name.StartsWith("~$")); + var excelFiles = new DirectoryInfo(excelResolverConfig.ExcelPathRoot).GetFiles("*.xlsx").Where(f => !f.Name.StartsWith("~$")); foreach (var excelFile in excelFiles) { using FileStream stream = File.Open(excelFile.FullName, FileMode.Open, FileAccess.Read, @@ -36,6 +37,7 @@ namespace Tools.ExcelResolver.Editor WriteDataCode(classCodeData); WriteSOCode(classCodeData); + classCodeDataDict.Add(worksheet, classCodeData); // WriteSOData(worksheet, classCodeData); } AssetDatabase.Refresh(); @@ -128,12 +130,14 @@ namespace Tools.ExcelResolver.Editor for (int col = 2; col <= endColumn; col++) { + if (string.IsNullOrEmpty(worksheet.Cells[2, col].Text)) continue; + FieldData fieldData = new FieldData { colIndex = col, varName = worksheet.Cells[2, col].Text, typeString = worksheet.Cells[3, col].Text, - type = TypeUtil.GetTypeByString(worksheet.Cells[3, col].Text), + type = TypeUtil.GetTTypeByString(worksheet.Cells[3, col].Text), info = worksheet.Cells[4, col].Text, description = worksheet.Cells[5, col].Text, path = worksheet.Cells[6, col].Text, diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteDataCode.cs b/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteDataCode.cs index c91f8c8..533dd34 100644 --- a/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteDataCode.cs +++ b/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteDataCode.cs @@ -66,7 +66,7 @@ namespace Tools.ExcelResolver.Editor { Attributes = MemberAttributes.Public, Name = field.varName, - Type = new CodeTypeReference(field.type), + Type = new CodeTypeReference(field.type.RealType), Comments = { new CodeCommentStatement("", true), diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOData.cs b/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOData.cs index e102d56..d84db69 100644 --- a/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOData.cs +++ b/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOData.cs @@ -1,48 +1,58 @@ using System; -using System.IO; +using System.Collections.Generic; +using System.Linq; using OfficeOpenXml; -using UnityEditor; using UnityEngine; namespace Tools.ExcelResolver.Editor { public sealed partial class ExcelResolverEditorWindow { - private void WriteSOData(ExcelWorksheet worksheet, ClassCodeData classCodeData) + private Dictionary classCodeDataDict; + + private void WriteSOData() { - Type soType = ExcelResolverUtil.GetOrCacheTypeByName(classCodeData.className); - - if (soType == null) + foreach (var data in classCodeDataDict) { - Debug.LogError($"Class '{classCodeData.className}SO' not found. Please generate classes first (or check namespace)."); - return; - } + var worksheet = data.Key; + var classCodeData = data.Value; + + Type soType = ExcelResolverUtil.GetOrCacheTypeByName(classCodeData.className); - // 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(); - // } + if (soType == null) + { + Debug.LogError($"Class '{classCodeData.className}SO' not found. Please generate classes first (or check namespace)."); + return; + } - for (int row = 7; row < worksheet.Dimension.End.Row; row++) - { - // 跳过注释行 - if (worksheet.Cells[row, 1].Text == "##") continue; - - ScriptableObject instance = ScriptableObject.CreateInstance(soType); + // 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 col = 2; col < worksheet.Dimension.End.Column; col++) + for (int row = 7; row <= worksheet.Dimension.End.Row; row++) { - var cell = worksheet.Cells[row, col]; - // object convertedValue = ExcelResolverUtil.ConvertCellValue(cell, classCodeData.fields[col], classCodeData.fieldNames[col - 2], classCodeData.className); + // 跳过注释行 + if (worksheet.Cells[row, 1].Text == "##") continue; + + ScriptableObject instance = ScriptableObject.CreateInstance(soType); + + for (int col = 2; col < classCodeData.fields.Keys.Max(); col++) + { + var cell = worksheet.Cells[row, col]; + if (string.IsNullOrEmpty(cell.Text)) continue; + + object convertedValue = ExcelResolverUtil.ConvertCellValue(cell, classCodeData.fields[col].type, classCodeData.className); + } } } } diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.cs b/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.cs index 3069738..02cf706 100644 --- a/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.cs +++ b/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.cs @@ -41,6 +41,6 @@ namespace Tools.ExcelResolver.Editor private void GenerateCode() => ReadExcel(); [Button(ButtonSizes.Gigantic), HorizontalGroup("Split", 0.5f)] - private void GenerateSO() => ReadExcel(); + private void GenerateSO() => WriteSOData(); } } \ No newline at end of file diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverUtil.Cell.cs b/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverUtil.Cell.cs index 163349c..e1642aa 100644 --- a/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverUtil.Cell.cs +++ b/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverUtil.Cell.cs @@ -37,11 +37,16 @@ namespace Tools.ExcelResolver.Editor return values; } - // internal static object ConvertCellValue(ExcelRange cell, T type, string header, string className) - // { - // string cellValue = cell.Text.Trim(); - // - // } + internal static object ConvertCellValue(ExcelRange cell, T type, string className) + where T : TType + { + if (type.TryParseFrom(cell.Text, out var value)) + { + return value; + } + + throw new Exception($"单元格转换失败 FullAddress:'{cell.FullAddress}' Text:'{cell.Text}' className:'{className}'"); + } /// /// 通用的单元格 -> C# 对象转换 diff --git a/Assets/Unity-Tools/Core/Util/TypeUtil.cs b/Assets/Unity-Tools/Core/Util/TypeUtil.cs index 7adb85d..82887f0 100644 --- a/Assets/Unity-Tools/Core/Util/TypeUtil.cs +++ b/Assets/Unity-Tools/Core/Util/TypeUtil.cs @@ -1,11 +1,44 @@ using System; using System.Collections.Generic; +using Tools.ExcelResolver.Editor; using UnityEngine; namespace Tools { public static class TypeUtil { + + public static TType GetTTypeByString(string typeText) + { + return typeText switch + { + "int" => new TInt(), + "float" => new TFloat(), + "string" => new TString(), + "bool" => new TBool(), + // "Vector2" => typeof(Vector2), + // "Vector3" => typeof(Vector3), + // + // "List" => typeof(List), + // "List" => typeof(List), + // "List" => typeof(List), + // "List" => typeof(List), + // "List" => typeof(List), + // "List" => typeof(List), + // + // "List>" => typeof(List>), + // "List>" => typeof(List>), + // "List>" => typeof(List>), + // "List>" => typeof(List>), + // "List>" => typeof(List>), + // "List>" => typeof(List>), + // + // "enum" => typeof(Enum), + // "DateTime" => typeof(DateTime), + // _ => GetType(typeText) + }; + } + public static Type GetTypeByString(string typeText) { return typeText switch