diff --git a/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.ReadExcel.cs b/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.ReadExcel.cs index ac02de0..7635384 100644 --- a/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.ReadExcel.cs +++ b/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.ReadExcel.cs @@ -32,7 +32,7 @@ namespace Tools.ExcelResolver.Editor using MD5 md5 = MD5.Create(); byte[] hash = md5.ComputeHash(stream);// 转换为十六进制字符串 var m = BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant(); - if (excelResolverConfig.md5Dict.GetValueOrDefault(excelFile.FullName) == m) + if (excelResolverConfig.md5Dict.GetValueOrDefault(excelFile.FullName) == m && useMD5) { Debug.Log($"'{excelFile.Name}' 文件未发生变化,跳过"); continue; diff --git a/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOData.cs b/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOData.cs index b2bf980..6a1d0e2 100644 --- a/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOData.cs +++ b/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOData.cs @@ -29,52 +29,63 @@ namespace Tools.ExcelResolver.Editor return; } var path = $"{excelResolverConfig.SOPathRoot}/{classCodeData.className}/"; + + string[] assetGuids = AssetDatabase.FindAssets($"t:{soType}", new[] { path }); + Dictionary assets = new(); + for (int i = 0; i < assetGuids.Length; i++) + { + string assetPath = AssetDatabase.GUIDToAssetPath(assetGuids[i]); + ScriptableObject scriptableObject = AssetDatabase.LoadAssetAtPath(assetPath); + assets.Add(scriptableObject.name, scriptableObject); + } for (int row = 1; row <= worksheet.Dimension.End.Row; row++) { var assetName = $"{classCodeData.className}_{row}"; var fullPath = $"{path}{assetName}.asset"; // 跳过注释行 - if (worksheet.Cells[row, 1].Text.StartsWith("##")) - { - if (File.Exists(fullPath)) - { - AssetDatabase.DeleteAsset(fullPath); - Debug.LogError($"删除:{assetName}"); - } - continue; - } - ScriptableObject instance; - if (File.Exists(fullPath)) + if (worksheet.Cells[row, 1].Text.StartsWith("##")) continue; + + if (assets.ContainsKey(assetName)) { - instance = AssetDatabase.LoadAssetAtPath(fullPath); - Debug.Log($"刷新:{assetName}", instance); + set(assets[assetName], soType, worksheet, row, classCodeData); + EditorUtility.SetDirty(assets[assetName]); + Debug.Log($"刷新:{assetName}", assets[assetName]); + assets.Remove(assetName); } else { - instance = ScriptableObject.CreateInstance(soType); + ScriptableObject instance = ScriptableObject.CreateInstance(soType); + set(instance, soType, worksheet, row, classCodeData); AssetDatabase.CreateAsset(instance, fullPath); - AssetDatabase.SaveAssets(); Debug.Log($"创建:{assetName}", instance); } - - foreach (var pair in classCodeData.fields) - { - var col = pair.Key; - var fieldData = pair.Value; - - var cell = worksheet.Cells[row, col]; - object convertedValue = ExcelResolverUtil.ConvertCellValue(cell, fieldData.type, classCodeData.className); - FieldInfo fieldInfo = soType.GetField(fieldData.varName); - if (fieldInfo == null) throw new Exception($"目标类中不存在字段:{fieldData.varName}"); - fieldInfo.SetValue(instance, convertedValue); - } - EditorUtility.SetDirty(instance); } - AssetDatabase.SaveAssets(); + + foreach (var value in assets.Values) + { + Debug.LogError($"删除:{value.name}", value); + AssetDatabase.DeleteAsset(AssetDatabase.GetAssetPath(value)); + } } + AssetDatabase.SaveAssets(); GC.Collect(); GC.WaitForPendingFinalizers(); + + void set(ScriptableObject instance, Type soType, ExcelWorksheet worksheet, int row, ClassCodeData classCodeData) + { + foreach (var pair in classCodeData.fields) + { + var col = pair.Key; + var fieldData = pair.Value; + + var cell = worksheet.Cells[row, col]; + object convertedValue = ExcelResolverUtil.ConvertCellValue(cell, fieldData.type, classCodeData.className); + FieldInfo fieldInfo = soType.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/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.cs b/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.cs index 299734d..95fbd0e 100644 --- a/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.cs +++ b/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.cs @@ -14,6 +14,8 @@ namespace Tools.ExcelResolver.Editor [FoldoutGroup("Hide Setting"), LabelText("导表前是否清空Console")] [SerializeField] private bool isClearConsole = true; + [FoldoutGroup("Hide Setting"), LabelText("是否使用MD5跳过未修改的表格")] + [SerializeField] private bool useMD5 = true; [MenuItem("\u272dExcelResolver\u272d/ExcelResolverEditorWindow")] diff --git a/Assets/_Project/ExcelResolver/Excel/hero.xlsx b/Assets/_Project/ExcelResolver/Excel/hero.xlsx index fd86a46..2a6aa5b 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/Hero_7.asset b/Assets/_Project/ScriptableObject/Excel/Hero/Hero_7.asset index 1f40745..25782c3 100644 --- a/Assets/_Project/ScriptableObject/Excel/Hero/Hero_7.asset +++ b/Assets/_Project/ScriptableObject/Excel/Hero/Hero_7.asset @@ -118,11 +118,11 @@ MonoBehaviour: id: 1 name: "\u9053\u58EB" icon: hero_1 - has: 0 + has: 1 hp: 100 atk: 20 speed: 1.2 - pos: {x: 0, y: 1, z: 4} + pos: {x: 0, y: 1, z: 9} ches: {x: 0, y: 1} attack_target: - {x: 1, y: 2}