Browse Source

代码优化,直接从实例中获取值

main
coffee 5 months ago
parent
commit
2b18d39744
  1. 9
      Assets/Unity-Tools/Core/Util/ProfilerUtil.cs
  2. 3
      Assets/Unity-Tools/Core/Util/ProfilerUtil.cs.meta
  3. 23
      Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteDataSO.cs
  4. 9
      Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteUtilSO.cs
  5. BIN
      Assets/_Project/ExcelResolver/Excel/hero.xlsx
  6. 78
      Assets/_Project/ScriptableObject/Excel/Hero/Hero_4.asset
  7. 2
      Assets/_Project/ScriptableObject/Excel/Hero/Hero_4.asset.meta
  8. 4
      Assets/_Project/ScriptableObject/Excel/Hero/_HeroUtil.asset

9
Assets/Unity-Tools/Core/Util/ProfilerUtil.cs

@ -0,0 +1,9 @@
using Unity.Profiling;
namespace Tools
{
public static class ProfilerUtil
{
public static readonly ProfilerMarker MyMarker = new ProfilerMarker("MyCustomCode");
}
}

3
Assets/Unity-Tools/Core/Util/ProfilerUtil.cs.meta

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: ab28fc99e92b409aadd67ec27519c3cc
timeCreated: 1737917311

23
Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteDataSO.cs

