using UnityEditor; using UnityEngine; namespace EditorArt_Tools { /// /// 美术资源Thrift工具菜单 /// public class ArtResourceThriftMenu { [MenuItem("美术工具/Thrift/批量生成所有Bytes文件", priority = 100)] public static void GenerateAllBytesFiles() { if (!EditorUtility.DisplayDialog("生成Bytes文件", "此操作将:\n" + "1. 扫描所有SO表,生成 ArtResourceConfig.bytes\n" + "2. 读取图集配置,生成 ArtAtlasConfig.bytes\n\n" + "确定继续?", "确定", "取消")) { return; } var startTime = System.Diagnostics.Stopwatch.StartNew(); try { // 强制保存所有资源 AssetDatabase.SaveAssets(); // 生成ArtResourceConfig.bytes Debug.Log("========== 开始生成 ArtResourceConfig.bytes =========="); GenerateArtResourceConfigBytes(); // 生成ArtAtlasConfig.bytes Debug.Log("========== 开始生成 ArtAtlasConfig.bytes =========="); GenerateAtlasConfigBytes(); // 刷新资源 AssetDatabase.Refresh(); startTime.Stop(); string message = $"✅ 所有Bytes文件生成完成!\n\n" + $"总耗时: {startTime.ElapsedMilliseconds} ms\n\n" + $"生成文件:\n" + $"• Assets/Art_SubModule/Art_Bytes/ArtResourceConfig.bytes\n" + $"• Assets/Art_SubModule/Art_Bytes/ArtAtlasConfig.bytes"; Debug.Log($"[ArtResourceThriftMenu] {message}"); EditorUtility.DisplayDialog("生成完成", message, "确定"); } catch (System.Exception ex) { startTime.Stop(); string errorMsg = $"❌ 生成失败: {ex.Message}\n\n{ex.StackTrace}"; Debug.LogError($"[ArtResourceThriftMenu] {errorMsg}"); EditorUtility.DisplayDialog("生成失败", errorMsg, "确定"); } } private static void GenerateArtResourceConfigBytes() { // 直接调用ArtResourceConfigEditor的静态方法(需要添加) // 或者模拟其逻辑 var editor = EditorWindow.GetWindow(); if (editor != null) { // 通过反射调用私有方法 var method = typeof(ArtResourceConfigEditor).GetMethod("GenerateMergedThriftBytes", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); if (method != null) { method.Invoke(editor, null); } editor.Close(); } } private static void GenerateAtlasConfigBytes() { // 直接调用AtlasBuilderEditor的静态方法(需要添加) var editor = EditorWindow.GetWindow(); if (editor != null) { // 通过反射调用私有方法 var method = typeof(ArtTools.AtlasBuilderEditor).GetMethod("SaveConfigToThriftBytes", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); if (method != null) { method.Invoke(editor, null); } editor.Close(); } } [MenuItem("美术工具/Thrift/测试加载Bytes文件", priority = 101)] public static void TestLoadBytesFiles() { Debug.Log("========== 测试加载Bytes文件 =========="); // 测试ArtResourceConfig TestLoadArtResourceConfig(); // 测试AtlasConfig TestLoadAtlasConfig(); EditorUtility.DisplayDialog("测试完成", "请查看Console日志", "确定"); } private static void TestLoadArtResourceConfig() { const string path = "Assets/Art_SubModule/Art_Bytes/ArtResourceConfig.bytes"; var textAsset = AssetDatabase.LoadAssetAtPath(path); if (textAsset == null) { Debug.LogError($"❌ 文件不存在: {path}"); return; } try { var config = new Byway.Thrift.Data.ArtResourceConfig(); using (var transport = new Thrift.Transport.Client.TMemoryBufferTransport(textAsset.bytes, new Thrift.TConfiguration())) { using (var protocol = new Thrift.Protocol.TBinaryProtocol(transport)) { config.ReadAsync(protocol, System.Threading.CancellationToken.None).GetAwaiter().GetResult(); } } Debug.Log($"✅ ArtResourceConfig.bytes 加载成功!\n" + $" 表数量: {config.Tables.Count}\n" + $" 版本: {config.Version}\n" + $" 生成时间: {config.GenerateTime}"); foreach (var table in config.Tables) { Debug.Log($" 表: {table.TableName} (ID: {table.TableId}, Items: {table.Items.Count})"); } } catch (System.Exception ex) { Debug.LogError($"❌ 加载失败: {ex.Message}\n{ex.StackTrace}"); } } private static void TestLoadAtlasConfig() { const string path = "Assets/Art_SubModule/Art_Bytes/ArtAtlasConfig.bytes"; var textAsset = AssetDatabase.LoadAssetAtPath(path); if (textAsset == null) { Debug.LogError($"❌ 文件不存在: {path}"); return; } try { var config = new Byway.Thrift.Data.ArtAtlasConfig(); using (var transport = new Thrift.Transport.Client.TMemoryBufferTransport(textAsset.bytes, new Thrift.TConfiguration())) { using (var protocol = new Thrift.Protocol.TBinaryProtocol(transport)) { config.ReadAsync(protocol, System.Threading.CancellationToken.None).GetAwaiter().GetResult(); } } Debug.Log($"✅ ArtAtlasConfig.bytes 加载成功!\n" + $" 图集数量: {config.Atlases.Count}\n" + $" 版本: {config.Version}\n" + $" 生成时间: {config.GenerateTime}"); foreach (var atlas in config.Atlases) { Debug.Log($" 图集: {atlas.Name} (Sprites: {atlas.SpritePaths.Count})"); } } catch (System.Exception ex) { Debug.LogError($"❌ 加载失败: {ex.Message}\n{ex.StackTrace}"); } } } }