Browse Source

获取对象

master
coffee 6 months ago
parent
commit
94bfb1a9e4
  1. 13
      Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/ClassCodeData.cs
  2. 15
      Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.CreateAndSaveSO.cs
  3. 4
      Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.ReadExcel.cs
  4. 65
      Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOData.cs
  5. 0
      Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOData.cs.meta
  6. 54
      Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverUtil.cs
  7. 3
      Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverUtil.cs.meta

13
Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/ClassCodeData.cs

@ -6,11 +6,11 @@ namespace Tools.ExcelResolver.Editor
{
internal class ClassCodeData : IDisposable
{
public TableType tableType;
public string className;
public FieldData[] fields;
public int[] keyIndex;
public FieldData[] keyField;
public readonly TableType tableType;
public readonly string className;
public readonly FieldData[] fields;
public readonly int[] keyIndex;
public readonly FieldData[] keyField;
public ClassCodeData(TableType tableType, string className, FieldData[] fields, int[] keyIndex)
{
@ -28,10 +28,7 @@ namespace Tools.ExcelResolver.Editor
public void Dispose()
{
className = null;
fields.ForEach(field => field.Dispose());
fields = null;
keyIndex = null;
}
}
}

15
Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.CreateAndSaveSO.cs

@ -1,15 +0,0 @@
using UnityEditor;
using UnityEngine;
namespace Tools.ExcelResolver.Editor
{
public sealed partial class ExcelResolverEditorWindow
{
private void CreateSO(ClassCodeData classCodeData)
{
var so = ScriptableObject.CreateInstance(classCodeData.className + "SO");
AssetDatabase.CreateAsset(so, $"{excelResolverConfig.SOPathRoot}/{classCodeData.className}SO.asset");
AssetDatabase.SaveAssets();
}
}
}

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

@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using OfficeOpenXml;
using UnityEditor;
using UnityEngine;
using UnityEngine.Assertions;
@ -35,10 +36,9 @@ namespace Tools.ExcelResolver.Editor
WriteDataCode(classCodeData);
WriteSOCode(classCodeData);
CreateSO(classCodeData);
WriteSOData(worksheet, classCodeData);
}
// AssetDatabase.Refresh();
}
private TableType CheckTableType(ExcelWorksheet worksheet, out int[] keyIndex)

65
Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOData.cs

@ -0,0 +1,65 @@
using System;
using System.IO;
using OfficeOpenXml;
using UnityEditor;
using UnityEngine;
namespace Tools.ExcelResolver.Editor
{
public sealed partial class ExcelResolverEditorWindow
{
private void WriteSOData(ExcelWorksheet worksheet, ClassCodeData classCodeData)
{
ScriptableObject instance;
Type soType = ExcelResolverUtil.GetOrCacheTypeByName(classCodeData.className);
if (soType == null)
{
Debug.LogError($"Class '{classCodeData.className}SO' not found. Please generate classes first (or check namespace).");
return;
}
string fullPath = $"{excelResolverConfig.SOPathRoot}/{classCodeData.className}SO.asset";
if (File.Exists(fullPath))
{
Debug.Log("已存在SO文件,无需创建");
}
else
{
instance = ScriptableObject.CreateInstance(soType);
AssetDatabase.CreateAsset(instance, $"{excelResolverConfig.SOPathRoot}/{classCodeData.className}SO.asset");
AssetDatabase.SaveAssets();
}
for (int row = 7; row < worksheet.Dimension.End.Row; row++)
{
// 跳过注释行
if (worksheet.Cells[row, 1].Text == "##") continue;
for (int col = 2; col < worksheet.Dimension.End.Column; col++)
{
var keyText = worksheet.Cells[row, classCodeData.keyField[0].colIndex].Text;
switch (classCodeData.tableType)
{
case TableType.SingleKeyTable:
break;
case TableType.UnionMultiKeyTable:
break;
case TableType.MultiKeyTable:
break;
case TableType.NotKetTable:
break;
case TableType.ColumnTable:
break;
default:
throw new ArgumentOutOfRangeException();
}
}
}
}
}
}

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

54
Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverUtil.cs

@ -0,0 +1,54 @@
using System;
using System.Collections.Generic;
namespace Tools.ExcelResolver.Editor
{
public static class ExcelResolverUtil
{
/// <summary>
/// 类型缓存,避免重复反射查找
/// </summary>
public static readonly Dictionary<string, Type> TypeCache = new(StringComparer.OrdinalIgnoreCase);
/// <summary>
/// 通过类名(含命名空间)获取 Type,并缓存
/// </summary>
public static Type GetOrCacheTypeByName(string typeName)
{
if (TypeCache.TryGetValue(typeName, out Type cachedType))
{
return cachedType;
}
string namespacedType = $"Tools.ExcelResolver.{typeName}";
Type type = Type.GetType(namespacedType, false, true) ?? GetTypeFromAllAssemblies(namespacedType);
if (type != null)
{
TypeCache[typeName] = type;
}
return type;
}
public static Type GetTypeFromAllAssemblies(string typeName)
{
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
{
var type = assembly.GetType(typeName);
if (type != null)
{
TypeCache[typeName] = type;
return type;
}
}
throw new ArgumentException($"Unsupported type: {typeName}");
}
public static void Dispose()
{
TypeCache.Clear();
}
}
}

3
Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverUtil.cs.meta

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 6a147be71de54f3ba8176c35faa8f853
timeCreated: 1736069796
Loading…
Cancel
Save