三国卡牌客户端基础资源仓库
yyl
2025-05-08 777db9b445cf7e558a5e8659038bc21fd0edd220
Assets/Editor/ConfigGen/ConfigGenerater.cs
@@ -17,9 +17,9 @@
    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>
    /// 生成配置管理器菜单项
@@ -31,6 +31,13 @@
        {
            // 获取所有配置类
            List<string> configClasses = GetAllConfigClasses();
            // if (configClasses.Count == 0)
            // {
            //     Debug.LogWarning("未找到任何配置类!请确保配置类继承自ConfigBase<T>并位于正确的目录中。");
            //     return;
            // }
            // 生成配置管理器代码
            GenerateConfigManager(configClasses);
            
@@ -61,18 +68,26 @@
            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>
@@ -126,19 +141,69 @@
        
        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();
@@ -156,11 +221,18 @@
        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("    }");