Browse Source

使用Util集成

main
coffee 5 months ago
parent
commit
c38b6097c7
  1. 4
      Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.ReadExcel.cs
  2. 39
      Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteDataSO.cs
  3. 0
      Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteDataSO.cs.meta
  4. 51
      Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteUtilSO.cs
  5. 3
      Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteUtilSO.cs.meta
  6. BIN
      Assets/_Project/ExcelResolver/Excel/hero.xlsx
  7. 6
      Assets/_Project/ScriptableObject/Excel/Hero/Hero_6.asset
  8. 2
      Assets/_Project/ScriptableObject/Excel/Hero/Hero_6.asset.meta
  9. 95
      Assets/_Project/ScriptableObject/Excel/Hero/_HeroUtil.asset
  10. 8
      Assets/_Project/ScriptableObject/Excel/Hero/_HeroUtil.asset.meta

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

@ -73,7 +73,7 @@ namespace Tools.ExcelResolver.Editor
else else
{ {
Debug.Log("未更改过字段,开始写入SO数据"); Debug.Log("未更改过字段,开始写入SO数据");
WriteSOData(); WriteDataSO();
} }
} }
@ -92,7 +92,7 @@ namespace Tools.ExcelResolver.Editor
{ {
isCompilationFinished = false; isCompilationFinished = false;
Debug.Log("Assembly-CSharp加载完成,开始写入SO数据"); Debug.Log("Assembly-CSharp加载完成,开始写入SO数据");
WriteSOData(); WriteDataSO();
} }
} }

39
Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOData.cs → Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteDataSO.cs

@ -1,6 +1,5 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Reflection; using System.Reflection;
using OfficeOpenXml; using OfficeOpenXml;
using Sirenix.OdinInspector; using Sirenix.OdinInspector;
@ -14,30 +13,32 @@ namespace Tools.ExcelResolver.Editor
[FoldoutGroup("Hide Setting")] [FoldoutGroup("Hide Setting")]
[ShowInInspector] private Dictionary<ExcelWorksheet, ClassCodeData> classCodeDataDict = new(); [ShowInInspector] private Dictionary<ExcelWorksheet, ClassCodeData> classCodeDataDict = new();
private void WriteSOData() private void WriteDataSO()
{ {
foreach (var classCodeDataDictPair in classCodeDataDict) foreach (var classCodeDataDictPair in classCodeDataDict)
{ {
var worksheet = classCodeDataDictPair.Key; var worksheet = classCodeDataDictPair.Key;
var classCodeData = classCodeDataDictPair.Value; 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)."); Debug.LogError($"Class '{classCodeData.className}SO' not found. Please generate classes first (or check namespace).");
return; return;
} }
var path = $"{excelResolverConfig.SOPathRoot}/{classCodeData.className}/"; var path = $"{excelResolverConfig.SOPathRoot}/{classCodeData.className}/";
string[] assetGuids = AssetDatabase.FindAssets($"t:{soType}", new[] { path }); string[] assetGuids = AssetDatabase.FindAssets($"t:{dataSOType}", new[] { path });
Dictionary<string, ScriptableObject> assets = new(); Dictionary<string, ScriptableObject> originAssets = new();
for (int i = 0; i < assetGuids.Length; i++) for (int i = 0; i < assetGuids.Length; i++)
{ {
string assetPath = AssetDatabase.GUIDToAssetPath(assetGuids[i]); string assetPath = AssetDatabase.GUIDToAssetPath(assetGuids[i]);
ScriptableObject scriptableObject = AssetDatabase.LoadAssetAtPath<ScriptableObject>(assetPath); ScriptableObject scriptableObject = AssetDatabase.LoadAssetAtPath<ScriptableObject>(assetPath);
assets.Add(scriptableObject.name, scriptableObject); originAssets.Add(scriptableObject.name, scriptableObject);
} }
var result = new List<ScriptableObject>();
for (int row = 1; row <= worksheet.Dimension.End.Row; row++) 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 assetName = getAssetName(worksheet, row, classCodeData);
var fullPath = $"{path}{assetName}.asset"; var fullPath = $"{path}{assetName}.asset";
if (assets.ContainsKey(assetName)) if (originAssets.ContainsKey(assetName))
{ {
set(assets[assetName], soType, worksheet, row, classCodeData); set(originAssets[assetName], dataSOType, worksheet, row, classCodeData);
EditorUtility.SetDirty(assets[assetName]); EditorUtility.SetDirty(originAssets[assetName]);
Debug.Log($"刷新:{assetName}", assets[assetName]); Debug.Log($"刷新:{assetName}", originAssets[assetName]);
assets.Remove(assetName); result.Add(originAssets[assetName]);
originAssets.Remove(assetName);
} }
else else
{ {
ScriptableObject instance = ScriptableObject.CreateInstance(soType); ScriptableObject instance = ScriptableObject.CreateInstance(dataSOType);
set(instance, soType, worksheet, row, classCodeData); set(instance, dataSOType, worksheet, row, classCodeData);
AssetDatabase.CreateAsset(instance, fullPath); AssetDatabase.CreateAsset(instance, fullPath);
Debug.Log($"创建:{assetName}", instance); Debug.Log($"创建:{assetName}", instance);
result.Add(instance);
} }
} }
foreach (var value in assets.Values) foreach (var value in originAssets.Values)
{ {
Debug.LogError($"删除:{value.name}", value); Debug.LogError($"删除:{value.name}", value);
AssetDatabase.DeleteAsset(AssetDatabase.GetAssetPath(value)); AssetDatabase.DeleteAsset(AssetDatabase.GetAssetPath(value));
} }
WriteUtilSO(path, dataSOType, result, classCodeData);
} }
AssetDatabase.SaveAssets(); AssetDatabase.SaveAssets();
GC.Collect(); GC.Collect();
GC.WaitForPendingFinalizers(); 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) foreach (var pair in classCodeData.fields)
{ {
@ -82,7 +87,7 @@ namespace Tools.ExcelResolver.Editor
var cell = worksheet.Cells[row, col]; var cell = worksheet.Cells[row, col];
object convertedValue = ExcelResolverUtil.ConvertCellValue(cell, fieldData.type, classCodeData.className); 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}"); if (fieldInfo == null) throw new Exception($"{classCodeData.className}中不存在字段:{fieldData.varName}");
fieldInfo.SetValue(instance, convertedValue); fieldInfo.SetValue(instance, convertedValue);
} }

