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); // } //} }