三国卡牌客户端基础资源仓库
yyl
2025-07-14 1566a91aadaaccad72c140dbcd38dd17dc0e5c0a
18 子 2D卡牌客户端搭建 / 2D卡牌客户端搭建 配置表问题
2个文件已修改
156 ■■■■ 已修改文件
Assets/Editor/ConfigGen/ConfigGenerater.cs 152 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Launch/Launch.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/ConfigGen/ConfigGenerater.cs
@@ -5,7 +5,6 @@
using System.Text;
using UnityEditor;
using UnityEngine;
using System.Linq;
/// <summary>
/// 配置生成器 - 用于自动生成配置管理器代码
@@ -16,7 +15,7 @@
    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",
@@ -71,7 +70,7 @@
    /// 获取所有配置类
    /// </summary>
    /// <returns>配置类名称列表</returns>
    private static List<string> GetAllConfigClasses()
    public static List<string> GetAllConfigClasses()
    {
        // 获取配置目录的完整路径
        string fullConfigsPath = Path.Combine(Application.dataPath, ConfigsPath.Replace("Assets/", ""));
@@ -145,7 +144,11 @@
        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("{");
@@ -175,8 +178,7 @@
        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]})");
@@ -186,7 +188,7 @@
        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)");
@@ -196,38 +198,50 @@
        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");
@@ -325,6 +339,104 @@
            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();
Assets/Launch/Launch.cs
@@ -14,6 +14,10 @@
public class Launch : MonoBehaviour
{
#if UNITY_EDITOR
    public bool isOpenConfigTesting = false;
#endif
    private static Assembly _hotUpdateAss;