|
|
|
@ -30,51 +30,62 @@ namespace Tools.ExcelResolver.Editor
|
|
|
|
|
} |
|
|
|
|
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++) |
|
|
|
|
{ |
|
|
|
|
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<ScriptableObject>(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); |
|
|
|
|
foreach (var value in assets.Values) |
|
|
|
|
{ |
|
|
|
|
Debug.LogError($"删除:{value.name}", value); |
|
|
|
|
AssetDatabase.DeleteAsset(AssetDatabase.GetAssetPath(value)); |
|
|
|
|
} |
|
|
|
|
AssetDatabase.SaveAssets(); |
|
|
|
|
} |
|
|
|
|
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); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |