From 4de250aa6253c85ae4adfac7de0a3f8bc85f698d Mon Sep 17 00:00:00 2001 From: coffee <985942825@qq.com> Date: Sun, 5 Jan 2025 16:56:15 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=9F=E6=88=90SO=E8=B5=84=E4=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ExcelResolver/Editor/ClassCodeData.cs | 55 ------------------- .../Core/ExcelResolver/Editor/Data.meta | 3 + .../Editor/Data/ClassCodeData.cs | 37 +++++++++++++ .../Editor/{ => Data}/ClassCodeData.cs.meta | 0 .../ExcelResolver/Editor/Data/FieldData.cs | 44 +++++++++++++++ .../Editor/Data/FieldData.cs.meta | 3 + .../ExcelResolver/Editor/Data/TableType.cs | 11 ++++ .../Editor/Data/TableType.cs.meta | 3 + ...celResolverEditorWindow.CreateAndSaveSO.cs | 15 +++++ ...solverEditorWindow.CreateAndSaveSO.cs.meta | 3 + .../ExcelResolverEditorWindow.ReadExcel.cs | 15 +++-- .../ExcelResolverEditorWindow.WriteSOCode.cs | 38 ++++++++++++- 12 files changed, 164 insertions(+), 63 deletions(-) delete mode 100644 Assets/Unity-Tools/Core/ExcelResolver/Editor/ClassCodeData.cs create mode 100644 Assets/Unity-Tools/Core/ExcelResolver/Editor/Data.meta create mode 100644 Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/ClassCodeData.cs rename Assets/Unity-Tools/Core/ExcelResolver/Editor/{ => Data}/ClassCodeData.cs.meta (100%) create mode 100644 Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/FieldData.cs create mode 100644 Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/FieldData.cs.meta create mode 100644 Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/TableType.cs create mode 100644 Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/TableType.cs.meta create mode 100644 Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.CreateAndSaveSO.cs create mode 100644 Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.CreateAndSaveSO.cs.meta diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/ClassCodeData.cs b/Assets/Unity-Tools/Core/ExcelResolver/Editor/ClassCodeData.cs deleted file mode 100644 index 8706779..0000000 --- a/Assets/Unity-Tools/Core/ExcelResolver/Editor/ClassCodeData.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System; -using System.Collections.Generic; -using Sirenix.Utilities; - -namespace Tools.ExcelResolver.Editor -{ - internal class ClassCodeData : IDisposable - { - public TableType tableType; - public string className; - public FieldData[] fields; - public int[] keyIndex; - - public ClassCodeData(TableType tableType, string className) - { - this.tableType = tableType; - this.className = $"{char.ToUpper(className[0])}{className.Substring(1)}"; - } - - public void Dispose() - { - className = null; - fields.ForEach(field => field.Dispose()); - fields = null; - keyIndex = null; - } - } - - internal class FieldData : IDisposable - { - public string varName; - public Type type; - public string info; - public string description; - public string path; - - public void Dispose() - { - varName = null; - type = null; - info = null; - description = null; - path = null; - } - } - - internal enum TableType - { - SingleKeyTable, // 单主键表 - UnionMultiKeyTable, // 多主键表(联合索引) - MultiKeyTable, // 多主键表(独立索引) - NotKetTable, // 无主键表 - ColumnTable, // 纵表 - } -} \ No newline at end of file diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/Data.meta b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Data.meta new file mode 100644 index 0000000..3c7d403 --- /dev/null +++ b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Data.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: de2816e4f3c947bf8c8292e2a4625987 +timeCreated: 1736064127 \ No newline at end of file diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/ClassCodeData.cs b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/ClassCodeData.cs new file mode 100644 index 0000000..d6bd036 --- /dev/null +++ b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/ClassCodeData.cs @@ -0,0 +1,37 @@ +using System; +using System.Linq; +using Sirenix.Utilities; + +namespace Tools.ExcelResolver.Editor +{ + internal class ClassCodeData : IDisposable + { + public TableType tableType; + public string className; + public FieldData[] fields; + public int[] keyIndex; + public FieldData[] keyField; + + public ClassCodeData(TableType tableType, string className, FieldData[] fields, int[] keyIndex) + { + this.tableType = tableType; + this.className = $"{char.ToUpper(className[0])}{className.Substring(1)}"; + this.fields = fields; + this.keyIndex = keyIndex; + + keyField = new FieldData[keyIndex.Length]; + for (int i = 0; i < keyIndex.Length; i++) + { + keyField[i] = fields.First(f => f.colIndex == keyIndex[i]); + } + } + + 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/ClassCodeData.cs.meta b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/ClassCodeData.cs.meta similarity index 100% rename from Assets/Unity-Tools/Core/ExcelResolver/Editor/ClassCodeData.cs.meta rename to Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/ClassCodeData.cs.meta diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/FieldData.cs b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/FieldData.cs new file mode 100644 index 0000000..29e9b0c --- /dev/null +++ b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/FieldData.cs @@ -0,0 +1,44 @@ +using System; +using System.CodeDom; + +namespace Tools.ExcelResolver.Editor +{ + internal class FieldData : IDisposable + { + public int colIndex; + + public string varName; + public string typeString; + public Type type; + public string info; + public string description; + public string path; + + public void Dispose() + { + varName = null; + type = null; + info = null; + description = null; + path = null; + } + } + + internal static class FieldDataExtension + { + internal static CodeMemberField GetCodeField(this FieldData field) + { + CodeMemberField codeField = new CodeMemberField + { + Attributes = MemberAttributes.Public, + Name = field.varName, + Type = new CodeTypeReference(field.type), + CustomAttributes = new CodeAttributeDeclarationCollection() + { + new CodeAttributeDeclaration("SerializeField") + }, + }; + return codeField; + } + } +} \ No newline at end of file diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/FieldData.cs.meta b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/FieldData.cs.meta new file mode 100644 index 0000000..f68eb1b --- /dev/null +++ b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/FieldData.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 148e616320e64bf8bf00bd7246c111cd +timeCreated: 1736064103 \ No newline at end of file diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/TableType.cs b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/TableType.cs new file mode 100644 index 0000000..60e78e3 --- /dev/null +++ b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/TableType.cs @@ -0,0 +1,11 @@ +namespace Tools.ExcelResolver.Editor +{ + internal enum TableType + { + SingleKeyTable, // 单主键表 + UnionMultiKeyTable, // 多主键表(联合索引) + MultiKeyTable, // 多主键表(独立索引) + NotKetTable, // 无主键表 + ColumnTable, // 纵表 + } +} \ No newline at end of file diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/TableType.cs.meta b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/TableType.cs.meta new file mode 100644 index 0000000..ff9826f --- /dev/null +++ b/Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/TableType.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 26412086a14b46d48ae049ed45c53010 +timeCreated: 1736064144 \ 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 new file mode 100644 index 0000000..141c844 --- /dev/null +++ b/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.CreateAndSaveSO.cs @@ -0,0 +1,15 @@ +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.CreateAndSaveSO.cs.meta b/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.CreateAndSaveSO.cs.meta new file mode 100644 index 0000000..8f9f53f --- /dev/null +++ b/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.CreateAndSaveSO.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6236e2a00de94de2b8e6aff5ac5c7745 +timeCreated: 1736066833 \ 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 984b9ae..08f2912 100644 --- a/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.ReadExcel.cs +++ b/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.ReadExcel.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.IO; using System.Linq; using OfficeOpenXml; -using UnityEditor; using UnityEngine; using UnityEngine.Assertions; @@ -29,13 +28,14 @@ namespace Tools.ExcelResolver.Editor continue; } - var classCodeData = new ClassCodeData(CheckTableType(worksheet, out var keyIndex), excelFile.Name[..^5]) - { - fields = GetFieldData(worksheet), - keyIndex = keyIndex - }; + var fieldDatas = GetFieldData(worksheet); + var tableType = CheckTableType(worksheet, out var keyIndex); + + var classCodeData = new ClassCodeData(tableType, excelFile.Name[..^5], fieldDatas, keyIndex); + WriteDataCode(classCodeData); WriteSOCode(classCodeData); + CreateSO(classCodeData); } // AssetDatabase.Refresh(); @@ -50,6 +50,7 @@ namespace Tools.ExcelResolver.Editor var type = TableType.SingleKeyTable; keyIndex = null; + if (config.Contains("SingleKeyTable")) { type = TableType.SingleKeyTable; @@ -128,7 +129,9 @@ namespace Tools.ExcelResolver.Editor { 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), info = worksheet.Cells[4, col].Text, description = worksheet.Cells[5, col].Text, diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOCode.cs b/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOCode.cs index e58f3c7..d38db62 100644 --- a/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOCode.cs +++ b/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOCode.cs @@ -1,5 +1,7 @@ -using System.CodeDom; +using System; +using System.CodeDom; using System.CodeDom.Compiler; +using System.Collections.Generic; using System.IO; using Microsoft.CSharp; @@ -27,6 +29,7 @@ namespace Tools.ExcelResolver.Editor "System.Collections", "System.Collections.Generic", "UnityEngine", + "Sirenix.OdinInspector", }; foreach (var import in classImports) { @@ -43,7 +46,7 @@ namespace Tools.ExcelResolver.Editor TypeAttributes = System.Reflection.TypeAttributes.Public, BaseTypes = { - new CodeTypeReference("ScriptableObject"), + new CodeTypeReference("SerializedScriptableObject"), new CodeTypeReference("IExcelSO"), } }; @@ -51,7 +54,38 @@ namespace Tools.ExcelResolver.Editor #endregion + #region 字段 + + List codeFields = new List(); + switch (classCodeData.tableType) + { + case TableType.SingleKeyTable: + FieldData keyField = classCodeData.keyField[0]; + CodeMemberField codeField = new CodeMemberField($"Dictionary<{keyField.typeString}, {classCodeData.className}>", "Data") + { + Attributes = MemberAttributes.Public, + }; + codeFields.Add(codeField); + break; + case TableType.UnionMultiKeyTable: + break; + case TableType.MultiKeyTable: + break; + case TableType.NotKetTable: + break; + case TableType.ColumnTable: + break; + default: + throw new ArgumentOutOfRangeException(); + } + + foreach (var codeField in codeFields) + { + classType.Members.Add(codeField); + } + + #endregion