diff --git a/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.ReadExcel.cs b/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.ReadExcel.cs index a770f1c..0908e75 100644 --- a/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.ReadExcel.cs +++ b/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.ReadExcel.cs @@ -73,7 +73,7 @@ namespace Tools.ExcelResolver.Editor else { Debug.Log("未更改过字段,开始写入SO数据"); - WriteSOData(); + WriteDataSO(); } } @@ -92,7 +92,7 @@ namespace Tools.ExcelResolver.Editor { isCompilationFinished = false; Debug.Log("Assembly-CSharp加载完成,开始写入SO数据"); - WriteSOData(); + WriteDataSO(); } } diff --git a/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOData.cs b/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteDataSO.cs similarity index 76% rename from Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOData.cs rename to Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteDataSO.cs index 5f660a4..058d174 100644 --- a/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOData.cs +++ b/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteDataSO.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.IO; using System.Reflection; using OfficeOpenXml; using Sirenix.OdinInspector; @@ -14,30 +13,32 @@ namespace Tools.ExcelResolver.Editor [FoldoutGroup("Hide Setting")] [ShowInInspector] private Dictionary classCodeDataDict = new(); - private void WriteSOData() + private void WriteDataSO() { foreach (var classCodeDataDictPair in classCodeDataDict) { var worksheet = classCodeDataDictPair.Key; var classCodeData = classCodeDataDictPair.Value; - Type soType = ExcelResolverUtil.GetOrCacheTypeByName(classCodeData.className); + Type dataSOType = ExcelResolverUtil.GetOrCacheTypeByName(classCodeData.className); - if (soType == null) + if (dataSOType == null) { Debug.LogError($"Class '{classCodeData.className}SO' not found. Please generate classes first (or check namespace)."); return; } var path = $"{excelResolverConfig.SOPathRoot}/{classCodeData.className}/"; - string[] assetGuids = AssetDatabase.FindAssets($"t:{soType}", new[] { path }); - Dictionary assets = new(); + string[] assetGuids = AssetDatabase.FindAssets($"t:{dataSOType}", new[] { path }); + Dictionary originAssets = new(); for (int i = 0; i < assetGuids.Length; i++) { string assetPath = AssetDatabase.GUIDToAssetPath(assetGuids[i]); ScriptableObject scriptableObject = AssetDatabase.LoadAssetAtPath(assetPath); - assets.Add(scriptableObject.name, scriptableObject); + originAssets.Add(scriptableObject.name, scriptableObject); } + + var result = new List(); for (int row = 1; row <= worksheet.Dimension.End.Row; row++) { @@ -47,33 +48,37 @@ namespace Tools.ExcelResolver.Editor var assetName = getAssetName(worksheet, row, classCodeData); var fullPath = $"{path}{assetName}.asset"; - if (assets.ContainsKey(assetName)) + if (originAssets.ContainsKey(assetName)) { - set(assets[assetName], soType, worksheet, row, classCodeData); - EditorUtility.SetDirty(assets[assetName]); - Debug.Log($"刷新:{assetName}", assets[assetName]); - assets.Remove(assetName); + set(originAssets[assetName], dataSOType, worksheet, row, classCodeData); + EditorUtility.SetDirty(originAssets[assetName]); + Debug.Log($"刷新:{assetName}", originAssets[assetName]); + result.Add(originAssets[assetName]); + originAssets.Remove(assetName); } else { - ScriptableObject instance = ScriptableObject.CreateInstance(soType); - set(instance, soType, worksheet, row, classCodeData); + ScriptableObject instance = ScriptableObject.CreateInstance(dataSOType); + set(instance, dataSOType, worksheet, row, classCodeData); AssetDatabase.CreateAsset(instance, fullPath); Debug.Log($"创建:{assetName}", instance); + result.Add(instance); } } - foreach (var value in assets.Values) + foreach (var value in originAssets.Values) { Debug.LogError($"删除:{value.name}", value); AssetDatabase.DeleteAsset(AssetDatabase.GetAssetPath(value)); } + + WriteUtilSO(path, dataSOType, result, classCodeData); } AssetDatabase.SaveAssets(); GC.Collect(); GC.WaitForPendingFinalizers(); - void set(ScriptableObject instance, Type soType, ExcelWorksheet worksheet, int row, ClassCodeData classCodeData) + void set(ScriptableObject instance, Type dataSOType, ExcelWorksheet worksheet, int row, ClassCodeData classCodeData) { foreach (var pair in classCodeData.fields) { @@ -82,7 +87,7 @@ namespace Tools.ExcelResolver.Editor var cell = worksheet.Cells[row, col]; object convertedValue = ExcelResolverUtil.ConvertCellValue(cell, fieldData.type, classCodeData.className); - FieldInfo fieldInfo = soType.GetField(fieldData.varName); + FieldInfo fieldInfo = dataSOType.GetField(fieldData.varName); if (fieldInfo == null) throw new Exception($"{classCodeData.className}中不存在字段:{fieldData.varName}"); fieldInfo.SetValue(instance, convertedValue); } diff --git a/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOData.cs.meta b/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteDataSO.cs.meta similarity index 100% rename from Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOData.cs.meta rename to Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteDataSO.cs.meta diff --git a/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteUtilSO.cs b/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteUtilSO.cs new file mode 100644 index 0000000..6a8ea69 --- /dev/null +++ b/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteUtilSO.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace Tools.ExcelResolver.Editor +{ + public sealed partial class ExcelResolverEditorWindow + { + private void WriteUtilSO(string path, Type dataSOType, List assets, ClassCodeData classCodeData) + { + var utilName = $"{classCodeData.className}Util"; + var utilPath = $"{path}/_{utilName}.asset"; + + Type utilType = ExcelResolverUtil.GetOrCacheTypeByName(utilName); + + var instance = AssetDatabase.LoadAssetAtPath(utilPath); + if (instance == null) + { + instance = ScriptableObject.CreateInstance(utilName); + AssetDatabase.CreateAsset(instance, utilPath); + } + + switch (classCodeData.tableType) + { + case TableType.SingleKeyTable: + var keyField = classCodeData.keyField[0]; + var dict = (IDictionary)Activator.CreateInstance(typeof(Dictionary<,>).MakeGenericType(keyField.type.RealType, dataSOType)); + + var keyFieldInfo = dataSOType.GetField(keyField.varName); + foreach (var asset in assets) + { + var key = keyFieldInfo.GetValue(asset); + dict[key] = asset; + } + instance.GetType().GetField("Data").SetValue(instance, dict); + break; + case TableType.UnionMultiKeyTable: + break; + case TableType.MultiKeyTable: + break; + case TableType.NotKetTable: + break; + case TableType.ColumnTable: + break; + } + EditorUtility.SetDirty(instance); + } + } +} \ No newline at end of file diff --git a/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteUtilSO.cs.meta b/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteUtilSO.cs.meta new file mode 100644 index 0000000..4b3220b --- /dev/null +++ b/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteUtilSO.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3b78262c18a44a04af02c750d7628d02 +timeCreated: 1737914896 \ No newline at end of file diff --git a/Assets/_Project/ExcelResolver/Excel/hero.xlsx b/Assets/_Project/ExcelResolver/Excel/hero.xlsx index 14728ee..b3cf3bf 100644 Binary files a/Assets/_Project/ExcelResolver/Excel/hero.xlsx and b/Assets/_Project/ExcelResolver/Excel/hero.xlsx differ diff --git a/Assets/_Project/ScriptableObject/Excel/Hero/Hero_5.asset b/Assets/_Project/ScriptableObject/Excel/Hero/Hero_6.asset similarity index 97% rename from Assets/_Project/ScriptableObject/Excel/Hero/Hero_5.asset rename to Assets/_Project/ScriptableObject/Excel/Hero/Hero_6.asset index 24af453..5b99bd0 100644 --- a/Assets/_Project/ScriptableObject/Excel/Hero/Hero_5.asset +++ b/Assets/_Project/ScriptableObject/Excel/Hero/Hero_6.asset @@ -10,7 +10,7 @@ MonoBehaviour: m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: e8aa3c1560079b84cafbabe4bc0d2c8d, type: 3} - m_Name: Hero_5 + m_Name: Hero_6 m_EditorClassIdentifier: serializationData: SerializedFormat: 2 @@ -67,9 +67,9 @@ MonoBehaviour: - Name: Entry: 8 Data: - id: 5 + id: 6 name: - icon: + icon: hero_6 has: 0 hp: 0 atk: 0 diff --git a/Assets/_Project/ScriptableObject/Excel/Hero/Hero_5.asset.meta b/Assets/_Project/ScriptableObject/Excel/Hero/Hero_6.asset.meta similarity index 79% rename from Assets/_Project/ScriptableObject/Excel/Hero/Hero_5.asset.meta rename to Assets/_Project/ScriptableObject/Excel/Hero/Hero_6.asset.meta index 545c6ac..ff9650f 100644 --- a/Assets/_Project/ScriptableObject/Excel/Hero/Hero_5.asset.meta +++ b/Assets/_Project/ScriptableObject/Excel/Hero/Hero_6.asset.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: c7b7eb46a7ca8244890947b043ee79ab +guid: fd4758da888e8054b897780d3fa8f13a NativeFormatImporter: externalObjects: {} mainObjectFileID: 11400000 diff --git a/Assets/_Project/ScriptableObject/Excel/Hero/_HeroUtil.asset b/Assets/_Project/ScriptableObject/Excel/Hero/_HeroUtil.asset new file mode 100644 index 0000000..bf8a38d --- /dev/null +++ b/Assets/_Project/ScriptableObject/Excel/Hero/_HeroUtil.asset @@ -0,0 +1,95 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0b8ec7437f31db141b138472f0c2a3aa, type: 3} + m_Name: _HeroUtil + m_EditorClassIdentifier: + serializationData: + SerializedFormat: 2 + SerializedBytes: + ReferencedUnityObjects: + - {fileID: 11400000, guid: 3b98756cd197195498b14b5e67935cbe, type: 2} + - {fileID: 11400000, guid: cdde19489f16dce429041c1d6e207864, type: 2} + - {fileID: 11400000, guid: 934bc10c06f0592419baf474987cc0a7, type: 2} + - {fileID: 11400000, guid: fd4758da888e8054b897780d3fa8f13a, type: 2} + SerializedBytesString: + Prefab: {fileID: 0} + PrefabModificationsReferencedUnityObjects: [] + PrefabModifications: [] + SerializationNodes: + - Name: Data + Entry: 7 + Data: 0|System.Collections.Generic.Dictionary`2[[System.Int32, mscorlib],[Tools.ExcelResolver.Hero, + Assembly-CSharp]], mscorlib + - Name: comparer + Entry: 7 + Data: 1|System.Collections.Generic.GenericEqualityComparer`1[[System.Int32, + mscorlib]], mscorlib + - Name: + Entry: 8 + Data: + - Name: + Entry: 12 + Data: 4 + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 3 + Data: 1 + - Name: $v + Entry: 10 + Data: 0 + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 3 + Data: 2 + - Name: $v + Entry: 10 + Data: 1 + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 3 + Data: 3 + - Name: $v + Entry: 10 + Data: 2 + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 3 + Data: 6 + - Name: $v + Entry: 10 + Data: 3 + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: diff --git a/Assets/_Project/ScriptableObject/Excel/Hero/_HeroUtil.asset.meta b/Assets/_Project/ScriptableObject/Excel/Hero/_HeroUtil.asset.meta new file mode 100644 index 0000000..9fd9511 --- /dev/null +++ b/Assets/_Project/ScriptableObject/Excel/Hero/_HeroUtil.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 05ad337119e018146aff00aa4e9e09b5 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: