Browse Source

纵表

main
coffee 5 months ago
parent
commit
fbefdcb794
  1. 6
      Assets/Unity-Tools/ExcelResolver/Editor/Core/Data/FieldData.cs
  2. 33
      Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.ReadExcel.cs
  3. 5
      Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteDataCode.cs
  4. 17
      Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteDataSO.cs
  5. 8
      Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteUtilCode.cs
  6. 40
      Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteUtilSO.cs
  7. BIN
      Assets/_Project/ExcelResolver/Excel/com.xlsx
  8. 7
      Assets/_Project/ExcelResolver/Excel/com.xlsx.meta
  9. 8
      Assets/_Project/ScriptableObject/Excel/Com.meta
  10. 26
      Assets/_Project/ScriptableObject/Excel/Com/_ComUtil.asset
  11. 8
      Assets/_Project/ScriptableObject/Excel/Com/_ComUtil.asset.meta
  12. 38
      Assets/_Project/Scripts/Generator/Excel/ComUtil.cs
  13. 2
      Assets/_Project/Scripts/Generator/Excel/ComUtil.cs.meta

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

@ -5,6 +5,10 @@ namespace Tools.ExcelResolver.Editor
{ {
internal class FieldData : IDisposable internal class FieldData : IDisposable
{ {
/// <summary>
/// 行索引
/// 如果是纵表,这个值表示列索引
/// </summary>
public int colIndex; public int colIndex;
public string varName; public string varName;
@ -14,7 +18,7 @@ namespace Tools.ExcelResolver.Editor
public string description; public string description;
public string path; public string path;
internal CodeMemberField GetCodeField() internal CodeMemberField GetCodeMemberField()
{ {
CodeMemberField codeField = new CodeMemberField CodeMemberField codeField = new CodeMemberField
{ {

33
Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.ReadExcel.cs

@ -55,7 +55,7 @@ namespace Tools.ExcelResolver.Editor
if (!onlyGetClassCodeData) if (!onlyGetClassCodeData)
{ {
WriteDataCode(classCodeData); WriteDataCode(classCodeData);
WriteSOCode(classCodeData); WriteUtilCode(classCodeData);
} }
classCodeDataDict.Add(worksheet, classCodeData); classCodeDataDict.Add(worksheet, classCodeData);
Debug.Log($"读取Excel文件:'{excelFile.Name}',并生成代码"); Debug.Log($"读取Excel文件:'{excelFile.Name}',并生成代码");
@ -206,15 +206,18 @@ namespace Tools.ExcelResolver.Editor
{ {
var fieldDatas = new Dictionary<int, FieldData>(); var fieldDatas = new Dictionary<int, FieldData>();
// 横表
if (!worksheet.Cells[1, 1].Text.Contains("ColumnTable", StringComparison.OrdinalIgnoreCase))
{
for (int col = 2; col <= worksheet.Dimension.End.Column; col++) for (int col = 2; col <= worksheet.Dimension.End.Column; col++)
{ {
var cellText = worksheet.Cells[2, col].Text; var varText = worksheet.Cells[2, col].Text;
if (string.IsNullOrEmpty(cellText) || cellText == "##") continue; if (string.IsNullOrEmpty(varText) || varText == "##") continue;
FieldData fieldData = new FieldData FieldData fieldData = new FieldData
{ {
colIndex = col, colIndex = col,
varName = cellText, varName = varText,
// typeString = worksheet.Cells[3, col].Text, // typeString = worksheet.Cells[3, col].Text,
type = ExcelResolverUtil.GetTTypeByString(worksheet.Cells[3, col].Text, worksheet.Cells[3, col], classCodeData.className), type = ExcelResolverUtil.GetTTypeByString(worksheet.Cells[3, col].Text, worksheet.Cells[3, col], classCodeData.className),
info = worksheet.Cells[4, col].Text, info = worksheet.Cells[4, col].Text,
@ -223,6 +226,28 @@ namespace Tools.ExcelResolver.Editor
}; };
fieldDatas.Add(col, fieldData); fieldDatas.Add(col, fieldData);
} }
}
// 纵表
else
{
for (int row = 2; row <= worksheet.Dimension.End.Row; row++)
{
var varText = worksheet.Cells[row, 1].Text;
if (string.IsNullOrEmpty(varText) || varText.StartsWith("##")) continue;
FieldData fieldData = new FieldData
{
colIndex = row,
varName = varText,
// typeString = worksheet.Cells[row, 2].Text,
type = ExcelResolverUtil.GetTTypeByString(worksheet.Cells[row, 2].Text, worksheet.Cells[row, 2], classCodeData.className),
info = worksheet.Cells[row, 4].Text,
description = worksheet.Cells[row, 5].Text,
path = worksheet.Cells[row, 6].Text,
};
fieldDatas.Add(row, fieldData);
}
}
// 判断是否有重复的varName // 判断是否有重复的varName
foreach (var fieldData in fieldDatas.Values) foreach (var fieldData in fieldDatas.Values)

5
Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteDataCode.cs

@ -14,6 +14,9 @@ namespace Tools.ExcelResolver.Editor
{ {
private void WriteDataCode(ClassCodeData classCodeData) private void WriteDataCode(ClassCodeData classCodeData)
{ {
// 纵表不生成Data类
if (classCodeData.tableType == TableType.ColumnTable) return;
string outputPath = $"{excelResolverConfig.CodePathRoot}/{classCodeData.className}.cs"; string outputPath = $"{excelResolverConfig.CodePathRoot}/{classCodeData.className}.cs";
CodeCompileUnit compileUnit = new CodeCompileUnit(); CodeCompileUnit compileUnit = new CodeCompileUnit();
@ -65,7 +68,7 @@ namespace Tools.ExcelResolver.Editor
foreach (var field in classCodeData.fields.Values) foreach (var field in classCodeData.fields.Values)
{ {
classType.Members.Add(field.GetCodeField()); classType.Members.Add(field.GetCodeMemberField());
} }
#endregion #endregion

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

@ -30,6 +30,14 @@ namespace Tools.ExcelResolver.Editor
var path = $"{excelResolverConfig.SOPathRoot}/{classCodeData.className}/"; var path = $"{excelResolverConfig.SOPathRoot}/{classCodeData.className}/";
DirectoryUtil.MakeSureDirectory(path); DirectoryUtil.MakeSureDirectory(path);
// 纵表不生成Data类,直接生成Util类
if (classCodeData.tableType == TableType.ColumnTable)
{
WriteUtilSO(path, worksheet, classCodeData);
continue;
}
string[] assetGuids = AssetDatabase.FindAssets($"t:{dataName}", 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++)
@ -54,7 +62,7 @@ namespace Tools.ExcelResolver.Editor
if (originAssets.ContainsKey(assetName)) if (originAssets.ContainsKey(assetName))
{ {
set(originAssets[assetName], worksheet, row, classCodeData); setValue(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]);
@ -63,7 +71,7 @@ namespace Tools.ExcelResolver.Editor
else else
{ {
ScriptableObject instance = ScriptableObject.CreateInstance(dataName); ScriptableObject instance = ScriptableObject.CreateInstance(dataName);
set(instance, worksheet, row, classCodeData); setValue(instance, worksheet, row, classCodeData);
AssetDatabase.CreateAsset(instance, fullPath); AssetDatabase.CreateAsset(instance, fullPath);
Debug.Log($"<color=green>创建</color>:{assetName}", instance); Debug.Log($"<color=green>创建</color>:{assetName}", instance);
result.Add(instance); result.Add(instance);
@ -83,7 +91,8 @@ namespace Tools.ExcelResolver.Editor
GC.Collect(); GC.Collect();
GC.WaitForPendingFinalizers(); GC.WaitForPendingFinalizers();
void set(ScriptableObject instance, ExcelWorksheet worksheet, int row, ClassCodeData classCodeData) // 横表
void setValue(ScriptableObject instance, ExcelWorksheet worksheet, int row, ClassCodeData classCodeData)
{ {
foreach (var pair in classCodeData.fields) foreach (var pair in classCodeData.fields)
{ {
@ -128,8 +137,6 @@ namespace Tools.ExcelResolver.Editor
} }
case TableType.NotKetTable: case TableType.NotKetTable:
return $"{classCodeData.className}_{row}"; return $"{classCodeData.className}_{row}";
case TableType.ColumnTable:
return $"{classCodeData.className}_{classCodeData.fields[2].varName}";
} }

8
Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteUtilCode.cs

@ -10,7 +10,7 @@ namespace Tools.ExcelResolver.Editor
{ {
public sealed partial class ExcelResolverEditorWindow public sealed partial class ExcelResolverEditorWindow
{ {
private void WriteSOCode(ClassCodeData classCodeData) private void WriteUtilCode(ClassCodeData classCodeData)
{ {
string outputPath = $"{excelResolverConfig.CodePathRoot}/{classCodeData.className}Util.cs"; string outputPath = $"{excelResolverConfig.CodePathRoot}/{classCodeData.className}Util.cs";
CodeCompileUnit compileUnit = new CodeCompileUnit(); CodeCompileUnit compileUnit = new CodeCompileUnit();
@ -119,8 +119,14 @@ namespace Tools.ExcelResolver.Editor
break; break;
} }
case TableType.ColumnTable: case TableType.ColumnTable:
{
foreach (var fieldData in classCodeData.fields.Values)
{
codeFields.Add(fieldData.GetCodeMemberField());
}
break; break;
} }
}
foreach (var codeField in codeFields) foreach (var codeField in codeFields)
{ {

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

@ -2,6 +2,8 @@
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Reflection;
using OfficeOpenXml;
using UnityEditor; using UnityEditor;
using UnityEngine; using UnityEngine;
@ -160,9 +162,45 @@ namespace Tools.ExcelResolver.Editor
break; break;
} }
case TableType.ColumnTable: case TableType.ColumnTable:
break; throw new ArgumentException("ColumnTable 应该使用另一个WriteUtilSO方法.");
} }
EditorUtility.SetDirty(instance); EditorUtility.SetDirty(instance);
} }
private void WriteUtilSO(string path, ExcelWorksheet worksheet, ClassCodeData classCodeData)
{
if (classCodeData.tableType != TableType.ColumnTable)
throw new ArgumentException("只有ColumnTable才能使用此方法.");
var utilName = $"{classCodeData.className}Util";
var utilPath = $"{path}/_{utilName}.asset";
var instance = AssetDatabase.LoadAssetAtPath<ScriptableObject>(utilPath);
if (instance == null)
{
instance = ScriptableObject.CreateInstance(utilName);
AssetDatabase.CreateAsset(instance, utilPath);
}
setValue(instance, worksheet, classCodeData);
EditorUtility.SetDirty(instance);
// 纵表
void setValue(ScriptableObject instance, ExcelWorksheet worksheet, ClassCodeData classCodeData)
{
foreach (var pair in classCodeData.fields)
{
var row = pair.Key;
var fieldData = pair.Value;
var cell = worksheet.Cells[row, 3];
object convertedValue = ExcelResolverUtil.ConvertCellValue(cell, fieldData.type, classCodeData.className);
FieldInfo fieldInfo = instance.GetType().GetField(fieldData.varName);
if (fieldInfo == null) throw new Exception($"{classCodeData.className}中不存在字段:{fieldData.varName}");
fieldInfo.SetValue(instance, convertedValue);
}
}
}
} }
} }

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

Binary file not shown.

7
Assets/_Project/ExcelResolver/Excel/com.xlsx.meta

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: c603f54d33a16b74f96c74e8b403ca0b
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

8
Assets/_Project/ScriptableObject/Excel/Com.meta

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 5d697dbce85032d4dba2a90d7bb50290
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

26
Assets/_Project/ScriptableObject/Excel/Com/_ComUtil.asset

@ -0,0 +1,26 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 65d0d896e6a9aba4c86524d1ead223f2, type: 3}
m_Name: _ComUtil
m_EditorClassIdentifier:
serializationData:
SerializedFormat: 2
SerializedBytes:
ReferencedUnityObjects: []
SerializedBytesString:
Prefab: {fileID: 0}
PrefabModificationsReferencedUnityObjects: []
PrefabModifications: []
SerializationNodes: []
cangku_chushi: 3
des_xishu: 2
ta_chushi_unlock: 01000000cc00000091010000cb000000

8
Assets/_Project/ScriptableObject/Excel/Com/_ComUtil.asset.meta

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 7ee0eb7708acae845ae0445697042da4
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

38
Assets/_Project/Scripts/Generator/Excel/ComUtil.cs

@ -0,0 +1,38 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Tools.ExcelResolver
{
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Sirenix.OdinInspector;
public class ComUtil : SerializedScriptableObject, IExcelSOUtil
{
/// <summary>
/// 初始仓库空位数
/// </summary>
public int cangku_chushi;
/// <summary>
/// 防御系数
/// </summary>
public int des_xishu;
/// <summary>
/// 初始解锁的塔
/// </summary>
public List<Int32> ta_chushi_unlock;
}
}

2
Assets/_Project/Scripts/Generator/Excel/ComUtil.cs.meta

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 65d0d896e6a9aba4c86524d1ead223f2
Loading…
Cancel
Save