Browse Source

使用md5检测文件是否有改动

main
coffee 5 months ago
parent
commit
5259a1ec8b
  1. 8
      Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorConfig.cs
  2. 32
      Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.ReadExcel.cs
  3. 5
      Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOData.cs
  4. 14
      Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.cs
  5. BIN
      Assets/_Project/ExcelResolver/Excel/hero.xlsx
  6. 2
      Assets/_Project/ScriptableObject/Excel/Hero_3.asset

8
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 Tools.Editor;
using UnityEngine;
namespace Tools.ExcelResolver.Editor namespace Tools.ExcelResolver.Editor
{ {
[InlineEditor(InlineEditorObjectFieldModes.CompletelyHidden)] [InlineEditor(InlineEditorObjectFieldModes.CompletelyHidden)]
public sealed class ExcelResolverEditorConfig : ScriptableObject public sealed class ExcelResolverEditorConfig : SerializedScriptableObject
{ {
[LabelText("Excel路径"), FolderPath] [LabelText("Excel路径"), FolderPath]
public string ExcelPathRoot = "Assets/_Project/ExcelResolver/Excel"; public string ExcelPathRoot = "Assets/_Project/ExcelResolver/Excel";
@ -16,6 +16,8 @@ namespace Tools.ExcelResolver.Editor
[LabelText("生成代码命名空间")] [LabelText("生成代码命名空间")]
public string GenerateDataClassNameSpace = "Tools.ExcelResolver"; public string GenerateDataClassNameSpace = "Tools.ExcelResolver";
public Dictionary<string, string> md5Dict = new();
public void MakeSureDirectory() public void MakeSureDirectory()
{ {
DirectoryUtil.MakeSureDirectory(ExcelPathRoot); DirectoryUtil.MakeSureDirectory(ExcelPathRoot);

32
Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.ReadExcel.cs

@ -2,6 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Security.Cryptography;
using OfficeOpenXml; using OfficeOpenXml;
using UnityEditor; using UnityEditor;
using UnityEditor.Compilation; using UnityEditor.Compilation;
@ -12,16 +13,32 @@ namespace Tools.ExcelResolver.Editor
{ {
public sealed partial class ExcelResolverEditorWindow public sealed partial class ExcelResolverEditorWindow
{ {
private void ReadExcel(bool needWrite = true) private void ReadExcel()
{ {
classCodeDataDict = new Dictionary<ExcelWorksheet, ClassCodeData>(); classCodeDataDict = new Dictionary<ExcelWorksheet, ClassCodeData>();
// 获取Excel文件 // 获取Excel文件
excelResolverConfig.MakeSureDirectory(); excelResolverConfig.MakeSureDirectory();
var excelFiles = new DirectoryInfo(excelResolverConfig.ExcelPathRoot).GetFiles("*.xlsx").Where(f => !f.Name.StartsWith("~$")); 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) foreach (var excelFile in excelFiles)
{ {
using FileStream stream = File.Open(excelFile.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 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); using ExcelPackage package = new ExcelPackage(stream);
ExcelWorksheet worksheet = package.Workbook.Worksheets["Sheet1"]; ExcelWorksheet worksheet = package.Workbook.Worksheets["Sheet1"];
if (null == worksheet) if (null == worksheet)
@ -35,22 +52,27 @@ namespace Tools.ExcelResolver.Editor
classCodeData.fields = GetFieldData(worksheet, classCodeData); classCodeData.fields = GetFieldData(worksheet, classCodeData);
classCodeData.tableType = CheckTableType(worksheet, classCodeData); classCodeData.tableType = CheckTableType(worksheet, classCodeData);
if (needWrite)
{
WriteDataCode(classCodeData); WriteDataCode(classCodeData);
WriteSOCode(classCodeData); WriteSOCode(classCodeData);
}
classCodeDataDict.Add(worksheet, classCodeData); classCodeDataDict.Add(worksheet, classCodeData);
// WriteSOData(worksheet, classCodeData); Debug.Log($"读取Excel文件:'{excelFile.Name}',并生成代码");
}
if (classCodeDataDict.Count == 0)
{
Debug.LogError("未检测到Excel文件改动,如需重新生成,请清空md5Dict");
return;
} }
AssetDatabase.Refresh(); AssetDatabase.Refresh();
if (EditorApplication.isCompiling) if (EditorApplication.isCompiling)
{ {
Debug.Log("代码成功生成,请等待编译...");
CompilationPipeline.compilationFinished += CompilationFinished; CompilationPipeline.compilationFinished += CompilationFinished;
} }
else else
{ {
Debug.Log("未更改过字段,开始写入SO数据");
WriteSOData(); WriteSOData();
} }
} }

5
Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOData.cs

@ -15,11 +15,6 @@ namespace Tools.ExcelResolver.Editor
private void WriteSOData() private void WriteSOData()
{ {
if (classCodeDataDict == null)
{
ReadExcel(false);
}
foreach (var classCodeDataDictPair in classCodeDataDict) foreach (var classCodeDataDictPair in classCodeDataDict)
{ {
var worksheet = classCodeDataDictPair.Key; var worksheet = classCodeDataDictPair.Key;

14
Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.cs

@ -43,18 +43,26 @@ namespace Tools.ExcelResolver.Editor
} }
} }
[FoldoutGroup("Hide Setting")] [Button("删除所有生成的代码和SO", ButtonSizes.Gigantic, Icon = SdfIconType.ExclamationDiamond), GUIColor(1f, 0f, 0f)]
[Button(SdfIconType.ExclamationDiamond, "删除所有生成的代码和SO"), GUIColor(1f, 0f, 0f)] [ButtonGroup("Hide Setting/Button")]
public void DeleteAllScriptsAndSO() private void DeleteAllScriptsAndSO()
{ {
if (EditorUtility.DisplayDialog("警告", "确定要删除所有生成的代码和SO吗?", "确定", "取消")) if (EditorUtility.DisplayDialog("警告", "确定要删除所有生成的代码和SO吗?", "确定", "取消"))
{ {
DirectoryUtil.DeleteDirectory(excelResolverConfig.CodePathRoot); DirectoryUtil.DeleteDirectory(excelResolverConfig.CodePathRoot);
DirectoryUtil.DeleteDirectory(excelResolverConfig.SOPathRoot); DirectoryUtil.DeleteDirectory(excelResolverConfig.SOPathRoot);
excelResolverConfig.md5Dict.Clear();
AssetDatabase.Refresh(); AssetDatabase.Refresh();
} }
} }
[ButtonGroup("Hide Setting/Button")]
private void ClearMd5()
{
excelResolverConfig.md5Dict.Clear();
}
[OnInspectorGUI] [OnInspectorGUI]
private void DrawGenerateButton() private void DrawGenerateButton()
{ {

BIN
Assets/_Project/ExcelResolver/Excel/hero.xlsx

Binary file not shown.

2
Assets/_Project/ScriptableObject/Excel/Hero_3.asset

@ -87,7 +87,7 @@ MonoBehaviour:
atk: 8 atk: 8
speed: 1.1 speed: 1.1
pos: {x: 3, y: 2, z: 4} pos: {x: 3, y: 2, z: 4}
ches: {x: 5, y: 12} ches: {x: 5, y: 13}
attack_target: attack_target:
- {x: 1, y: 2} - {x: 1, y: 2}
color: 23 color: 23

Loading…
Cancel
Save