| | |
| | | private const string ConfigManagerPath = "Assets/Scripts/Main/Manager/ConfigManager.cs";
|
| | | private const string ConfigBasePattern = @"public\s+class\s+(\w+)\s*:\s*ConfigBase\s*<";
|
| | |
|
| | | // 正则表达式模式
|
| | | private static readonly Regex LoadConfigsRegex = new Regex(@"protected\s+async\s+UniTask\s+LoadConfigs\(\)\s*\{[^\}]*\}", RegexOptions.Compiled);
|
| | | private static readonly Regex ReleaseRegex = new Regex(@"public\s+override\s+void\s+Release\(\)\s*\{[^\}]*\}", RegexOptions.Compiled);
|
| | | // 正则表达式模式 - 更新以匹配新的ConfigManager结构
|
| | | private static readonly Regex LoadConfigsRegex = new Regex(@"protected\s+async\s+UniTask\s+LoadConfigs\(\)\s*\{[^\}]*\}", RegexOptions.Compiled | RegexOptions.Singleline);
|
| | | private static readonly Regex ReleaseRegex = new Regex(@"public\s+override\s+void\s+Release\(\)\s*\{[^\}]*\}", RegexOptions.Compiled | RegexOptions.Singleline);
|
| | |
|
| | | /// <summary>
|
| | | /// 生成配置管理器菜单项
|
| | |
| | | {
|
| | | // 获取所有配置类
|
| | | List<string> configClasses = GetAllConfigClasses();
|
| | | |
| | | // if (configClasses.Count == 0)
|
| | | // {
|
| | | // Debug.LogWarning("未找到任何配置类!请确保配置类继承自ConfigBase<T>并位于正确的目录中。");
|
| | | // return;
|
| | | // }
|
| | | |
| | | // 生成配置管理器代码
|
| | | GenerateConfigManager(configClasses);
|
| | |
|
| | |
| | | return new List<string>();
|
| | | }
|
| | |
|
| | | // 获取所有C#文件并解析配置类
|
| | | return Directory.GetFiles(fullConfigsPath, "*.cs", SearchOption.TopDirectoryOnly)
|
| | | .Select(file => new { |
| | | Path = file, |
| | | Content = File.ReadAllText(file) |
| | | })
|
| | | .Select(file => {
|
| | | Match match = Regex.Match(file.Content, ConfigBasePattern);
|
| | | return match.Success ? match.Groups[1].Value : null;
|
| | | })
|
| | | .Where(className => !string.IsNullOrEmpty(className))
|
| | | .ToList();
|
| | | try
|
| | | {
|
| | | // 获取所有C#文件并解析配置类
|
| | | return Directory.GetFiles(fullConfigsPath, "*.cs", SearchOption.TopDirectoryOnly)
|
| | | .Select(file => new { |
| | | Path = file, |
| | | Content = File.ReadAllText(file) |
| | | })
|
| | | .Select(file => {
|
| | | Match match = Regex.Match(file.Content, ConfigBasePattern);
|
| | | return match.Success ? match.Groups[1].Value : null;
|
| | | })
|
| | | .Where(className => !string.IsNullOrEmpty(className))
|
| | | .ToList();
|
| | | }
|
| | | catch (Exception ex)
|
| | | {
|
| | | Debug.LogError($"扫描配置类时发生错误: {ex.Message}");
|
| | | return new List<string>();
|
| | | }
|
| | | }
|
| | |
|
| | | /// <summary>
|
| | |
| | |
|
| | | sb.AppendLine("protected async UniTask LoadConfigs()");
|
| | | sb.AppendLine(" {");
|
| | | sb.AppendLine(" loadingProgress = 0f;");
|
| | | sb.AppendLine(" isLoadFinished = false;");
|
| | | sb.AppendLine();
|
| | | sb.AppendLine(" // 加载配置文件");
|
| | |
|
| | | // 为每个配置类生成加载代码
|
| | | foreach (string className in configClasses)
|
| | | // 如果有配置类,添加进度跟踪代码
|
| | | if (configClasses.Count > 0)
|
| | | {
|
| | | sb.AppendLine($" await LoadConfig<{className}>();");
|
| | | sb.AppendLine($" int totalConfigs = {configClasses.Count};");
|
| | | |
| | | // 方法1:使用数组和循环加载配置
|
| | | 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(" }");
|
| | | }
|
| | |
|
| | | sb.AppendLine();
|
| | | sb.AppendLine(" // 加载完成后设置isLoadFinished为true");
|
| | | sb.AppendLine(" loadingProgress = 1f;");
|
| | | sb.AppendLine(" isLoadFinished = true;");
|
| | | sb.AppendLine(" }");
|
| | | |
| | | // 添加LoadConfigByType方法
|
| | | sb.AppendLine();
|
| | | sb.AppendLine(" private async UniTask LoadConfigByType(Type configType)");
|
| | | sb.AppendLine(" {");
|
| | | sb.AppendLine(" string configName = configType.Name;");
|
| | | sb.AppendLine(" TextAsset textAsset = await ResManager.Instance.LoadAsset<TextAsset>(\"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);");
|
| | | 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(" }");
|
| | |
|
| | | return sb.ToString();
|
| | |
| | | sb.AppendLine("public override void Release()");
|
| | | sb.AppendLine(" {");
|
| | |
|
| | | foreach (string className in configClasses)
|
| | | if (configClasses.Count > 0)
|
| | | {
|
| | | // 清空字典
|
| | | sb.AppendLine($" // 清空 {className} 字典");
|
| | | sb.AppendLine($" ClearConfigDictionary<{className}>();");
|
| | | foreach (string className in configClasses)
|
| | | {
|
| | | // 清空字典
|
| | | sb.AppendLine($" // 清空 {className} 字典");
|
| | | sb.AppendLine($" ClearConfigDictionary<{className}>();");
|
| | | }
|
| | | }
|
| | | else
|
| | | {
|
| | | sb.AppendLine(" // 没有找到配置类");
|
| | | }
|
| | |
|
| | | sb.AppendLine(" }");
|