Browse Source

生成SO资产

master
coffee 6 months ago
parent
commit
4de250aa62
  1. 55
      Assets/Unity-Tools/Core/ExcelResolver/Editor/ClassCodeData.cs
  2. 3
      Assets/Unity-Tools/Core/ExcelResolver/Editor/Data.meta
  3. 37
      Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/ClassCodeData.cs
  4. 0
      Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/ClassCodeData.cs.meta
  5. 44
      Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/FieldData.cs
  6. 3
      Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/FieldData.cs.meta
  7. 11
      Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/TableType.cs
  8. 3
      Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/TableType.cs.meta
  9. 15
      Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.CreateAndSaveSO.cs
  10. 3
      Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.CreateAndSaveSO.cs.meta
  11. 15
      Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.ReadExcel.cs
  12. 38
      Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOCode.cs

55
Assets/Unity-Tools/Core/ExcelResolver/Editor/ClassCodeData.cs

@ -1,55 +0,0 @@
using System;
using System.Collections.Generic;
using Sirenix.Utilities;
namespace Tools.ExcelResolver.Editor
{
internal class ClassCodeData : IDisposable
{
public TableType tableType;
public string className;
public FieldData[] fields;
public int[] keyIndex;
public ClassCodeData(TableType tableType, string className)
{
this.tableType = tableType;
this.className = $"{char.ToUpper(className[0])}{className.Substring(1)}";
}
public void Dispose()
{
className = null;
fields.ForEach(field => field.Dispose());
fields = null;
keyIndex = null;
}
}
internal class FieldData : IDisposable
{
public string varName;
public Type type;
public string info;
public string description;
public string path;
public void Dispose()
{
varName = null;
type = null;
info = null;
description = null;
path = null;
}
}
internal enum TableType
{
SingleKeyTable, // 单主键表
UnionMultiKeyTable, // 多主键表(联合索引)
MultiKeyTable, // 多主键表(独立索引)
NotKetTable, // 无主键表
ColumnTable, // 纵表
}
}

3
Assets/Unity-Tools/Core/ExcelResolver/Editor/Data.meta

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: de2816e4f3c947bf8c8292e2a4625987
timeCreated: 1736064127

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

@ -0,0 +1,37 @@
using System;
using System.Linq;
using Sirenix.Utilities;
namespace Tools.ExcelResolver.Editor
{
internal class ClassCodeData : IDisposable
{
public TableType tableType;
public string className;
public FieldData[] fields;
public int[] keyIndex;
public FieldData[] keyField;
public ClassCodeData(TableType tableType, string className, FieldData[] fields, int[] keyIndex)
{
this.tableType = tableType;
this.className = $"{char.ToUpper(className[0])}{className.Substring(1)}";
this.fields = fields;
this.keyIndex = keyIndex;
keyField = new FieldData[keyIndex.Length];
for (int i = 0; i < keyIndex.Length; i++)
{
keyField[i] = fields.First(f => f.colIndex == keyIndex[i]);
}
}
public void Dispose()
{
className = null;
fields.ForEach(field => field.Dispose());
fields = null;
keyIndex = null;
}
}
}

0
Assets/Unity-Tools/Core/ExcelResolver/Editor/ClassCodeData.cs.meta → Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/ClassCodeData.cs.meta

44
Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/FieldData.cs

@ -0,0 +1,44 @@
using System;
using System.CodeDom;
namespace Tools.ExcelResolver.Editor
{
internal class FieldData : IDisposable
{
public int colIndex;
public string varName;
public string typeString;
public Type type;
public string info;
public string description;
public string path;
public void Dispose()
{
varName = null;
type = null;
info = null;
description = null;
path = null;
}
}
internal static class FieldDataExtension
{
internal static CodeMemberField GetCodeField(this FieldData field)
{
CodeMemberField codeField = new CodeMemberField
{
Attributes = MemberAttributes.Public,
Name = field.varName,
Type = new CodeTypeReference(field.type),
CustomAttributes = new CodeAttributeDeclarationCollection()
{
new CodeAttributeDeclaration("SerializeField")
},
};
return codeField;
}
}
}

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

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 148e616320e64bf8bf00bd7246c111cd
timeCreated: 1736064103

