diff --git a/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorConfig.cs b/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorConfig.cs index 7abbe8b..083b0dc 100644 --- a/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorConfig.cs +++ b/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorConfig.cs @@ -1,11 +1,11 @@ -using Sirenix.OdinInspector; +using System.Collections.Generic; +using Sirenix.OdinInspector; using Tools.Editor; -using UnityEngine; namespace Tools.ExcelResolver.Editor { [InlineEditor(InlineEditorObjectFieldModes.CompletelyHidden)] - public sealed class ExcelResolverEditorConfig : ScriptableObject + public sealed class ExcelResolverEditorConfig : SerializedScriptableObject { [LabelText("Excel路径"), FolderPath] public string ExcelPathRoot = "Assets/_Project/ExcelResolver/Excel"; @@ -16,6 +16,8 @@ namespace Tools.ExcelResolver.Editor [LabelText("生成代码命名空间")] public string GenerateDataClassNameSpace = "Tools.ExcelResolver"; + public Dictionary md5Dict = new(); + public void MakeSureDirectory() { DirectoryUtil.MakeSureDirectory(ExcelPathRoot); diff --git a/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.ReadExcel.cs b/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.ReadExcel.cs index 6194950..ac02de0 100644 --- a/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.ReadExcel.cs +++ b/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.ReadExcel.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Security.Cryptography; using OfficeOpenXml; using UnityEditor; using UnityEditor.Compilation; @@ -12,16 +13,32 @@ namespace Tools.ExcelResolver.Editor { public sealed partial class ExcelResolverEditorWindow { - private void ReadExcel(bool needWrite = true) + private void ReadExcel() { classCodeDataDict = new Dictionary(); // 获取Excel文件 excelResolverConfig.MakeSureDirectory(); var excelFiles = new DirectoryInfo(excelResolverConfig.ExcelPathRoot).GetFiles("*.xlsx").Where(f => !f.Name.StartsWith("~$")); + if (excelFiles.Count() == 0) + { + Debug.LogError("未检测到Excel文件,请检查路径"); + return; + } + foreach (var excelFile in excelFiles) { using FileStream stream = File.Open(excelFile.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + using MD5 md5 = MD5.Create(); + byte[] hash = md5.ComputeHash(stream);// 转换为十六进制字符串 + var m = BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant(); + if (excelResolverConfig.md5Dict.GetValueOrDefault(excelFile.FullName) == m) + { + Debug.Log($"'{excelFile.Name}' 文件未发生变化,跳过"); + continue; + } + excelResolverConfig.md5Dict[excelFile.FullName] = m; + using ExcelPackage package = new ExcelPackage(stream); ExcelWorksheet worksheet = package.Workbook.Worksheets["Sheet1"]; if (null == worksheet) @@ -35,22 +52,27 @@ namespace Tools.ExcelResolver.Editor classCodeData.fields = GetFieldData(worksheet, classCodeData); classCodeData.tableType = CheckTableType(worksheet, classCodeData); - if (needWrite) - { - WriteDataCode(classCodeData); - WriteSOCode(classCodeData); - } + WriteDataCode(classCodeData); + WriteSOCode(classCodeData); classCodeDataDict.Add(worksheet, classCodeData); - // WriteSOData(worksheet, classCodeData); + Debug.Log($"读取Excel文件:'{excelFile.Name}',并生成代码"); + } + + if (classCodeDataDict.Count == 0) + { + Debug.LogError("未检测到Excel文件改动,如需重新生成,请清空md5Dict"); + return; } AssetDatabase.Refresh(); if (EditorApplication.isCompiling) { + Debug.Log("代码成功生成,请等待编译..."); CompilationPipeline.compilationFinished += CompilationFinished; } else { + Debug.Log("未更改过字段,开始写入SO数据"); WriteSOData(); } } diff --git a/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOData.cs b/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOData.cs index 563fd77..b641564 100644 --- a/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOData.cs +++ b/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOData.cs @@ -15,11 +15,6 @@ namespace Tools.ExcelResolver.Editor private void WriteSOData() { - if (classCodeDataDict == null) - { - ReadExcel(false); - } - foreach (var classCodeDataDictPair in classCodeDataDict) { var worksheet = classCodeDataDictPair.Key; diff --git a/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.cs b/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.cs index f19494e..299734d 100644 --- a/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.cs +++ b/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.cs @@ -43,18 +43,26 @@ namespace Tools.ExcelResolver.Editor } } - [FoldoutGroup("Hide Setting")] - [Button(SdfIconType.ExclamationDiamond, "删除所有生成的代码和SO"), GUIColor(1f, 0f, 0f)] - public void DeleteAllScriptsAndSO() + [Button("删除所有生成的代码和SO", ButtonSizes.Gigantic, Icon = SdfIconType.ExclamationDiamond), GUIColor(1f, 0f, 0f)] + [ButtonGroup("Hide Setting/Button")] + private void DeleteAllScriptsAndSO() { if (EditorUtility.DisplayDialog("警告", "确定要删除所有生成的代码和SO吗?", "确定", "取消")) { DirectoryUtil.DeleteDirectory(excelResolverConfig.CodePathRoot); DirectoryUtil.DeleteDirectory(excelResolverConfig.SOPathRoot); + + excelResolverConfig.md5Dict.Clear(); AssetDatabase.Refresh(); } } + [ButtonGroup("Hide Setting/Button")] + private void ClearMd5() + { + excelResolverConfig.md5Dict.Clear(); + } + [OnInspectorGUI] private void DrawGenerateButton() { diff --git a/Assets/_Project/ExcelResolver/Excel/hero.xlsx b/Assets/_Project/ExcelResolver/Excel/hero.xlsx index e04fe51..fd86a46 100644 Binary files a/Assets/_Project/ExcelResolver/Excel/hero.xlsx and b/Assets/_Project/ExcelResolver/Excel/hero.xlsx differ diff --git a/Assets/_Project/ScriptableObject/Excel/Hero_3.asset b/Assets/_Project/ScriptableObject/Excel/Hero_3.asset index c104b61..d6858ac 100644 --- a/Assets/_Project/ScriptableObject/Excel/Hero_3.asset +++ b/Assets/_Project/ScriptableObject/Excel/Hero_3.asset @@ -87,7 +87,7 @@ MonoBehaviour: atk: 8 speed: 1.1 pos: {x: 3, y: 2, z: 4} - ches: {x: 5, y: 12} + ches: {x: 5, y: 13} attack_target: - {x: 1, y: 2} color: 23