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 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<string, string> md5Dict = new();
public void MakeSureDirectory()
{
DirectoryUtil.MakeSureDirectory(ExcelPathRoot);

32
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<ExcelWorksheet, ClassCodeData>();
// 获取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);
}
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();
}
}

5
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;

14
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()
{

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
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

Loading…
Cancel
Save