11
Assets/Unity-Tools/Core/ExcelResolver/Editor/Data/TableType.cs

@ -0,0 +1,11 @@
namespace Tools.ExcelResolver.Editor
{
internal enum TableType
{
SingleKeyTable, // 单主键表
UnionMultiKeyTable, // 多主键表(联合索引)
MultiKeyTable, // 多主键表(独立索引)
NotKetTable, // 无主键表
ColumnTable, // 纵表
}
}

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

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 26412086a14b46d48ae049ed45c53010
timeCreated: 1736064144

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

@ -0,0 +1,15 @@
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();
}
}
}

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

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 6236e2a00de94de2b8e6aff5ac5c7745
timeCreated: 1736066833

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

@ -3,7 +3,6 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using OfficeOpenXml;
using UnityEditor;
using UnityEngine;
using UnityEngine.Assertions;
@ -29,13 +28,14 @@ namespace Tools.ExcelResolver.Editor
continue;
}
var classCodeData = new ClassCodeData(CheckTableType(worksheet, out var keyIndex), excelFile.Name[..^5])
{
fields = GetFieldData(worksheet),
keyIndex = keyIndex
};
var fieldDatas = GetFieldData(worksheet);
var tableType = CheckTableType(worksheet, out var keyIndex);
var classCodeData = new ClassCodeData(tableType, excelFile.Name[..^5], fieldDatas, keyIndex);
WriteDataCode(classCodeData);
WriteSOCode(classCodeData);
CreateSO(classCodeData);
}
// AssetDatabase.Refresh();
@ -50,6 +50,7 @@ namespace Tools.ExcelResolver.Editor
var type = TableType.SingleKeyTable;
keyIndex = null;
if (config.Contains("SingleKeyTable"))
{
type = TableType.SingleKeyTable;
@ -128,7 +129,9 @@ namespace Tools.ExcelResolver.Editor
{
FieldData fieldData = new FieldData
{
colIndex = col,
varName = worksheet.Cells[2, col].Text,
typeString = worksheet.Cells[3, col].Text,
type = TypeUtil.GetTypeByString(worksheet.Cells[3, col].Text),
info = worksheet.Cells[4, col].Text,
description = worksheet.Cells[5, col].Text,

38
Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOCode.cs

@ -1,5 +1,7 @@
using System.CodeDom;
using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.IO;
using Microsoft.CSharp;
@ -27,6 +29,7 @@ namespace Tools.ExcelResolver.Editor
"System.Collections",
"System.Collections.Generic",
"UnityEngine",
"Sirenix.OdinInspector",
};
foreach (var import in classImports)
{
@ -43,7 +46,7 @@ namespace Tools.ExcelResolver.Editor
TypeAttributes = System.Reflection.TypeAttributes.Public,
BaseTypes =
{
new CodeTypeReference("ScriptableObject"),
new CodeTypeReference("SerializedScriptableObject"),
new CodeTypeReference("IExcelSO"),
}
};
@ -51,7 +54,38 @@ namespace Tools.ExcelResolver.Editor
#endregion
#region 字段
List<CodeMemberField> codeFields = new List<CodeMemberField>();
switch (classCodeData.tableType)
{
case TableType.SingleKeyTable:
FieldData keyField = classCodeData.keyField[0];
CodeMemberField codeField = new CodeMemberField($"Dictionary<{keyField.typeString}, {classCodeData.className}>", "Data")
{
Attributes = MemberAttributes.Public,
};
codeFields.Add(codeField);
break;
case TableType.UnionMultiKeyTable:
break;
case TableType.MultiKeyTable:
break;
case TableType.NotKetTable:
break;
case TableType.ColumnTable:
break;
default:
throw new ArgumentOutOfRangeException();
}
foreach (var codeField in codeFields)
{
classType.Members.Add(codeField);
}
#endregion

Loading…
Cancel
Save