using System; using System.Collections.Generic; using System.IO; using System.Text; using System.Windows.Forms; using UnityEditor; using UnityEngine; public class TableTool : EditorWindow { public static string configOutPutPath; static bool isIL = false; // 导出表代码是否IL使用 [UnityEditor.MenuItem("策划工具/导出策划表到游戏工程")] static void Init() { configOutPutPath = UnityEngine.Application.dataPath + "/StreamingAssets/Config"; window = GetWindow(typeof(TableTool), true, "策划导表工具") as TableTool; window.position = new Rect(UnityEngine.Screen.width / 2, UnityEngine.Screen.height / 2, 300, 700); window.Show(); PathCache(); } public class FileToggleInfo { public FileToggleInfo(FileInfo file, bool sel) { fileInfo = file; isSelect = sel; } public FileInfo fileInfo = null; public bool isSelect = false; } private static TableTool window = null; private Vector2 scrollPosition; private static string _tablePath = ""; private static List _tableNameLst = new List(); //所有表名字列表 private void OnGUI() { GUILayout.BeginVertical(); GUILayout.TextArea("策划配表路径:" + _tablePath); GUILayout.Box(new GUIContent("路径下的所有表:")); scrollPosition = GUILayout.BeginScrollView(scrollPosition); ShowTableNames(); GUILayout.EndScrollView(); GUILayout.FlexibleSpace(); GUILayout.BeginHorizontal(); if (GUILayout.Button("刷新")) { GetDicFiles(); } if (GUILayout.Button("全选")) { SelectAll(); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); if (GUILayout.Button("导出表")) { isIL = false; ReadAllTxt(); GenAllClass(); MessageBox.Show("导出表成功!"); AssetDatabase.Refresh(); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); if (GUILayout.Button("导出IL表")) { isIL = true; ReadAllTxt(); GenAllClass(); MessageBox.Show("导出IL表成功!"); AssetDatabase.Refresh(); isIL = false; } GUILayout.EndHorizontal(); if (GUILayout.Button("选择路径")) { #if UNITY_EDITOR FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog(); if (folderBrowserDialog.ShowDialog() == DialogResult.OK || folderBrowserDialog.ShowDialog() == DialogResult.Yes) { _tablePath = folderBrowserDialog.SelectedPath + "\\"; PathCache(_tablePath); } folderBrowserDialog.Dispose(); #endif } GUIUtility.ExitGUI(); } private void ShowTableNames() { if (_tableNameLst == null) { return; } for (int i = 0; i < _tableNameLst.Count; i++) { string tableName = _tableNameLst[i].fileInfo.Name; _tableNameLst[i].isSelect = GUILayout.Toggle(_tableNameLst[i].isSelect, tableName); } } private void GetDicFiles() { if (string.IsNullOrEmpty(_tablePath)) { MessageBox.Show("请选择策划表路径!"); return; } _tableNameLst.Clear(); DirectoryInfo folder = new DirectoryInfo(@_tablePath); if (folder != null) { FileInfo[] fileInfoArr = folder.GetFiles("*.txt"); if (fileInfoArr == null || fileInfoArr.Length <= 0) { return; } for (int i = 0, length = fileInfoArr.Length; i < length; i++) { _tableNameLst.Add(new FileToggleInfo(fileInfoArr[i], false)); } } } /// /// 选中所有表 /// private void SelectAll() { if (_tableNameLst == null) { MessageBox.Show("当前没有表可选!"); return; } for (int i = 0; i < _tableNameLst.Count; i++) { if (_tableNameLst[i] == null) { continue; } if (_tableNameLst[i].fileInfo == null) { continue; } _tableNameLst[i].isSelect = true; } } [UnityEditor.MenuItem("Assets/生成配置解析类型")] public static void GenerateConfigClass() { _tableNameLst.Clear(); if (UnityEditor.Selection.objects != null) { foreach (var o in UnityEditor.Selection.objects) { var objectName = AssetDatabase.GetAssetPath(o.GetInstanceID()); if (objectName.EndsWith(".txt") || objectName.EndsWith(".TXT")) { _tableNameLst.Add(new FileToggleInfo(new FileInfo(objectName), true)); } } GenAllClass(); AssetDatabase.Refresh(); } _tableNameLst.Clear(); MessageBox.Show("导出成功!"); } public static void CopyConfigsToOutPutPath(string _outPath) { configOutPutPath = _outPath; var root1 = UnityEngine.Application.dataPath + "/ResourcesOut/Refdata/Config"; var configFiles = new List(); configFiles.AddRange(FileExtersion.GetFileInfos(root1, new string[] { "*.txt", "*.TXT" })); var root2 = UnityEngine.Application.dataPath + "/Resources/Config"; if (Directory.Exists(root2)) { var fileInfos = FileExtersion.GetFileInfos(root2, new string[] { "*.txt", "*.TXT" }); if (fileInfos != null) { configFiles.AddRange(fileInfos); } } foreach (var file in configFiles) { var fileInfo = new FileInfo(file.FullName); CopyTxt(fileInfo); } } /// /// 导出所有表 /// private void ReadAllTxt() { if (string.IsNullOrEmpty(_tablePath)) { MessageBox.Show("请选择策划表路径!"); return; } if (_tableNameLst == null) { MessageBox.Show("当前路径下没有可读取的策划表!"); return; } for (int i = 0; i < _tableNameLst.Count; i++) { if (!_tableNameLst[i].isSelect) { continue; } CopyTxt(_tableNameLst[i].fileInfo); } } private static void CopyTxt(FileInfo fileInfo) { string fileName = fileInfo.Name.Split('.')[0]; if (!Directory.Exists(configOutPutPath)) { Directory.CreateDirectory(configOutPutPath); } string filePath = configOutPutPath + "/" + fileName + ".txt"; if (File.Exists(filePath)) { File.Delete(filePath); } File.Copy(fileInfo.FullName, filePath); } /// /// 生成所有表模型 /// private static void GenAllClass() { if (_tableNameLst == null) { return; } for (int i = 0; i < _tableNameLst.Count; i++) { if (!_tableNameLst[i].isSelect) { continue; } FileStream fileStream = _tableNameLst[i].fileInfo.OpenRead(); StreamReader sr = new StreamReader(fileStream, Encoding.Default); CreateConfigClassFile.CreateConfigClass(_tableNameLst[i].fileInfo, isIL); sr.Dispose(); sr.Close(); } } /// /// 路径缓存 /// /// private static void PathCache(string setPath = "") { DebugEx.Log("路径缓存:" + setPath); string configPath = UnityEngine.Application.dataPath; configPath = configPath + "/ResourcesOut/Refdata/Config/PathCache/TablePath.txt"; FileStream configPathTxt = File.Open(configPath, FileMode.Open); if (string.IsNullOrEmpty(setPath)) { StreamReader sr = new StreamReader(configPathTxt); string path = sr.ReadToEnd(); _tablePath = path; sr.Dispose(); sr.Close(); } else { StreamWriter sw = new StreamWriter(configPathTxt); sw.Write(setPath); sw.Dispose(); sw.Close(); } } } public class Param { public int Paramindex; public string AttType; public Type SysType; public List ParmValue = null; public string SampleValue; public string parmName; public string SrcParmName; public string parmComment; public Param(string attType, string attName, string attcomment, string samValue, int index) { ParmValue = new List(); Paramindex = index; SetParmName(attName); parmComment = attcomment; SampleValue = samValue; StringBuilder valueSb = new StringBuilder(); valueSb.Append("modelDetails["); valueSb.Append(index.ToString()); valueSb.Append("].Trim()"); string value = valueSb.ToString(); attType = attType.Trim(); switch (attType) { case "int": { SysType = typeof(System.Int32); SetSigleValue("int", value); } break; case "Int64": { SysType = typeof(System.Int64); SetSigleValue("Int64", value); } break; case "string": { SysType = typeof(System.String); ParmValue.Add(value + ";"); } break; case "bool": { SysType = typeof(System.Boolean); ParmValue.Add(value + ";"); } break; case "float": { SysType = typeof(System.Double); SetSigleValue("float", value); } break; case "byte": { SysType = typeof(System.Byte); SetSigleValue("byte", value); } break; case "double": { SysType = typeof(System.Double); SetSigleValue("double", value); } break; case "int[]": SysType = Type.GetType("System.Int32[]"); SetValue("int", value, SampleValue); break; case "string[]": SysType = Type.GetType("System.String[]"); SetValue("string", value, SampleValue); break; case "double[]": SysType = Type.GetType("System.Double[]"); SetValue("double", value, SampleValue); break; default: SysType = null; break; } } private void SetValue(string paramType, string value, string sampleValue) { string[] valueSpArray = sampleValue.Split('|'); if (valueSpArray == null) { return; } StringBuilder arrayName = new StringBuilder(); arrayName.Append(parmName); arrayName.Append("SplitArray"); StringBuilder firstValue = new StringBuilder(); firstValue.Append("string[] "); firstValue.Append(arrayName.ToString()); firstValue.Append(" = "); firstValue.Append(value); firstValue.Append(".Split('|');"); ParmValue.Add(firstValue.ToString()); StringBuilder secondValue = new StringBuilder(); secondValue.Append(parmName); secondValue.Append(" = new "); secondValue.Append(paramType); secondValue.Append("[" + valueSpArray.Length + "];"); ParmValue.Add(secondValue.ToString()); ParmValue.Add(string.Format("for (int i = 0; i < {0}.Length; i++) {", parmName)); ParmValue.Add(string.Format(" {0}[i] = IsNumeric({1}SplitArray[i]) ? double.Parse({2}SplitArray[i]) : (double)0;", parmName, parmName, parmName)); ParmValue.Add("}"); } private void SetSigleValue(string paramType, string value) { StringBuilder strBld = new StringBuilder(); strBld.Append("IsNumeric("); strBld.Append(value); strBld.Append(string.Format(")? {0}.Parse(", paramType)); strBld.Append(value); strBld.Append(string.Format("):({0})0;", paramType)); ParmValue.Add(strBld.ToString()); } public void SetParmName(string fieldName) { string fName = fieldName.Replace(" ", ""); fName = fName.Split('[')[0]; SrcParmName = fName; fName = "_" + fName.ToLower(); parmName = fName; } }