using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using UnityEditor; using UnityEngine; using System.Linq; /// /// 配置生成器 - 用于自动生成配置管理器代码 /// public static class ConfigGenerater { // 常量定义 private const string ConfigsPath = "Assets/Scripts/Main/Config/Configs"; private const string ConfigManagerPath = "Assets/Scripts/Main/Config/ConfigManager.cs"; private static List ExcludeClassList = new List() { "InitialFunctionConfig", "PriorLanguageConfig", }; [MenuItem("Tools/手动刷新")] public static void Refresh() { AssetDatabase.Refresh(); } /// /// 生成配置管理器菜单项 /// [MenuItem("Tools/生成配置管理器")] public static void Generate() { try { // 获取所有配置类 List configClasses = GetAllConfigClasses(); configClasses = new List(configClasses.Where(config => !ExcludeClassList.Contains(config))); // 生成配置管理器代码 GenerateConfigManager(configClasses); Debug.Log($"配置管理器生成完成,共找到 {configClasses.Count} 个配置类: {string.Join(", ", configClasses)}"); // 刷新资源 AssetDatabase.Refresh(); } catch (Exception ex) { Debug.LogError($"生成配置管理器时发生错误: {ex.Message}\n{ex.StackTrace}"); } } /// /// 获取所有配置类 /// /// 配置类名称列表 private static List GetAllConfigClasses() { // 获取配置目录的完整路径 string fullConfigsPath = Path.Combine(Application.dataPath, ConfigsPath.Replace("Assets/", "")); // 检查目录是否存在 if (!Directory.Exists(fullConfigsPath)) { Debug.LogError($"配置目录不存在: {fullConfigsPath}"); return new List(); } try { List configClasses = new List(); // 获取所有C#文件 string[] files = Directory.GetFiles(fullConfigsPath, "*.cs", SearchOption.TopDirectoryOnly); for (int i = 0; i < files.Length; i++) { string file = files[i]; configClasses.Add(Path.GetFileNameWithoutExtension(file)); } return configClasses; } catch (Exception ex) { Debug.LogError($"扫描配置类时发生错误: {ex.Message}"); return new List(); } } /// /// 生成配置管理器代码 /// /// 配置类列表 private static void GenerateConfigManager(List configClasses) { // 获取配置管理器的完整路径 string fullConfigManagerPath = Path.Combine(Application.dataPath, ConfigManagerPath.Replace("Assets/", "")); try { // 生成完整的配置管理器代码 string configManagerCode = GenerateFullConfigManagerCode(configClasses); // 写入文件 File.WriteAllText(fullConfigManagerPath, configManagerCode); Debug.Log($"成功生成配置管理器: {fullConfigManagerPath}"); } catch (Exception ex) { Debug.LogError($"生成配置管理器文件时发生错误: {ex.Message}"); } } /// /// 生成完整的配置管理器代码 /// /// 配置类列表 /// 完整的配置管理器代码 private static string GenerateFullConfigManagerCode(List configClasses) { StringBuilder sb = new StringBuilder(); // 添加命名空间引用 sb.AppendLine("using System;"); sb.AppendLine("using System.Collections.Generic;"); sb.AppendLine("using UnityEngine;"); sb.AppendLine("using Cysharp.Threading.Tasks;"); sb.AppendLine("using System.Reflection;"); sb.AppendLine(); sb.AppendLine(); sb.AppendLine("public class ConfigManager : ManagerBase"); sb.AppendLine("{"); // 添加属性和字段 sb.AppendLine(" public bool isLoadFinished"); sb.AppendLine(" {"); sb.AppendLine(" get;"); sb.AppendLine(" private set;"); sb.AppendLine(" }"); sb.AppendLine(); sb.AppendLine(" private float loadingProgress = 0f;"); sb.AppendLine(); // 添加初始化方法 sb.AppendLine(" public override void Init()"); sb.AppendLine(" {"); sb.AppendLine(" base.Init();"); sb.AppendLine(" InitConfigs();"); sb.AppendLine(" }"); sb.AppendLine(); // 添加配置初始化方法 sb.AppendLine(" public virtual async UniTask InitConfigs()"); sb.AppendLine(" {"); sb.AppendLine(" // 加载配置文件"); sb.AppendLine(" await LoadConfigs();"); sb.AppendLine(" }"); sb.AppendLine(); // 添加LoadConfigs方法 sb.AppendLine(" protected async UniTask LoadConfigs()"); sb.AppendLine(" {"); sb.AppendLine(" loadingProgress = 0f;"); sb.AppendLine(" isLoadFinished = false;"); sb.AppendLine(); sb.AppendLine(" // 加载配置文件"); // 如果有配置类,添加进度跟踪代码 if (configClasses.Count > 0) { sb.AppendLine($" int totalConfigs = {configClasses.Count};"); // 使用数组和循环加载配置 sb.AppendLine(" Type[] configTypes = new Type[] {"); for (int i = 0; i < configClasses.Count; i++) { sb.Append($" typeof({configClasses[i]})"); sb.AppendLine(i < configClasses.Count - 1 ? "," : ""); } sb.AppendLine(" };"); sb.AppendLine(); sb.AppendLine(" // 逐个加载配置并更新进度"); sb.AppendLine(" for (int i = 0; i < configTypes.Length; i++)"); sb.AppendLine(" {"); sb.AppendLine(" await LoadConfigByType(configTypes[i]);"); sb.AppendLine(" loadingProgress = (float)(i + 1) / totalConfigs;"); sb.AppendLine(" }"); } else { Debug.LogError("没有找到配置类 : " + configClasses.Count); } sb.AppendLine(); sb.AppendLine(" // 加载完成后设置isLoadFinished为true"); sb.AppendLine(" loadingProgress = 1f;"); sb.AppendLine(" isLoadFinished = true;"); sb.AppendLine(" }"); sb.AppendLine(); // 添加LoadConfigByType方法 sb.AppendLine(" public async UniTask LoadConfigByType(Type configType)"); sb.AppendLine(" {"); sb.AppendLine(" string configName = configType.Name;"); sb.AppendLine(" if (configName.EndsWith(\"Config\"))"); sb.AppendLine(" {"); sb.AppendLine(" configName = configName.Substring(0, configName.Length - 6);"); sb.AppendLine(" }"); sb.AppendLine(" TextAsset textAsset = ResManager.Instance.LoadAsset(\"Config\", configName);"); sb.AppendLine(" if (textAsset != null)"); sb.AppendLine(" {"); sb.AppendLine(" string[] lines = textAsset.text.Split('\\n');"); 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(" var isInitField = configType.GetField(\"isInit\", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static);"); sb.AppendLine(" if (isInitField != null)"); sb.AppendLine(" {"); sb.AppendLine(" isInitField.SetValue(null, true);"); sb.AppendLine(" }"); sb.AppendLine(" Debug.Log($\"加载配置: {configType.Name} 成功\");"); sb.AppendLine(" }"); sb.AppendLine(" else"); sb.AppendLine(" {"); sb.AppendLine(" Debug.LogError($\"配置类 {configType.Name} 没有静态Init方法\");"); sb.AppendLine(" }"); sb.AppendLine(" }"); sb.AppendLine(" else"); sb.AppendLine(" {"); sb.AppendLine(" Debug.LogError($\"找不到配置文件: {configName}\");"); sb.AppendLine(" }"); sb.AppendLine(" }"); sb.AppendLine(); // 添加泛型LoadConfig方法 sb.AppendLine(" private async UniTask LoadConfig() where T : class"); sb.AppendLine(" {"); sb.AppendLine(" string configName = typeof(T).Name;"); sb.AppendLine(); sb.AppendLine(" TextAsset textAsset = ResManager.Instance.LoadAsset(\"Config\", configName);"); sb.AppendLine(" if (textAsset != null)"); sb.AppendLine(" {"); sb.AppendLine(" string[] lines = textAsset.text.Split('\\n');"); sb.AppendLine(" var methodInfo = typeof(T).GetMethod(\"Init\", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static);"); sb.AppendLine(" if (methodInfo != null)"); sb.AppendLine(" {"); sb.AppendLine(" methodInfo.Invoke(null, lines);"); sb.AppendLine(" // 设置初始化标志"); sb.AppendLine(" var isInitField = typeof(T).GetField(\"isInit\", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static);"); sb.AppendLine(" if (isInitField != null)"); sb.AppendLine(" {"); sb.AppendLine(" isInitField.SetValue(null, true);"); sb.AppendLine(" }"); sb.AppendLine(" Debug.Log($\"加载配置: {typeof(T).Name} 成功\");"); sb.AppendLine(" }"); sb.AppendLine(" else"); sb.AppendLine(" {"); sb.AppendLine(" Debug.LogError($\"配置类 {typeof(T).Name} 没有静态Init方法\");"); sb.AppendLine(" }"); sb.AppendLine(" }"); sb.AppendLine(" else"); sb.AppendLine(" {"); sb.AppendLine(" Debug.LogError($\"找不到配置文件: {configName}\");"); sb.AppendLine(" }"); sb.AppendLine(" }"); sb.AppendLine(); // 添加GetLoadingProgress方法 sb.AppendLine(" public float GetLoadingProgress()"); sb.AppendLine(" {"); sb.AppendLine(" return loadingProgress;"); sb.AppendLine(" }"); sb.AppendLine(); // 添加ClearConfigDictionary方法 sb.AppendLine(" private void ClearConfigDictionary() where T : class"); sb.AppendLine(" {"); sb.AppendLine(" // 重置 T 初始化状态"); sb.AppendLine(" var isInitField = typeof(T).GetField(\"isInit\", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static);"); sb.AppendLine(" if (isInitField != null)"); sb.AppendLine(" {"); sb.AppendLine(" isInitField.SetValue(null, false);"); sb.AppendLine(" }"); sb.AppendLine(" }"); sb.AppendLine(); // 添加Release方法 sb.AppendLine(" public override void Release()"); sb.AppendLine(" {"); if (configClasses.Count > 0) { foreach (string className in configClasses) { // 清空字典 sb.AppendLine($" // 清空 {className} 字典"); sb.AppendLine($" ClearConfigDictionary<{className}>();"); } } else { sb.AppendLine(" // 没有找到配置类"); } sb.AppendLine(" }"); // 结束类定义 sb.AppendLine("}"); return sb.ToString(); } }