diff --git a/Assets/Unity-Tools/ExcelResolver/Editor/Core/Data/FieldData.cs b/Assets/Unity-Tools/ExcelResolver/Editor/Core/Data/FieldData.cs index 0195c0e..544fc30 100644 --- a/Assets/Unity-Tools/ExcelResolver/Editor/Core/Data/FieldData.cs +++ b/Assets/Unity-Tools/ExcelResolver/Editor/Core/Data/FieldData.cs @@ -5,6 +5,10 @@ namespace Tools.ExcelResolver.Editor { internal class FieldData : IDisposable { + /// + /// 行索引 + /// 如果是纵表,这个值表示列索引 + /// public int colIndex; public string varName; @@ -14,7 +18,7 @@ namespace Tools.ExcelResolver.Editor public string description; public string path; - internal CodeMemberField GetCodeField() + internal CodeMemberField GetCodeMemberField() { CodeMemberField codeField = new CodeMemberField { diff --git a/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.ReadExcel.cs b/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.ReadExcel.cs index c8fb720..ec24838 100644 --- a/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.ReadExcel.cs +++ b/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.ReadExcel.cs @@ -55,7 +55,7 @@ namespace Tools.ExcelResolver.Editor if (!onlyGetClassCodeData) { WriteDataCode(classCodeData); - WriteSOCode(classCodeData); + WriteUtilCode(classCodeData); } classCodeDataDict.Add(worksheet, classCodeData); Debug.Log($"读取Excel文件:'{excelFile.Name}',并生成代码"); @@ -205,23 +205,48 @@ namespace Tools.ExcelResolver.Editor private Dictionary GetFieldData(ExcelWorksheet worksheet, ClassCodeData classCodeData) { var fieldDatas = new Dictionary(); - - for (int col = 2; col <= worksheet.Dimension.End.Column; col++) + + // 横表 + if (!worksheet.Cells[1, 1].Text.Contains("ColumnTable", StringComparison.OrdinalIgnoreCase)) { - var cellText = worksheet.Cells[2, col].Text; - if (string.IsNullOrEmpty(cellText) || cellText == "##") continue; + for (int col = 2; col <= worksheet.Dimension.End.Column; col++) + { + var varText = worksheet.Cells[2, col].Text; + if (string.IsNullOrEmpty(varText) || varText == "##") continue; - FieldData fieldData = new FieldData + FieldData fieldData = new FieldData + { + colIndex = col, + varName = varText, + // typeString = worksheet.Cells[3, col].Text, + type = ExcelResolverUtil.GetTTypeByString(worksheet.Cells[3, col].Text, worksheet.Cells[3, col], classCodeData.className), + info = worksheet.Cells[4, col].Text, + description = worksheet.Cells[5, col].Text, + path = worksheet.Cells[6, col].Text, + }; + fieldDatas.Add(col, fieldData); + } + } + // 纵表 + else + { + for (int row = 2; row <= worksheet.Dimension.End.Row; row++) { - colIndex = col, - varName = cellText, - // typeString = worksheet.Cells[3, col].Text, - type = ExcelResolverUtil.GetTTypeByString(worksheet.Cells[3, col].Text, worksheet.Cells[3, col], classCodeData.className), - info = worksheet.Cells[4, col].Text, - description = worksheet.Cells[5, col].Text, - path = worksheet.Cells[6, col].Text, - }; - fieldDatas.Add(col, fieldData); + var varText = worksheet.Cells[row, 1].Text; + if (string.IsNullOrEmpty(varText) || varText.StartsWith("##")) continue; + + FieldData fieldData = new FieldData + { + colIndex = row, + varName = varText, + // typeString = worksheet.Cells[row, 2].Text, + type = ExcelResolverUtil.GetTTypeByString(worksheet.Cells[row, 2].Text, worksheet.Cells[row, 2], classCodeData.className), + info = worksheet.Cells[row, 4].Text, + description = worksheet.Cells[row, 5].Text, + path = worksheet.Cells[row, 6].Text, + }; + fieldDatas.Add(row, fieldData); + } } // 判断是否有重复的varName diff --git a/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteDataCode.cs b/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteDataCode.cs index 3d867e1..2e5c28f 100644 --- a/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteDataCode.cs +++ b/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteDataCode.cs @@ -14,6 +14,9 @@ namespace Tools.ExcelResolver.Editor { private void WriteDataCode(ClassCodeData classCodeData) { + // 纵表不生成Data类 + if (classCodeData.tableType == TableType.ColumnTable) return; + string outputPath = $"{excelResolverConfig.CodePathRoot}/{classCodeData.className}.cs"; CodeCompileUnit compileUnit = new CodeCompileUnit(); @@ -65,7 +68,7 @@ namespace Tools.ExcelResolver.Editor foreach (var field in classCodeData.fields.Values) { - classType.Members.Add(field.GetCodeField()); + classType.Members.Add(field.GetCodeMemberField()); } #endregion diff --git a/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteDataSO.cs b/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteDataSO.cs index 3ec6cb9..0737228 100644 --- a/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteDataSO.cs +++ b/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteDataSO.cs @@ -30,6 +30,14 @@ namespace Tools.ExcelResolver.Editor var path = $"{excelResolverConfig.SOPathRoot}/{classCodeData.className}/"; DirectoryUtil.MakeSureDirectory(path); + + // 纵表不生成Data类,直接生成Util类 + if (classCodeData.tableType == TableType.ColumnTable) + { + WriteUtilSO(path, worksheet, classCodeData); + continue; + } + string[] assetGuids = AssetDatabase.FindAssets($"t:{dataName}", new[] { path }); Dictionary originAssets = new(); for (int i = 0; i < assetGuids.Length; i++) @@ -54,7 +62,7 @@ namespace Tools.ExcelResolver.Editor if (originAssets.ContainsKey(assetName)) { - set(originAssets[assetName], worksheet, row, classCodeData); + setValue(originAssets[assetName], worksheet, row, classCodeData); EditorUtility.SetDirty(originAssets[assetName]); Debug.Log($"刷新:{assetName}", originAssets[assetName]); result.Add(originAssets[assetName]); @@ -63,7 +71,7 @@ namespace Tools.ExcelResolver.Editor else { ScriptableObject instance = ScriptableObject.CreateInstance(dataName); - set(instance, worksheet, row, classCodeData); + setValue(instance, worksheet, row, classCodeData); AssetDatabase.CreateAsset(instance, fullPath); Debug.Log($"创建:{assetName}", instance); result.Add(instance); @@ -83,7 +91,8 @@ namespace Tools.ExcelResolver.Editor GC.Collect(); GC.WaitForPendingFinalizers(); - void set(ScriptableObject instance, ExcelWorksheet worksheet, int row, ClassCodeData classCodeData) + // 横表 + void setValue(ScriptableObject instance, ExcelWorksheet worksheet, int row, ClassCodeData classCodeData) { foreach (var pair in classCodeData.fields) { @@ -128,8 +137,6 @@ namespace Tools.ExcelResolver.Editor } case TableType.NotKetTable: return $"{classCodeData.className}_{row}"; - case TableType.ColumnTable: - return $"{classCodeData.className}_{classCodeData.fields[2].varName}"; } diff --git a/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteUtilCode.cs b/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteUtilCode.cs index c4996a6..1b4f01e 100644 --- a/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteUtilCode.cs +++ b/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteUtilCode.cs @@ -10,7 +10,7 @@ namespace Tools.ExcelResolver.Editor { public sealed partial class ExcelResolverEditorWindow { - private void WriteSOCode(ClassCodeData classCodeData) + private void WriteUtilCode(ClassCodeData classCodeData) { string outputPath = $"{excelResolverConfig.CodePathRoot}/{classCodeData.className}Util.cs"; CodeCompileUnit compileUnit = new CodeCompileUnit(); @@ -119,7 +119,13 @@ namespace Tools.ExcelResolver.Editor break; } case TableType.ColumnTable: + { + foreach (var fieldData in classCodeData.fields.Values) + { + codeFields.Add(fieldData.GetCodeMemberField()); + } break; + } } foreach (var codeField in codeFields) diff --git a/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteUtilSO.cs b/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteUtilSO.cs index 69f6e35..6a1be88 100644 --- a/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteUtilSO.cs +++ b/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteUtilSO.cs @@ -2,6 +2,8 @@ using System.Collections; using System.Collections.Generic; using System.Linq; +using System.Reflection; +using OfficeOpenXml; using UnityEditor; using UnityEngine; @@ -160,9 +162,45 @@ namespace Tools.ExcelResolver.Editor break; } case TableType.ColumnTable: - break; + throw new ArgumentException("ColumnTable 应该使用另一个WriteUtilSO方法."); + } + EditorUtility.SetDirty(instance); + } + + private void WriteUtilSO(string path, ExcelWorksheet worksheet, ClassCodeData classCodeData) + { + if (classCodeData.tableType != TableType.ColumnTable) + throw new ArgumentException("只有ColumnTable才能使用此方法."); + + var utilName = $"{classCodeData.className}Util"; + var utilPath = $"{path}/_{utilName}.asset"; + + var instance = AssetDatabase.LoadAssetAtPath(utilPath); + if (instance == null) + { + instance = ScriptableObject.CreateInstance(utilName); + AssetDatabase.CreateAsset(instance, utilPath); } + + setValue(instance, worksheet, classCodeData); + EditorUtility.SetDirty(instance); + + // 纵表 + void setValue(ScriptableObject instance, ExcelWorksheet worksheet, ClassCodeData classCodeData) + { + foreach (var pair in classCodeData.fields) + { + var row = pair.Key; + var fieldData = pair.Value; + + var cell = worksheet.Cells[row, 3]; + object convertedValue = ExcelResolverUtil.ConvertCellValue(cell, fieldData.type, classCodeData.className); + FieldInfo fieldInfo = instance.GetType().GetField(fieldData.varName); + if (fieldInfo == null) throw new Exception($"{classCodeData.className}中不存在字段:{fieldData.varName}"); + fieldInfo.SetValue(instance, convertedValue); + } + } } } } \ No newline at end of file diff --git a/Assets/_Project/ExcelResolver/Excel/com.xlsx b/Assets/_Project/ExcelResolver/Excel/com.xlsx new file mode 100644 index 0000000..dd12bf4 Binary files /dev/null and b/Assets/_Project/ExcelResolver/Excel/com.xlsx differ diff --git a/Assets/_Project/ExcelResolver/Excel/com.xlsx.meta b/Assets/_Project/ExcelResolver/Excel/com.xlsx.meta new file mode 100644 index 0000000..629a8c7 --- /dev/null +++ b/Assets/_Project/ExcelResolver/Excel/com.xlsx.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c603f54d33a16b74f96c74e8b403ca0b +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/ScriptableObject/Excel/Com.meta b/Assets/_Project/ScriptableObject/Excel/Com.meta new file mode 100644 index 0000000..1826f9d --- /dev/null +++ b/Assets/_Project/ScriptableObject/Excel/Com.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5d697dbce85032d4dba2a90d7bb50290 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/ScriptableObject/Excel/Com/_ComUtil.asset b/Assets/_Project/ScriptableObject/Excel/Com/_ComUtil.asset new file mode 100644 index 0000000..7886603 --- /dev/null +++ b/Assets/_Project/ScriptableObject/Excel/Com/_ComUtil.asset @@ -0,0 +1,26 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 65d0d896e6a9aba4c86524d1ead223f2, type: 3} + m_Name: _ComUtil + m_EditorClassIdentifier: + serializationData: + SerializedFormat: 2 + SerializedBytes: + ReferencedUnityObjects: [] + SerializedBytesString: + Prefab: {fileID: 0} + PrefabModificationsReferencedUnityObjects: [] + PrefabModifications: [] + SerializationNodes: [] + cangku_chushi: 3 + des_xishu: 2 + ta_chushi_unlock: 01000000cc00000091010000cb000000 diff --git a/Assets/_Project/ScriptableObject/Excel/Com/_ComUtil.asset.meta b/Assets/_Project/ScriptableObject/Excel/Com/_ComUtil.asset.meta new file mode 100644 index 0000000..8a6c35f --- /dev/null +++ b/Assets/_Project/ScriptableObject/Excel/Com/_ComUtil.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7ee0eb7708acae845ae0445697042da4 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Scripts/Generator/Excel/ComUtil.cs b/Assets/_Project/Scripts/Generator/Excel/ComUtil.cs new file mode 100644 index 0000000..9d6fd43 --- /dev/null +++ b/Assets/_Project/Scripts/Generator/Excel/ComUtil.cs @@ -0,0 +1,38 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Tools.ExcelResolver +{ + using System; + using System.Collections; + using System.Collections.Generic; + using UnityEngine; + using Sirenix.OdinInspector; + + + public class ComUtil : SerializedScriptableObject, IExcelSOUtil + { + + /// + /// 初始仓库空位数 + /// + public int cangku_chushi; + + /// + /// 防御系数 + /// + public int des_xishu; + + /// + /// 初始解锁的塔 + /// + public List ta_chushi_unlock; + } +} diff --git a/Assets/_Project/Scripts/Generator/Excel/ComUtil.cs.meta b/Assets/_Project/Scripts/Generator/Excel/ComUtil.cs.meta new file mode 100644 index 0000000..0090571 --- /dev/null +++ b/Assets/_Project/Scripts/Generator/Excel/ComUtil.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 65d0d896e6a9aba4c86524d1ead223f2 \ No newline at end of file