Browse Source

使用接口控制生成的代码

master
coffee 6 months ago
parent
commit
5ff9f8694b
  1. 7
      Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorConfig.cs
  2. 4
      Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.ReadExcel.cs
  3. 44
      Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteDataCode.cs
  4. 7
      Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOCode.cs
  5. 7
      Assets/Unity-Tools/Core/ExcelResolver/Interface/IExcelData.cs
  6. 3
      Assets/Unity-Tools/Core/ExcelResolver/Interface/IExcelData.cs.meta
  7. 7
      Assets/Unity-Tools/Core/ExcelResolver/Interface/IExcelSO.cs
  8. 3
      Assets/Unity-Tools/Core/ExcelResolver/Interface/IExcelSO.cs.meta

7
Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorConfig.cs

@ -5,15 +5,17 @@ using UnityEngine;
namespace Tools.ExcelResolver.Editor
{
[InlineEditor(InlineEditorObjectFieldModes.CompletelyHidden)]
[CreateAssetMenu(fileName = "ExcelResolverEditorConfig", menuName = "ExcelResolver/ExcelResolverEditorConfig")]
// [CreateAssetMenu(fileName = "ExcelResolverEditorConfig", menuName = "ExcelResolver/ExcelResolverEditorConfig")]
public sealed class ExcelResolverEditorConfig : ScriptableObject
{
[LabelText("Excel路径"), FolderPath]
public string ExcelPathRoot = "Assets/ExcelResolver/Excel";
[LabelText("Json路径"), ValueDropdown("@Tools.Editor.DirectoryUtil.GetFilePaths()")]
public string JsonPathRoot = "Assets/ExcelResolver/Json";
[LabelText("代码路径"), ValueDropdown("@Tools.Editor.DirectoryUtil.GetFilePaths()")]
[LabelText("C#代码路径"), ValueDropdown("@Tools.Editor.DirectoryUtil.GetFilePaths()")]
public string CodePathRoot = "Assets/Scripts/Generator/Excel";
[LabelText("SO存放路径"), ValueDropdown("@Tools.Editor.DirectoryUtil.GetFilePaths()")]
public string SOPathRoot = "Assets/ScriptableObject/Excel";
[LabelText("生成代码命名空间")]
public string GenerateDataClassNameSpace = "Tools.ExcelResolver";
@ -23,6 +25,7 @@ namespace Tools.ExcelResolver.Editor
{
DirectoryUtil.MakeSureDirectory(ExcelPathRoot);
DirectoryUtil.MakeSureDirectory(JsonPathRoot);
DirectoryUtil.MakeSureDirectory(SOPathRoot);
DirectoryUtil.MakeSureDirectory(CodePathRoot);
}
}

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;
@ -33,8 +34,11 @@ namespace Tools.ExcelResolver.Editor
fields = GetFieldData(worksheet),
keyIndex = keyIndex
};
WriteDataCode(classCodeData);
WriteSOCode(classCodeData);
}
AssetDatabase.Refresh();
}
private TableType CheckTableType(ExcelWorksheet worksheet, out int[] keyIndex)

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

