Browse Source

工具类

master
coffee 6 months ago
parent
commit
4553f12a91
  1. 4
      Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.ReadExcel.cs
  2. 6
      Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteDataCode.cs
  3. 46
      Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOData.cs
  4. 4
      Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteUtilCode.cs
  5. 0
      Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteUtilCode.cs.meta
  6. 24
      Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.cs
  7. 140
      Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverUtil.Cell.cs
  8. 3
      Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverUtil.Cell.cs.meta
  9. 2
      Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverUtil.Type.cs
  10. 0
      Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverUtil.Type.cs.meta

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

@ -36,9 +36,9 @@ namespace Tools.ExcelResolver.Editor
WriteDataCode(classCodeData);
WriteSOCode(classCodeData);
WriteSOData(worksheet, classCodeData);
// WriteSOData(worksheet, classCodeData);
}
AssetDatabase.Refresh();
}
private TableType CheckTableType(ExcelWorksheet worksheet, out int[] keyIndex)

6
Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteDataCode.cs

@ -48,7 +48,11 @@ namespace Tools.ExcelResolver.Editor
{
new CodeAttributeDeclaration("Serializable")
},
BaseTypes = { new CodeTypeReference("IExcelData") }
BaseTypes =
{
new CodeTypeReference("ScriptableObject"),
new CodeTypeReference("IExcelData")
}
};
codeNamespace.Types.Add(classType);

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

@ -10,7 +10,6 @@ namespace Tools.ExcelResolver.Editor
{
private void WriteSOData(ExcelWorksheet worksheet, ClassCodeData classCodeData)
{
ScriptableObject instance;
Type soType = ExcelResolverUtil.GetOrCacheTypeByName(classCodeData.className);
if (soType == null)
@ -19,44 +18,29 @@ namespace Tools.ExcelResolver.Editor
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();
}
// 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;
ScriptableObject instance = ScriptableObject.CreateInstance(soType);
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();
}
}
}

4
Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOCode.cs → Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteUtilCode.cs

@ -11,7 +11,7 @@ namespace Tools.ExcelResolver.Editor
{
private void WriteSOCode(ClassCodeData classCodeData)
{
string outputPath = $"{excelResolverConfig.CodePathRoot}/{classCodeData.className}SO.cs";
string outputPath = $"{excelResolverConfig.CodePathRoot}/{classCodeData.className}Util.cs";
CodeCompileUnit compileUnit = new CodeCompileUnit();
#region 命名空间
@ -40,7 +40,7 @@ namespace Tools.ExcelResolver.Editor
#region 类
CodeTypeDeclaration classType = new CodeTypeDeclaration($"{classCodeData.className}SO")
CodeTypeDeclaration classType = new CodeTypeDeclaration($"{classCodeData.className}Util")
{
IsClass = true,
TypeAttributes = System.Reflection.TypeAttributes.Public,

0
Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOCode.cs.meta → Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteUtilCode.cs.meta

24
Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.cs

@ -1,3 +1,4 @@
using System;
using Sirenix.OdinInspector;
using Sirenix.OdinInspector.Editor;
using Sirenix.Utilities;
@ -29,20 +30,17 @@ namespace Tools.ExcelResolver.Editor
}
}
// [OnInspectorGUI]
// private void DrawGenerateButton()
// {
// GUILayout.FlexibleSpace(); // 把空白区域推向上方
// if (GUILayout.Button("Generate", GUILayout.Height(50)))
// {
// Generate();
// }
// }
[Button(ButtonSizes.Gigantic)]
private void Generate()
[OnInspectorGUI]
private void DrawGenerateButton()
{
ReadExcel();
GUILayout.FlexibleSpace(); // 把空白区域推向上方
}
[Button(ButtonSizes.Gigantic), HorizontalGroup("Split", 0.5f)]
private void GenerateCode() => ReadExcel();
[Button(ButtonSizes.Gigantic), HorizontalGroup("Split", 0.5f)]
private void GenerateSO() => ReadExcel();
}
}

140
Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverUtil.Cell.cs

