Files
JJBB/Assets/Project/Script/Common/Utilities/Editor/EditorTableManager.cs

151 lines
5.2 KiB
C#
Raw Normal View History

2024-08-23 15:49:34 +08:00
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using Module.Log;
using UnityEngine;
// 编辑器用表格读取工具用于避开修改自动生成的TableManager类来读取编辑器表格的功能
public static class EditorTableManager
{
public static List<T> GetTable<T>() where T : class
{
// 不缓存表格,可能有动态改表的情况
object tableList = null;
const string fileNameField = "TAB_FILE_DATA";
var fileNameGetInfo = typeof(T).GetField("TAB_FILE_DATA",
BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy);
if (fileNameGetInfo == null)
{
LogModule.ErrorLog(string.Format("类型{0}不存在表格路径{1}", typeof(T), fileNameField));
}
else
{
var fileName = (string) fileNameGetInfo.GetValue(null);
fileName = Path.GetFileName(fileName);
tableList = LoadTable<T>(fileName);
}
return tableList as List<T>;
}
private static List<T> LoadTable<T>(string tableName) where T : class
{
var filePath = GetTablePath(tableName);
if (!File.Exists(filePath))
{
LogModule.ErrorLog(string.Format("文件{0}不存在!", filePath));
}
else
{
ConstructorInfo constructor = null;
var ctors = typeof(T).GetConstructors();
for (var i = 0; i < ctors.Length; i++)
{
var parameters = ctors[i].GetParameters();
if (parameters.Length == 1
&& parameters[0].ParameterType == typeof(string))
{
constructor = ctors[i];
break;
}
}
if (constructor == null)
{
LogModule.ErrorLog(string.Format("类型{0}不存在表格形式的构造函数!", typeof(T)));
}
else
{
var list = new List<T>();
var lines = File.ReadAllLines(filePath);
for (var i = 2; i < lines.Length; i++)
{
var line = lines[i];
if (!string.IsNullOrEmpty(line) && !line[0].Equals('#') && !line[0].Equals('\t'))
{
var item = (T) constructor.Invoke(new object[] {line});
list.Add(item);
}
}
return list;
}
}
return null;
}
private static string GetTablePath(string tableName)
{
if (!Path.HasExtension(tableName))
tableName += AssetConst.textExtension;
return EditorCommonUtility.AssetToFilePath(LoadAssetBundle.tablePath) + tableName;
}
//private static void ReaderPList(string text, SerializableTable _fun, Dictionary<int, List<object>> _hash)
//{
// var alldataRow = text.Split('\n');
// int skip = 0;
// string[] typeList = null;
// foreach (string line in alldataRow)
// {
// int nKey;
// if (skip == 1)
// {
// typeList = line.Split('\t');
// _values = new string[typeList.Length];
// ++skip;
// continue;
// }
// if (++skip < 4) continue;
// if (string.IsNullOrEmpty(line)) continue;
// if (line[0] == '#') continue;
// string szlinetemp = line;
// if (szlinetemp.Length >= 1)
// {
// if (szlinetemp[szlinetemp.Length - 1] == '\r')
// {
// szlinetemp = szlinetemp.TrimEnd('\r');
// }
// }
// string[] strCol = MySplit(szlinetemp, typeList, "\t");
// if (strCol.Length == 0) continue;
// string skey = strCol[0];
// string[] valuesList = new string[strCol.Length];
// if (string.IsNullOrEmpty(skey) || skey.Equals("--"))
// {
// skey = _key;
// nKey = Int32.Parse(skey);
// valuesList[0] = skey;
// for (int i = 1; i < strCol.Length; ++i)
// {
// if (String.IsNullOrEmpty(strCol[i]) || strCol[i] == "--")
// {
// valuesList[i] = _values[i];
// }
// else
// {
// valuesList[i] = strCol[i];
// _values[i] = strCol[i];
// }
// }
// }
// else
// {
// _key = skey;
// nKey = Int32.Parse(skey);
// for (int i = 0; i < strCol.Length; ++i)
// {
// if (strCol[i] == "--")
// {
// valuesList[i] = "0";
// _values[i] = "0";
// }
// else
// {
// valuesList[i] = strCol[i];
// _values[i] = strCol[i];
// }
// }
// }
// _fun(valuesList, nKey, _hash);
// }
//}
}