@ -1,5 +1,7 @@
using System;
using System.CodeDom;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.IO;
using Microsoft.CSharp;
/* 使用CodeCompileUnit需要将Edit->Project Settings->Player->Other Settings->Api Compatibility Level改为.NET 4.x(或.NET Framework) */
@ -10,7 +12,7 @@ namespace Tools.ExcelResolver.Editor
{
private void WriteDataCode(ClassCodeData classCodeData)
{
string path = $"{excelResolverConfig.CodePathRoot}/{classCodeData.className}.cs";
string outputPath = $"{excelResolverConfig.CodePathRoot}/{classCodeData.className}.cs";
CodeCompileUnit compileUnit = new CodeCompileUnit();
CodeNamespace codeNamespace = new CodeNamespace(excelResolverConfig.GenerateDataClassNameSpace);
compileUnit.Namespaces.Add(codeNamespace);
@ -34,29 +36,23 @@ namespace Tools.ExcelResolver.Editor
CustomAttributes = new CodeAttributeDeclarationCollection()
{
new CodeAttributeDeclaration("Serializable")
}
},
BaseTypes = { new CodeTypeReference("IExcelData") }
};
codeNamespace.Types.Add(classType);
// switch (classCodeData.tableType)
// {
// case TableType.SingleKeyTable:
// classType.BaseTypes.Add(new CodeTypeReference("Dictionary<int, " + classCodeData.className + ">"));
// break;
// case TableType.UnionMultiKeyTable:
// classType.BaseTypes.Add(new CodeTypeReference("Dictionary<string, " + classCodeData.className + ">"));
// break;
// case TableType.MultiKeyTable:
// classType.BaseTypes.Add(new CodeTypeReference("Dictionary<int, " + classCodeData.className + ">"));
// break;
// case TableType.NotKetTable:
// classType.BaseTypes.Add(new CodeTypeReference("List<" + classCodeData.className + ">"));
// break;
// case TableType.ColumnTable:
// classType.BaseTypes.Add(new CodeTypeReference("Dictionary<int, " + classCodeData.className + ">"));
// break;
// default:
// throw new ArgumentOutOfRangeException();
// }
CodeGeneratorOptions options = new CodeGeneratorOptions
{
BracingStyle = "C",
BlankLinesBetweenMembers = false,
VerbatimOrder = true,
};
using (StreamWriter writer = new StreamWriter(outputPath))
{
CSharpCodeProvider provider = new CSharpCodeProvider();
provider.GenerateCodeFromCompileUnit(compileUnit, writer, options);
}
}
}
}

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

@ -9,7 +9,7 @@ namespace Tools.ExcelResolver.Editor
{
private void WriteSOCode(ClassCodeData classCodeData)
{
string outputPath = $"{excelResolverConfig.CodePathRoot}/{classCodeData.className}.cs";
string outputPath = $"{excelResolverConfig.CodePathRoot}/{classCodeData.className}SO.cs";
CodeCompileUnit compileUnit = new CodeCompileUnit();
CodeNamespace codeNamespace = new CodeNamespace(excelResolverConfig.GenerateDataClassNameSpace);
compileUnit.Namespaces.Add(codeNamespace);
@ -26,13 +26,14 @@ namespace Tools.ExcelResolver.Editor
codeNamespace.Imports.Add(new CodeNamespaceImport(import));
}
CodeTypeDeclaration classType = new CodeTypeDeclaration(classCodeData.className)
CodeTypeDeclaration classType = new CodeTypeDeclaration($"{classCodeData.className}SO")
{
IsClass = true,
TypeAttributes = System.Reflection.TypeAttributes.Public,
BaseTypes =
{
new CodeTypeReference("ScriptableObject")
new CodeTypeReference("ScriptableObject"),
new CodeTypeReference("IExcelSO"),
}
};
codeNamespace.Types.Add(classType);

7
Assets/Unity-Tools/Core/ExcelResolver/Interface/IExcelData.cs

@ -0,0 +1,7 @@
namespace Tools.ExcelResolver
{
public interface IExcelData
{
}
}

3
Assets/Unity-Tools/Core/ExcelResolver/Interface/IExcelData.cs.meta

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 9fcac6f462ea4970bcec93a8c1251964
timeCreated: 1736060782

7
Assets/Unity-Tools/Core/ExcelResolver/Interface/IExcelSO.cs

@ -0,0 +1,7 @@
namespace Tools.ExcelResolver
{
public interface IExcelSO
{
}
}

3
Assets/Unity-Tools/Core/ExcelResolver/Interface/IExcelSO.cs.meta

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: db16fbd5cf4648fcbef0b9f7ece040b1
timeCreated: 1736060065
Loading…
Cancel
Save