From ad48ba0f22677a288b0612e9e3b73b06b3d6f309 Mon Sep 17 00:00:00 2001 From: coffee <985942825@qq.com> Date: Sun, 26 Jan 2025 19:18:00 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=94=B9=E5=86=99=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ExcelResolverEditorWindow.ReadExcel.cs | 2 +- .../ExcelResolverEditorWindow.WriteSOData.cs | 69 ++++++++++-------- .../Editor/ExcelResolverEditorWindow.cs | 2 + Assets/_Project/ExcelResolver/Excel/hero.xlsx | Bin 11075 -> 11077 bytes .../ScriptableObject/Excel/Hero/Hero_7.asset | 4 +- 5 files changed, 45 insertions(+), 32 deletions(-) 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 fd86a46ed833d95792c1a0b879faa180d58c29dc..2a6aa5be5241232a33bd2e9188ecdf3580cf91dc 100644 GIT binary patch delta 2313 zcmV+k3HJ8GR>fAZo&g0tfQe&WlcNDEf6}obrR_jvR}KUxigzLT+ZEfSB$?f=eFH)7 zeF@nEZSP^)ZFNKOGCAk}a?VfU@vefpbVFW=dDgx}(l;QseD4_yr4Wx$23-u7pW?^q&0Sa3FJ!wb4k(QUkGKYAl}@?JG60oHWfnQp zF+S4TJ(kSasattgfVfkwM0Ur;oyjP0Hj^+)Bllv1G60i zwE+p?s4&K21ONa}liLI#f7^1SI1qi`s{IFw_W^?)-^%vX#FzM*Ol@X%pD~tgDu7s! zO=iA+8_9^Mk%!rbI9NJ;y6JNel1HE4qtLjLGz(}vHXW;F8YK4VA&5_7^ZU2Or@m=q z%!?0RNMkZKe~`@lJo)pFQBKph>`VwVfFaJt=9#f%Xxo{8CXts}e>5R6%p7SNc?`a$ zCp$}0;vINU6xwd9)wLrph)uyTOn--i9*==fX4Jn#BxZsnC85Wl{_GqiS;_W(_$|Ie z>g8~+Wj!BCoQWC9=X7fIMS-8vj2@Zg)5sR3)$ej(50v|i{2Gy_S&^5%U6M~goWRZP zgD_w}`0bVj5mxc!e|c`@NoM)+t%?r~a(Xsl(@Vx^H1n8ePDWgTuch$NAD7{DGmP#4(vQOe+Onc_7}~UBsiTJl+v~y z3R0hjzyO~{6clDQjmUc!m5OM`wYu(uY52SwH%jLgDuUcw5d6jm# zLk3nu8b=ma^id>oUAT>3rYehbs_NW<)$TQfwaW_OqRiE4tgur?!9^L>wfarTpcc^% zxG3Avy;q|xeu#(jG4A_oD`aw4Z7qNZ45&g1RuTBicx`g$9B| zTWTOkf3%ebf<#+uAgJ6;Gi0lQAYFGF$Q@nb71pS$lvRSItnErx#V*}u+K!}^;EEPm zVWxppR!}ncAhURXxhTR&@g`pi z2wpf=w@3@QYONH3CO66?GTT;}L^j(glgK^Kf68R#8?j_4lXuiFw!)&CTQ@|@VsZMJGKp%Qi^)A_ zMRhMku09%mQut5@m$w*oqp}jCj)k(X6)NPJjWUTmvsEUsXJ8W65!h~2O~KB&^|8t+ zXr5bfP7+(=#5<9lm!5(+GeU9%u9gLcOT{6GUo)EUQCN%il);Iw{C0+eH-RUtWx-qR zNGU77z_F>|eI@LY7>SpV^fmYi=X@xcrU4wW`N?{0CNyQK7qH@46=Vy}Qk>=FPXUwv z0JB^PJ_-d~7x2(Zlb;hIe@$x>K^VvHg5M$RUQ$@In@tln-Q7}(Uc71bB2p&1lkCvl znRRCpk{Y3cQmYgNd#F~hA|;5>Djo!5zD+hS-@-{kL7s`1f%*NPcb*w%y&Xrn7EU=~ z)YXawOUq&Evw+ZstKHwaeeH&p;{wqDMT}xs>tL>}dsnYGoQs_Ff2G{jLLri>X>vcr zG2#W5U@Db5OJgMDHEozYNihm|h_Q$x)3&UN86!fqoX?t6xLU>5a!pDeH}U2Il&@=^ z!-?kzPuK6sVj_G8ceYS1!d(({9aDIYInys~S}28(1dvb^W5|flC}bhx3Q8c+bx4rd zfruv^QfmsONuNbbnUAiEPNJ9+s^sD_ zDs8}IHO3;y>JdYV`vdF?mX@GxYmRM*Bf^F8A1xrh$m?>Z?%IkW3pJMJn^_qfm!p{3 z!5o`SE?7)<<+d%I3!!yowv*RCrYFx~r0nhCxc42>(Z_@AfBbZO@D&P^&wJDTH;|5w z`q_RzdvyYZaj!q!`vmE5a5x^EL%Iku{BxYWcsc&vgYs~2nwyGyAo?Yvm10 zkKRu%mIcX|4BJ>$I?tDlVo9O%Nx&{-_y4wL%KzH?3$q0lzYqcVlf@=L1X3aZ0F$36 z7Ly+*8Uc2bIwz9_J%EX0U6ax$Q~?~5Cn!J%b_4(bcx*3|A1WM^iYN{No|Bm@rN&)}??gan<6aWAK000000RSKX004`V7%4#k7n52kIsrSAl_@p?Vhxjj z4Hc8(DJlU6lMO070hg0XDj^)M}Xo&g2hQ0o?6lcNDEf73CQ&~>1)D+huV#k-LF-HL5elFV+`zJZ|k zzJ%<7w)Ze?x4NNtnVj=~Ip-(wcv%+S3uu!oIYJ}|kq441k;~Z#-KP`(0(r(VDOjN- zjL-@U8YibGF|R0B8g8|!K-(OQ=Sb2}UX9S)+KOUq_#8@R0_TuU%#<#fbw@qJe--1; zYz8GmF3q0KjdfiI^`MR6@)P_xy}4_v`nha&#Q`O;;FN1%R_TPRECW!PRAw<_ zI>rZDv&VuNJ9R71auAoRWc&89QGNg1tiLwv*BJlS9lCAO@j-Yl8||9xm50IAbvi*w z6h;F-9Qq_m387?2!|Ur&6z>CqwqK=AO^ddl-Ba5$yU&PGsRqJA zl%DzZdm#`ympIHmw2jHR=ic0N2*kC*seWNB9-C(BT}bGr27ir71T!a^gf4@x z$=OWfgt*5dC=5)y)9IU`>qk0g7$?8OK~E>&BM$YhA&D3#Nl4%_s6V~vWgE4vIZt$^J~gz=(x<)XOlvKuZcOE9DV3wF1?nJ z(^UUrjbBDOj2DQ%eUhagt~KT!UP(YaMvh<=UCS+Sp!6*Vu3@N?a~FV|(e;>rBXbf2 zQ+;cJuhM^uB>6R@Fh!1!*Hyk{VVkdsb|feF8n8JH{_&6OGJn-adNuYJ%~r%eUl#qkpePlYdKAm?5|4Y?9DSgIgE60-Fka^3HQZ@Zs3a_Zw?$f#19w`$d4k3n`4= zW}S(717msc2ZVwZ+SbbYAZP_z&{~4FNc`AD*fL_?M090@(?s-S#G;9KkP*u!qAw$! znuvjnSTzwt8L@66Mlxd4L|C;FMa#Ad2D|4%|5Z z!#Dz68wcs}sDL0r<_ZW>#A$~t6cD7^QUO7=tlA;#Cd5YCZxj%u{Z;`%+V2z)r2Sq2 zLE1knAhq^|RbLd4T1LqputT=mqbv3mffn|#QNJG*5TyNF0YSn#O$h43qKW7t(UuAb z5^be`Ab-);3J4Nyqky1tx9yOf0)lkiD7!cmd0w z@ZJJKYodBG_-kMN0XitA%Aac(?A@@p9{W+kUZ%iHfg$6>6(l&^oh@O`b1=0lWTJ< zxr@1LX|=)xWlk9i?!k0|6B$K>P4R(X?Yn9E=UsSR8OZPAlfZqxzrSDZQeW@Jk=DT} zCycs!sc7pOralV@ZMpirty|Y_=o%M@1}I__yLu0EeciiyrOvs~WPdK@t{w`J)GUkp zA&wC*vIJA9G+7!WA&+Ux;z^28z(b5h99fQSSFIQks%t)LQ{n1WN7vevJZj_3C8%82 zy*ejeU3i9ZR}K^5+qk!d8WHZ3pkKFySGN}WWlRU95Rw2Aied~I@fn3IL|j1$B!&SA z5<3v_1Y>24gem2vb$<#&LLh%=hvfjA;unE%lN;){YIJ$2VsOgX5T+iwwNZd_Wi zh=V;g+gz}iJeIdD*B3&Yinp`ZKjz2JVWsTt!F2E)(#gmD?0@WJy8jglv(LNpy*H3f z4u{#^Fne_jh3Q~8-~9yXcyurwok6-RGX8Uvy?8nOJ%I9fbdsHpAT^9Yy?2I@AQ8gQ z4bHLP*3GVuqdS;1)K-gCDA~1&ZTIDSt(9#XimCcyFJ@M*>g4Er`a!)Cr$4h_`CBV* zV1D?1cAi(HP&S=BJ1S->YL@(8dw&752Nu5&0rr!}CO`yGA^-rBp(qxU zgdz|N000000RSKX004B8JSUR{+feHkUX#=(Q~@26DJVb(cLV?ccx*3|Au1e`j3^EP zoRgaO0Tq*6 zDLMf>lb0zr0b`TSDL?@QlMgC90hp6aDj^&WFOLLb1ONb05C8xe000000000103ZMW q0K^27-vk