@ -0,0 +1,140 @@
using System;
using System.Collections.Generic;
using System.Linq;
using OfficeOpenXml;
using UnityEngine;
namespace Tools.ExcelResolver.Editor
{
public static partial class ExcelResolverUtil
{
/// <summary>
/// 读取指定行的数据
/// </summary>
public static List<string> ReadRow(ExcelWorksheet worksheet, int row, int colCount, string rowType)
{
List<string> values = new(colCount);
for (int col = 1; col <= colCount; col++)
{
string value = worksheet.Cells[row, col].Text?.Trim();
if (rowType == "headers" && string.IsNullOrEmpty(value))
{
Debug.LogWarning(
$"Empty header found in worksheet '{worksheet.Name}', column {col}. Skipping this column.");
values.Add(string.Empty);
continue;
}
if (rowType == "types" && string.IsNullOrEmpty(value))
{
value = "string";
Debug.LogWarning(
$"Empty type found for column '{worksheet.Cells[1, col].Text}' in worksheet '{worksheet.Name}'. Defaulting to 'string'.");
}
values.Add(value);
}
return values;
}
/// <summary>
/// 通用的单元格 -> C# 对象转换
/// </summary>
public static object ConvertCellValue(ExcelRange cell, string type, string header, string className)
{
try
{
string cellValue = cell.Value?.ToString()?.Trim();
if (type.StartsWith("list<", StringComparison.OrdinalIgnoreCase) && type.EndsWith(">"))
{
return ConvertToList(cellValue, type, header, className);
}
else if (TypeConverters.TryGetValue(type, out var converter))
{
return converter(cellValue);
}
else
{
Debug.LogError($"Unsupported type '{type}' for field '{header}' in class '{className}'.");
return GetDefaultValue(type);
}
}
catch (Exception ex)
{
Debug.LogError($"Error converting value for '{header}' in '{className}': {ex.Message}");
return GetDefaultValue(type);
}
}
/// <summary>
/// 返回类型的默认值 (包含 List<...> 场景)
/// </summary>
public static object GetDefaultValue(string type)
{
if (type.StartsWith("list<", StringComparison.OrdinalIgnoreCase) && type.EndsWith(">"))
{
var insideType = type.Substring(5, type.Length - 6).Trim();
return insideType.ToLower() switch
{
"int" or "integer" => new List<int>(),
"float" => new List<float>(),
"double" => new List<double>(),
"bool" or "boolean" => new List<bool>(),
"string" => new List<string>(),
_ => null
};
}
return type.ToLower() switch
{
"int" or "integer" => 0,
"float" => 0f,
"double" => 0.0,
"bool" or "boolean" => false,
"string" => string.Empty,
_ => null,
};
}
/// <summary>
/// 转换逗号分隔的字符串到 List<...> (List<int>, List<string>, ...)
/// </summary>
public static object ConvertToList(string cellValue, string type, string header, string className)
{
var insideType = type.Substring(5, type.Length - 6).Trim();
var splitted = string.IsNullOrEmpty(cellValue)
? Array.Empty<string>()
: cellValue.Split(',');
return insideType.ToLower() switch
{
"int" or "integer" => splitted.Select(s => {
int.TryParse(s.Trim(), out var parsed); return parsed;
}).ToList(),
"float" => splitted.Select(s => {
float.TryParse(s.Trim(), out var parsed); return parsed;
}).ToList(),
"double" => splitted.Select(s => {
double.TryParse(s.Trim(), out var parsed); return parsed;
}).ToList(),
"bool" or "boolean" => splitted.Select(s => {
return bool.TryParse(s.Trim(), out var parsed) ? parsed : (s.Trim() == "1" || s.Trim().Equals("true", StringComparison.OrdinalIgnoreCase));
}).ToList(),
"string" => splitted.Select(s => s.Trim()).ToList(),
_ => throw new Exception($"Unsupported list element type '{insideType}' for field '{header}' in class '{className}'.")
};
}
public static readonly Dictionary<string, Func<string, object>> TypeConverters = new(StringComparer.OrdinalIgnoreCase)
{
{ "int", value => int.TryParse(value, out var intValue) ? intValue : 0 },
{ "float", value => float.TryParse(value, out var floatValue) ? floatValue : 0f },
{ "double", value => double.TryParse(value, out var doubleValue) ? doubleValue : 0.0 },
{ "bool", value => bool.TryParse(value, out var boolValue)
? boolValue
: (value == "1" || value.Equals("true", StringComparison.OrdinalIgnoreCase)) },
{ "string", value => value ?? string.Empty }
};
}
}

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

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 44f4bfea1a574775841f162901455ee2
timeCreated: 1736083579

2
Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverUtil.cs → Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverUtil.Type.cs

@ -3,7 +3,7 @@ using System.Collections.Generic;
namespace Tools.ExcelResolver.Editor
{
public static class ExcelResolverUtil
public static partial class ExcelResolverUtil
{
/// <summary>
/// 类型缓存,避免重复反射查找

0
Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverUtil.cs.meta → Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverUtil.Type.cs.meta

Loading…
Cancel
Save