0
Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOData.cs.meta → Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteDataSO.cs.meta

51
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<ScriptableObject> assets, ClassCodeData classCodeData)
{
var utilName = $"{classCodeData.className}Util";
var utilPath = $"{path}/_{utilName}.asset";
Type utilType = ExcelResolverUtil.GetOrCacheTypeByName(utilName);
var instance = AssetDatabase.LoadAssetAtPath<ScriptableObject>(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);
}
}
}

3
Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteUtilSO.cs.meta

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 3b78262c18a44a04af02c750d7628d02
timeCreated: 1737914896

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

Binary file not shown.

6
Assets/_Project/ScriptableObject/Excel/Hero/Hero_5.asset → Assets/_Project/ScriptableObject/Excel/Hero/Hero_6.asset

@ -10,7 +10,7 @@ MonoBehaviour:
m_Enabled: 1 m_Enabled: 1
m_EditorHideFlags: 0 m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e8aa3c1560079b84cafbabe4bc0d2c8d, type: 3} m_Script: {fileID: 11500000, guid: e8aa3c1560079b84cafbabe4bc0d2c8d, type: 3}
m_Name: Hero_5 m_Name: Hero_6
m_EditorClassIdentifier: m_EditorClassIdentifier:
serializationData: serializationData:
SerializedFormat: 2 SerializedFormat: 2
@ -67,9 +67,9 @@ MonoBehaviour:
- Name: - Name:
Entry: 8 Entry: 8
Data: Data:
id: 5 id: 6
name: name:
icon: icon: hero_6
has: 0 has: 0
hp: 0 hp: 0
atk: 0 atk: 0

2
Assets/_Project/ScriptableObject/Excel/Hero/Hero_5.asset.meta → Assets/_Project/ScriptableObject/Excel/Hero/Hero_6.asset.meta

@ -1,5 +1,5 @@
fileFormatVersion: 2 fileFormatVersion: 2
guid: c7b7eb46a7ca8244890947b043ee79ab guid: fd4758da888e8054b897780d3fa8f13a
NativeFormatImporter: NativeFormatImporter:
externalObjects: {} externalObjects: {}
mainObjectFileID: 11400000 mainObjectFileID: 11400000

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

8
Assets/_Project/ScriptableObject/Excel/Hero/_HeroUtil.asset.meta

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 05ad337119e018146aff00aa4e9e09b5
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
Loading…
Cancel
Save