You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
139 lines
6.1 KiB
139 lines
6.1 KiB
using System; |
|
using System.Collections.Generic; |
|
using System.Reflection; |
|
using System.Text; |
|
using OfficeOpenXml; |
|
using Tools.Editor; |
|
using UnityEditor; |
|
using UnityEngine; |
|
|
|
namespace Tools.ExcelResolver.Editor |
|
{ |
|
public sealed partial class ExcelResolverEditorWindow |
|
{ |
|
private void WriteDataSO() |
|
{ |
|
foreach (var classCodeDataDictPair in classCodeDataDict) |
|
{ |
|
var worksheet = classCodeDataDictPair.Key; |
|
var classCodeData = classCodeDataDictPair.Value; |
|
|
|
var dataName = $"{classCodeData.className}"; |
|
var path = $"{excelResolverConfig.SOPathRoot}/{classCodeData.className}/"; |
|
DirectoryUtil.MakeSureDirectory(path); |
|
|
|
|
|
// 纵表不生成Data类,直接生成Util类 |
|
if (classCodeData.tableType == TableType.ColumnTable) |
|
{ |
|
WriteUtilSO(path, worksheet, classCodeData); |
|
continue; |
|
} |
|
|
|
string[] assetGuids = AssetDatabase.FindAssets($"t:{dataName}", new[] { path }); |
|
Dictionary<string, ScriptableObject> originAssets = new(); |
|
for (int i = 0; i < assetGuids.Length; i++) |
|
{ |
|
string assetPath = AssetDatabase.GUIDToAssetPath(assetGuids[i]); |
|
ScriptableObject scriptableObject = AssetDatabase.LoadAssetAtPath<ScriptableObject>(assetPath); |
|
originAssets.Add(scriptableObject.name, scriptableObject); |
|
} |
|
|
|
var result = new List<ScriptableObject>(); |
|
|
|
for (int row = 1; row <= worksheet.Dimension.End.Row; row++) |
|
{ |
|
var first = worksheet.Cells[row, 1].Text; |
|
// 结束 |
|
if (string.Equals(first, "end", StringComparison.OrdinalIgnoreCase)) break; |
|
// 跳过注释行 |
|
if (first.StartsWith("##")) continue; |
|
|
|
var assetName = getAssetName(worksheet, row, classCodeData); |
|
var fullPath = $"{path}{assetName}.asset"; |
|
|
|
if (originAssets.ContainsKey(assetName)) |
|
{ |
|
setValue(originAssets[assetName], worksheet, row, classCodeData); |
|
EditorUtility.SetDirty(originAssets[assetName]); |
|
Debug.Log($"刷新:{assetName}", originAssets[assetName]); |
|
result.Add(originAssets[assetName]); |
|
originAssets.Remove(assetName); |
|
} |
|
else |
|
{ |
|
ScriptableObject instance = ScriptableObject.CreateInstance(dataName); |
|
setValue(instance, worksheet, row, classCodeData); |
|
AssetDatabase.CreateAsset(instance, fullPath); |
|
Debug.Log($"<color=green>创建</color>:{assetName}", instance); |
|
result.Add(instance); |
|
} |
|
} |
|
|
|
foreach (var value in originAssets.Values) |
|
{ |
|
Debug.LogError($"删除:{value.name}", value); |
|
AssetDatabase.DeleteAsset(AssetDatabase.GetAssetPath(value)); |
|
} |
|
|
|
WriteUtilSO(path, result, classCodeData); |
|
} |
|
|
|
AssetDatabase.SaveAssets(); |
|
GC.Collect(); |
|
GC.WaitForPendingFinalizers(); |
|
|
|
// 横表 |
|
void setValue(ScriptableObject instance, ExcelWorksheet worksheet, int row, ClassCodeData classCodeData) |
|
{ |
|
foreach (var pair in classCodeData.fields) |
|
{ |
|
var col = pair.Key; |
|
var fieldData = pair.Value; |
|
object convertedValue = ExcelResolverUtil.ConvertCellValue(row, col, worksheet, fieldData.type, classCodeData.className); |
|
FieldInfo fieldInfo = instance.GetType().GetField(fieldData.varName); |
|
if (fieldInfo == null) throw new Exception($"{classCodeData.className}中不存在字段:{fieldData.varName}"); |
|
fieldInfo.SetValue(instance, convertedValue); |
|
} |
|
} |
|
|
|
string getAssetName(ExcelWorksheet worksheet, int row, ClassCodeData classCodeData) |
|
{ |
|
switch (classCodeData.tableType) |
|
{ |
|
case TableType.SingleKeyTable: |
|
{ |
|
var keyColIndex = classCodeData.keyField[0].colIndex; |
|
var key = worksheet.Cells[row, keyColIndex].Text; |
|
if (!string.IsNullOrEmpty(key)) |
|
return $"{classCodeData.className}_{key}"; |
|
break; |
|
} |
|
case TableType.UnionMultiKeyTable or TableType.MultiKeyTable: |
|
{ |
|
var sb = new StringBuilder(); |
|
sb.Append(classCodeData.className); |
|
foreach (var keyField in classCodeData.keyField) |
|
{ |
|
var keyColIndex = keyField.colIndex; |
|
var key = worksheet.Cells[row, keyColIndex].Text; |
|
sb.Append("_"); |
|
sb.Append(key); |
|
} |
|
|
|
if (sb.Length > classCodeData.className.Length) |
|
return sb.ToString(); |
|
break; |
|
} |
|
case TableType.NotKetTable: |
|
return $"{classCodeData.className}_{row}"; |
|
} |
|
|
|
|
|
throw new Exception($"无法定义资产名称 " + |
|
$"className: '<color=cyan>{classCodeData.className}</color>' " + |
|
$"FullAddress: <color=cyan>{row}</color> "); |
|
} |
|
} |
|
} |
|
} |