| | |
| | | using System.Text;
|
| | | using UnityEditor;
|
| | | using UnityEngine;
|
| | | using System.Linq;
|
| | |
|
| | | /// <summary>
|
| | | /// 配置生成器 - 用于自动生成配置管理器代码
|
| | |
| | | private const string ConfigsPath = "Assets/Scripts/Main/Config/Configs";
|
| | | private const string ConfigManagerPath = "Assets/Scripts/Main/Config/ConfigManager.cs";
|
| | |
|
| | | private static List<string> ExcludeClassList = new List<string>()
|
| | | public static List<string> ExcludeClassList = new List<string>()
|
| | | {
|
| | | // 特殊表格
|
| | | "InitialFunctionConfig",
|
| | |
| | | /// 获取所有配置类
|
| | | /// </summary>
|
| | | /// <returns>配置类名称列表</returns>
|
| | | private static List<string> GetAllConfigClasses()
|
| | | public static List<string> GetAllConfigClasses()
|
| | | {
|
| | | // 获取配置目录的完整路径
|
| | | string fullConfigsPath = Path.Combine(Application.dataPath, ConfigsPath.Replace("Assets/", ""));
|
| | |
| | | sb.AppendLine("using UnityEngine;");
|
| | | sb.AppendLine("using Cysharp.Threading.Tasks;");
|
| | | sb.AppendLine("using System.Reflection;");
|
| | | sb.AppendLine("using System.Linq;");
|
| | | sb.AppendLine();
|
| | | sb.AppendLine("#if UNITY_EDITOR");
|
| | | sb.AppendLine("using UnityEditor;");
|
| | | sb.AppendLine("#endif");
|
| | | sb.AppendLine();
|
| | | sb.AppendLine("public class ConfigManager : ManagerBase<ConfigManager>");
|
| | | sb.AppendLine("{");
|
| | |
| | | sb.AppendLine(" isLoadFinished = false;");
|
| | | sb.AppendLine();
|
| | | sb.AppendLine(" // 加载配置文件");
|
| | | sb.AppendLine($" int totalConfigs = {configClasses.Count};");
|
| | | sb.AppendLine(" List<Type> configTypes = new List<Type>() {");
|
| | | sb.AppendLine(" HashSet<Type> configTypes = new HashSet<Type>() {");
|
| | | for (int i = 0; i < configClasses.Count; i++)
|
| | | {
|
| | | sb.Append($" typeof({configClasses[i]})");
|
| | |
| | | sb.AppendLine();
|
| | | sb.AppendLine("#if UNITY_EDITOR");
|
| | | sb.AppendLine(" HashSet<Type> configHashSet = new HashSet<Type>();");
|
| | | sb.AppendLine(" if (System.IO.File.Exists(Application.dataPath + \"/fastConfig.txt\"))");
|
| | | sb.AppendLine(" if (System.IO.File.Exists(Application.dataPath + \"/fastConfig.txt\") && Launch.Instance.isOpenConfigTesting)");
|
| | | sb.AppendLine(" {");
|
| | | sb.AppendLine(" string[] strConfgsArr = System.IO.File.ReadAllLines(Application.dataPath + \"/fastConfig.txt\");");
|
| | | sb.AppendLine(" foreach (string str in strConfgsArr)");
|
| | |
| | | sb.AppendLine(" }");
|
| | | sb.AppendLine(" }");
|
| | | sb.AppendLine(" // 编辑器下加入 评估加载时常");
|
| | | sb.AppendLine(" configTypes.AddRange(configHashSet);");
|
| | | sb.AppendLine(" foreach (var config in configHashSet)");
|
| | | sb.AppendLine(" {");
|
| | | sb.AppendLine(" if (!configTypes.Add(config))");
|
| | | sb.AppendLine(" {");
|
| | | sb.AppendLine(" Debug.LogWarning($\"配置 {config.Name} 已经存在于 configTypes 中,跳过添加。\");");
|
| | | sb.AppendLine(" }");
|
| | | sb.AppendLine(" }");
|
| | | sb.AppendLine(" List<string> fastName = new List<string>();");
|
| | | sb.AppendLine("#endif");
|
| | | sb.AppendLine(" int iterator = 0;");
|
| | | sb.AppendLine(" int totalConfigs = configTypes.Count;");
|
| | | sb.AppendLine();
|
| | | sb.AppendLine(" // 逐个加载配置并更新进度");
|
| | | sb.AppendLine(" for (int i = 0; i < configTypes.Count; i++)");
|
| | | sb.AppendLine(" foreach (var configType in configTypes)");
|
| | | sb.AppendLine(" {");
|
| | | sb.AppendLine(" var sw = System.Diagnostics.Stopwatch.StartNew();");
|
| | | sb.AppendLine(" LoadConfigByType(configTypes[i]);");
|
| | | sb.AppendLine(" LoadConfigByType(configType);");
|
| | | sb.AppendLine(" sw.Stop();");
|
| | | sb.AppendLine("#if UNITY_EDITOR");
|
| | | sb.AppendLine(" if (sw.ElapsedMilliseconds >= 100)");
|
| | | sb.AppendLine(" {");
|
| | | sb.AppendLine(" Debug.LogError($\"加载配置 {configTypes[i].Name} 耗时较长: {sw.ElapsedMilliseconds} ms\");");
|
| | | sb.AppendLine(" Debug.LogError($\"加载配置 {configType.Name} 耗时较长: {sw.ElapsedMilliseconds} ms\");");
|
| | | sb.AppendLine(" }");
|
| | | sb.AppendLine(" else if (sw.ElapsedMilliseconds <= 5)");
|
| | | sb.AppendLine(" {");
|
| | | sb.AppendLine(" fastName.Add(configTypes[i].Name);");
|
| | | sb.AppendLine(" fastName.Add(configType.Name);");
|
| | | sb.AppendLine(" }");
|
| | | sb.AppendLine(" Debug.Log($\"加载配置: {configTypes[i].Name} 用时: {sw.ElapsedMilliseconds} ms\");");
|
| | | sb.AppendLine(" Debug.Log($\"加载配置: {configType.Name} 用时: {sw.ElapsedMilliseconds} ms\");");
|
| | | sb.AppendLine("#endif");
|
| | | sb.AppendLine(" loadingProgress = (float)(i + 1) / totalConfigs;");
|
| | | sb.AppendLine(" loadingProgress = (float)(iterator++ + 1) / totalConfigs;");
|
| | | sb.AppendLine(" }");
|
| | | sb.AppendLine("#if UNITY_EDITOR");
|
| | | sb.AppendLine(" System.IO.File.WriteAllText(Application.dataPath + \"/fastConfig.txt\", string.Join(\"\\n\", fastName));");
|
| | | sb.AppendLine();
|
| | | sb.AppendLine(" //加载完后卸载");
|
| | | sb.AppendLine(" foreach (var configType in configTypes)");
|
| | | sb.AppendLine(" if (Launch.Instance.isOpenConfigTesting)");
|
| | | sb.AppendLine(" {");
|
| | | sb.AppendLine(" var methodInfo = configType.GetMethod(\"ForceRelease\", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.FlattenHierarchy);");
|
| | | sb.AppendLine(" if (methodInfo != null)");
|
| | | sb.AppendLine(" System.IO.File.WriteAllText(Application.dataPath + \"/fastConfig.txt\", string.Join(\"\\n\", fastName));");
|
| | | sb.AppendLine();
|
| | | sb.AppendLine(" //加载完后卸载");
|
| | | sb.AppendLine(" foreach (var configType in configTypes)");
|
| | | sb.AppendLine(" {");
|
| | | sb.AppendLine(" methodInfo.Invoke(null, null);");
|
| | | sb.AppendLine(" var methodInfo = configType.GetMethod(\"ForceRelease\", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.FlattenHierarchy);");
|
| | | sb.AppendLine(" if (methodInfo != null)");
|
| | | sb.AppendLine(" {");
|
| | | sb.AppendLine(" methodInfo.Invoke(null, null);");
|
| | | sb.AppendLine(" }");
|
| | | sb.AppendLine(" }");
|
| | | sb.AppendLine(" }");
|
| | | sb.AppendLine("#endif");
|
| | |
| | | sb.AppendLine($" ClearConfigDictionary<{className}>();");
|
| | | }
|
| | | sb.AppendLine(" }");
|
| | | sb.AppendLine();
|
| | | sb.AppendLine("#if UNITY_EDITOR");
|
| | | sb.AppendLine(" [MenuItem(\"Tools/Config/自检\")]");
|
| | | sb.AppendLine(" public static void CheckAndGenerateFastConfig()");
|
| | | sb.AppendLine(" {");
|
| | | sb.AppendLine(" // 获取 Editor Assembly");
|
| | | sb.AppendLine(" var editorAsm = System.AppDomain.CurrentDomain.GetAssemblies()");
|
| | | sb.AppendLine(" .FirstOrDefault(a => a.FullName.Contains(\"Editor\"));");
|
| | | sb.AppendLine();
|
| | | sb.AppendLine(" if (editorAsm == null)");
|
| | | sb.AppendLine(" {");
|
| | | sb.AppendLine(" Debug.LogError(\"[自检] 未找到 Editor Assembly,无法自检。\");");
|
| | | sb.AppendLine(" return;");
|
| | | sb.AppendLine(" }");
|
| | | sb.AppendLine();
|
| | | sb.AppendLine(" // 反射获取 ConfigGenerater 类型");
|
| | | sb.AppendLine(" var configGeneraterType = editorAsm.GetType(\"ConfigGenerater\");");
|
| | | sb.AppendLine(" if (configGeneraterType == null)");
|
| | | sb.AppendLine(" {");
|
| | | sb.AppendLine(" Debug.LogError(\"[自检] 未找到 ConfigGenerater 类型。\");");
|
| | | sb.AppendLine(" return;");
|
| | | sb.AppendLine(" }");
|
| | | sb.AppendLine();
|
| | | sb.AppendLine(" // 调用 GetAllConfigClasses 静态方法");
|
| | | sb.AppendLine(" var getAllConfigClassesMethod = configGeneraterType.GetMethod(\"GetAllConfigClasses\", BindingFlags.Public | BindingFlags.Static);");
|
| | | sb.AppendLine(" var allConfigClasses = getAllConfigClassesMethod?.Invoke(null, null) as List<string>;");
|
| | | sb.AppendLine(" if (allConfigClasses == null)");
|
| | | sb.AppendLine(" {");
|
| | | sb.AppendLine(" Debug.LogError(\"[自检] 获取全部配置类失败。\");");
|
| | | sb.AppendLine(" return;");
|
| | | sb.AppendLine(" }");
|
| | | sb.AppendLine();
|
| | | sb.AppendLine(" // 获取 ExcludeClassList 字段");
|
| | | sb.AppendLine(" var excludeField = configGeneraterType.GetField(\"ExcludeClassList\", BindingFlags.Public | BindingFlags.Static);");
|
| | | sb.AppendLine(" var excludeClassList = excludeField?.GetValue(null) as List<string> ?? new List<string>();");
|
| | | sb.AppendLine();
|
| | | sb.AppendLine(" // 排除不需要的类");
|
| | | sb.AppendLine(" var checkClasses = allConfigClasses.Where(c => !excludeClassList.Contains(c)).ToList();");
|
| | | sb.AppendLine();
|
| | | sb.AppendLine(" List<string> fastName = new List<string>();");
|
| | | sb.AppendLine();
|
| | | sb.AppendLine(" foreach (var className in checkClasses)");
|
| | | sb.AppendLine(" {");
|
| | | sb.AppendLine(" // 这里也要用 Editor Assembly 获取类型");
|
| | | sb.AppendLine(" var configType = editorAsm.GetType(className) ?? Type.GetType(className);");
|
| | | sb.AppendLine(" if (configType == null)");
|
| | | sb.AppendLine(" {");
|
| | | sb.AppendLine(" Debug.LogWarning($\"[自检] 未找到类型: {className}\");");
|
| | | sb.AppendLine(" continue;");
|
| | | sb.AppendLine(" }");
|
| | | sb.AppendLine();
|
| | | sb.AppendLine(" var sw = System.Diagnostics.Stopwatch.StartNew();");
|
| | | sb.AppendLine();
|
| | | sb.AppendLine(" // 反射调用静态Init方法");
|
| | | sb.AppendLine(" string configName = configType.Name;");
|
| | | sb.AppendLine(" if (configName.EndsWith(\"Config\"))");
|
| | | sb.AppendLine(" configName = configName.Substring(0, configName.Length - 6);");
|
| | | sb.AppendLine();
|
| | | sb.AppendLine(" string[] texts = ResManager.Instance.LoadConfig(configName);");
|
| | | sb.AppendLine(" if (texts != null)");
|
| | | sb.AppendLine(" {");
|
| | | sb.AppendLine(" string[] lines = texts;");
|
| | | sb.AppendLine(" var methodInfo = configType.GetMethod(\"Init\", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.FlattenHierarchy);");
|
| | | sb.AppendLine(" if (methodInfo != null)");
|
| | | sb.AppendLine(" {");
|
| | | sb.AppendLine(" methodInfo.Invoke(null, new object[] { lines });");
|
| | | sb.AppendLine(" }");
|
| | | sb.AppendLine(" }");
|
| | | sb.AppendLine();
|
| | | sb.AppendLine(" sw.Stop();");
|
| | | sb.AppendLine();
|
| | | sb.AppendLine(" if (sw.ElapsedMilliseconds >= 100)");
|
| | | sb.AppendLine(" {");
|
| | | sb.AppendLine(" Debug.LogError($\"[自检] 加载配置 {configType.Name} 耗时较长: {sw.ElapsedMilliseconds} ms\");");
|
| | | sb.AppendLine(" }");
|
| | | sb.AppendLine(" else if (sw.ElapsedMilliseconds <= 5)");
|
| | | sb.AppendLine(" {");
|
| | | sb.AppendLine(" fastName.Add(configType.Name);");
|
| | | sb.AppendLine(" }");
|
| | | sb.AppendLine(" Debug.Log($\"[自检] 加载配置: {configType.Name} 用时: {sw.ElapsedMilliseconds} ms\");");
|
| | | sb.AppendLine(" }");
|
| | | sb.AppendLine();
|
| | | sb.AppendLine(" // 释放所有已加载的配置");
|
| | | sb.AppendLine(" foreach (var className in checkClasses)");
|
| | | sb.AppendLine(" {");
|
| | | sb.AppendLine(" var configType = editorAsm.GetType(className) ?? Type.GetType(className);");
|
| | | sb.AppendLine(" if (configType == null) continue;");
|
| | | sb.AppendLine(" var methodInfo = configType.GetMethod(\"ForceRelease\", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.FlattenHierarchy);");
|
| | | sb.AppendLine(" if (methodInfo != null)");
|
| | | sb.AppendLine(" {");
|
| | | sb.AppendLine(" methodInfo.Invoke(null, null);");
|
| | | sb.AppendLine(" }");
|
| | | sb.AppendLine(" }");
|
| | | sb.AppendLine();
|
| | | sb.AppendLine(" System.IO.File.WriteAllText(Application.dataPath + \"/fastConfig.txt\", string.Join(\"\\n\", fastName));");
|
| | | sb.AppendLine(" Debug.Log($\"[自检] fastConfig.txt 生成完毕,快速表有:{string.Join(\", \", fastName)}\");");
|
| | | sb.AppendLine(" }");
|
| | | sb.AppendLine("#endif");
|
| | | sb.AppendLine("}");
|
| | |
|
| | | return sb.ToString();
|