Browse Source

优化改写逻辑

main
coffee 8 months ago
parent
commit
ad48ba0f22
  1. 2
      Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.ReadExcel.cs
  2. 67
      Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOData.cs
  3. 2
      Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.cs
  4. BIN
      Assets/_Project/ExcelResolver/Excel/hero.xlsx
  5. 4
      Assets/_Project/ScriptableObject/Excel/Hero/Hero_7.asset

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

@ -32,7 +32,7 @@ namespace Tools.ExcelResolver.Editor
using MD5 md5 = MD5.Create(); using MD5 md5 = MD5.Create();
byte[] hash = md5.ComputeHash(stream);// 转换为十六进制字符串 byte[] hash = md5.ComputeHash(stream);// 转换为十六进制字符串
var m = BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant(); 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}' 文件未发生变化,跳过"); Debug.Log($"'{excelFile.Name}' 文件未发生变化,跳过");
continue; continue;

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

@ -30,51 +30,62 @@ namespace Tools.ExcelResolver.Editor
} }
var path = $"{excelResolverConfig.SOPathRoot}/{classCodeData.className}/"; var path = $"{excelResolverConfig.SOPathRoot}/{classCodeData.className}/";
string[] assetGuids = AssetDatabase.FindAssets($"t:{soType}", new[] { path });
Dictionary<string, ScriptableObject> assets = new();
for (int i = 0; i < assetGuids.Length; i++)
{
string assetPath = AssetDatabase.GUIDToAssetPath(assetGuids[i]);
ScriptableObject scriptableObject = AssetDatabase.LoadAssetAtPath<ScriptableObject>(assetPath);
assets.Add(scriptableObject.name, scriptableObject);
}
for (int row = 1; row <= worksheet.Dimension.End.Row; row++) for (int row = 1; row <= worksheet.Dimension.End.Row; row++)
{ {
var assetName = $"{classCodeData.className}_{row}"; var assetName = $"{classCodeData.className}_{row}";
var fullPath = $"{path}{assetName}.asset"; var fullPath = $"{path}{assetName}.asset";
// 跳过注释行 // 跳过注释行
if (worksheet.Cells[row, 1].Text.StartsWith("##")) if (worksheet.Cells[row, 1].Text.StartsWith("##")) continue;
{
if (File.Exists(fullPath)) if (assets.ContainsKey(assetName))
{
AssetDatabase.DeleteAsset(fullPath);
Debug.LogError($"删除:{assetName}");
}
continue;
}
ScriptableObject instance;
if (File.Exists(fullPath))
{ {
instance = AssetDatabase.LoadAssetAtPath<ScriptableObject>(fullPath); set(assets[assetName], soType, worksheet, row, classCodeData);
Debug.Log($"刷新:{assetName}", instance); EditorUtility.SetDirty(assets[assetName]);
Debug.Log($"刷新:{assetName}", assets[assetName]);
assets.Remove(assetName);
} }
else else
{ {
instance = ScriptableObject.CreateInstance(soType); ScriptableObject instance = ScriptableObject.CreateInstance(soType);
set(instance, soType, worksheet, row, classCodeData);
AssetDatabase.CreateAsset(instance, fullPath); AssetDatabase.CreateAsset(instance, fullPath);
AssetDatabase.SaveAssets();
Debug.Log($"创建:{assetName}", instance); Debug.Log($"创建:{assetName}", instance);
} }
}
foreach (var pair in classCodeData.fields) foreach (var value in assets.Values)
{ {
var col = pair.Key; Debug.LogError($"删除:{value.name}", value);
var fieldData = pair.Value; AssetDatabase.DeleteAsset(AssetDatabase.GetAssetPath(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();
} }
AssetDatabase.SaveAssets();
GC.Collect(); GC.Collect();
GC.WaitForPendingFinalizers(); 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);
}
}
} }
} }
} }

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

@ -14,6 +14,8 @@ namespace Tools.ExcelResolver.Editor
[FoldoutGroup("Hide Setting"), LabelText("导表前是否清空Console")] [FoldoutGroup("Hide Setting"), LabelText("导表前是否清空Console")]
[SerializeField] private bool isClearConsole = true; [SerializeField] private bool isClearConsole = true;
[FoldoutGroup("Hide Setting"), LabelText("是否使用MD5跳过未修改的表格")]
[SerializeField] private bool useMD5 = true;
[MenuItem("\u272dExcelResolver\u272d/ExcelResolverEditorWindow")] [MenuItem("\u272dExcelResolver\u272d/ExcelResolverEditorWindow")]

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

Binary file not shown.

4
Assets/_Project/ScriptableObject/Excel/Hero/Hero_7.asset

@ -118,11 +118,11 @@ MonoBehaviour:
id: 1 id: 1
name: "\u9053\u58EB" name: "\u9053\u58EB"
icon: hero_1 icon: hero_1
has: 0 has: 1
hp: 100 hp: 100
atk: 20 atk: 20
speed: 1.2 speed: 1.2
pos: {x: 0, y: 1, z: 4} pos: {x: 0, y: 1, z: 9}
ches: {x: 0, y: 1} ches: {x: 0, y: 1}
attack_target: attack_target:
- {x: 1, y: 2} - {x: 1, y: 2}

Loading…
Cancel
Save