@ -20,16 +20,10 @@ namespace Tools.ExcelResolver.Editor
var worksheet = classCodeDataDictPair.Key; var worksheet = classCodeDataDictPair.Key;
var classCodeData = classCodeDataDictPair.Value; var classCodeData = classCodeDataDictPair.Value;
Type dataSOType = ExcelResolverUtil.GetOrCacheTypeByName(classCodeData.className); var dataName = $"{classCodeData.className}";
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}/"; var path = $"{excelResolverConfig.SOPathRoot}/{classCodeData.className}/";
string[] assetGuids = AssetDatabase.FindAssets($"t:{dataSOType}", new[] { path }); string[] assetGuids = AssetDatabase.FindAssets($"t:{dataName}", new[] { path });
Dictionary<string, ScriptableObject> originAssets = new(); Dictionary<string, ScriptableObject> originAssets = new();
for (int i = 0; i < assetGuids.Length; i++) for (int i = 0; i < assetGuids.Length; i++)
{ {
@ -50,7 +44,7 @@ namespace Tools.ExcelResolver.Editor
if (originAssets.ContainsKey(assetName)) if (originAssets.ContainsKey(assetName))
{ {
set(originAssets[assetName], dataSOType, worksheet, row, classCodeData); set(originAssets[assetName], worksheet, row, classCodeData);
EditorUtility.SetDirty(originAssets[assetName]); EditorUtility.SetDirty(originAssets[assetName]);
Debug.Log($"刷新:{assetName}", originAssets[assetName]); Debug.Log($"刷新:{assetName}", originAssets[assetName]);
result.Add(originAssets[assetName]); result.Add(originAssets[assetName]);
@ -58,8 +52,8 @@ namespace Tools.ExcelResolver.Editor
} }
else else
{ {
ScriptableObject instance = ScriptableObject.CreateInstance(dataSOType); ScriptableObject instance = ScriptableObject.CreateInstance(dataName);
set(instance, dataSOType, worksheet, row, classCodeData); set(instance, worksheet, row, classCodeData);
AssetDatabase.CreateAsset(instance, fullPath); AssetDatabase.CreateAsset(instance, fullPath);
Debug.Log($"创建:{assetName}", instance); Debug.Log($"创建:{assetName}", instance);
result.Add(instance); result.Add(instance);
@ -72,13 +66,14 @@ namespace Tools.ExcelResolver.Editor
AssetDatabase.DeleteAsset(AssetDatabase.GetAssetPath(value)); AssetDatabase.DeleteAsset(AssetDatabase.GetAssetPath(value));
} }
WriteUtilSO(path, dataSOType, result, classCodeData); WriteUtilSO(path, result, classCodeData);
} }
AssetDatabase.SaveAssets(); AssetDatabase.SaveAssets();
GC.Collect(); GC.Collect();
GC.WaitForPendingFinalizers(); GC.WaitForPendingFinalizers();
void set(ScriptableObject instance, Type dataSOType, ExcelWorksheet worksheet, int row, ClassCodeData classCodeData) void set(ScriptableObject instance, ExcelWorksheet worksheet, int row, ClassCodeData classCodeData)
{ {
foreach (var pair in classCodeData.fields) foreach (var pair in classCodeData.fields)
{ {
@ -87,7 +82,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 = dataSOType.GetField(fieldData.varName); FieldInfo fieldInfo = instance.GetType().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);
} }

9
Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteUtilSO.cs

@ -8,13 +8,11 @@ namespace Tools.ExcelResolver.Editor
{ {
public sealed partial class ExcelResolverEditorWindow public sealed partial class ExcelResolverEditorWindow
{ {
private void WriteUtilSO(string path, Type dataSOType, List<ScriptableObject> assets, ClassCodeData classCodeData) private void WriteUtilSO(string path, List<ScriptableObject> assets, ClassCodeData classCodeData)
{ {
var utilName = $"{classCodeData.className}Util"; var utilName = $"{classCodeData.className}Util";
var utilPath = $"{path}/_{utilName}.asset"; var utilPath = $"{path}/_{utilName}.asset";
Type utilType = ExcelResolverUtil.GetOrCacheTypeByName(utilName);
var instance = AssetDatabase.LoadAssetAtPath<ScriptableObject>(utilPath); var instance = AssetDatabase.LoadAssetAtPath<ScriptableObject>(utilPath);
if (instance == null) if (instance == null)
{ {
@ -26,12 +24,11 @@ namespace Tools.ExcelResolver.Editor
{ {
case TableType.SingleKeyTable: case TableType.SingleKeyTable:
var keyField = classCodeData.keyField[0]; var keyField = classCodeData.keyField[0];
var dict = (IDictionary)Activator.CreateInstance(typeof(Dictionary<,>).MakeGenericType(keyField.type.RealType, dataSOType)); var dict = (IDictionary)Activator.CreateInstance(typeof(Dictionary<,>).MakeGenericType(keyField.type.RealType, assets[0].GetType()));
var keyFieldInfo = dataSOType.GetField(keyField.varName);
foreach (var asset in assets) foreach (var asset in assets)
{ {
var key = keyFieldInfo.GetValue(asset); var key = asset.GetType().GetField(keyField.varName).GetValue(asset);
dict[key] = asset; dict[key] = asset;
} }
instance.GetType().GetField("Data").SetValue(instance, dict); instance.GetType().GetField("Data").SetValue(instance, dict);

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

Binary file not shown.

78
Assets/_Project/ScriptableObject/Excel/Hero/Hero_6.asset → Assets/_Project/ScriptableObject/Excel/Hero/Hero_4.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_6 m_Name: Hero_4
m_EditorClassIdentifier: m_EditorClassIdentifier:
serializationData: serializationData:
SerializedFormat: 2 SerializedFormat: 2
@ -34,7 +34,31 @@ MonoBehaviour:
Data: Data:
- Name: - Name:
Entry: 12 Entry: 12
Data: 0 Data: 2
- Name:
Entry: 7
Data:
- Name: $k
Entry: 3
Data: 2
- Name: $v
Entry: 4
Data: 2.3
- Name:
Entry: 8
Data:
- Name:
Entry: 7
Data:
- Name: $k
Entry: 3
Data: 5
- Name: $v
Entry: 4
Data: 4.6
- Name:
Entry: 8
Data:
- Name: - Name:
Entry: 13 Entry: 13
Data: Data:
@ -60,21 +84,49 @@ MonoBehaviour:
Data: Data:
- Name: - Name:
Entry: 12 Entry: 12
Data: 2
- Name:
Entry: 7
Data:
- Name: $k
Entry: 3
Data: 0 Data: 0
- Name: $v
Entry: 3
Data: 500
- Name:
Entry: 8
Data:
- Name:
Entry: 7
Data:
- Name: $k
Entry: 3
Data: 1
- Name: $v
Entry: 3
Data: 300
- Name:
Entry: 8
Data:
- Name: - Name:
Entry: 13 Entry: 13
Data: Data:
- Name: - Name:
Entry: 8 Entry: 8
Data: Data:
id: 6 id: 4
name: name: "\u9053\u58EB"
icon: hero_6 icon: hero_1
has: 0 has: 1
hp: 0 hp: 100
atk: 0 atk: 20
speed: 0 speed: 1.2
pos: {x: 0, y: 0, z: 0} pos: {x: 0, y: 1, z: 9}
ches: {x: 0, y: 0} ches: {x: 0, y: 1}
attack_target: [] attack_target:
color: 0 - {x: 1, y: 2}
- {x: 1, y: 2}
- {x: 1, y: 2}
- {x: 1, y: 2}
color: 1

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

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

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

@ -19,7 +19,7 @@ MonoBehaviour:
- {fileID: 11400000, guid: 3b98756cd197195498b14b5e67935cbe, type: 2} - {fileID: 11400000, guid: 3b98756cd197195498b14b5e67935cbe, type: 2}
- {fileID: 11400000, guid: cdde19489f16dce429041c1d6e207864, type: 2} - {fileID: 11400000, guid: cdde19489f16dce429041c1d6e207864, type: 2}
- {fileID: 11400000, guid: 934bc10c06f0592419baf474987cc0a7, type: 2} - {fileID: 11400000, guid: 934bc10c06f0592419baf474987cc0a7, type: 2}
- {fileID: 11400000, guid: fd4758da888e8054b897780d3fa8f13a, type: 2} - {fileID: 11400000, guid: 4f9da86093404c6449ad6f21e1207cb0, type: 2}
SerializedBytesString: SerializedBytesString:
Prefab: {fileID: 0} Prefab: {fileID: 0}
PrefabModificationsReferencedUnityObjects: [] PrefabModificationsReferencedUnityObjects: []
@ -80,7 +80,7 @@ MonoBehaviour:
Data: Data:
- Name: $k - Name: $k
Entry: 3 Entry: 3
Data: 6 Data: 4
- Name: $v - Name: $v
Entry: 10 Entry: 10
Data: 3 Data: 3

Loading…
Cancel
Save