Art_SubModule/Editor/Art_Tools/BatchImportSceneSprites.cs
2026-02-03 11:35:35 +08:00

500 lines
18 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// using UnityEngine;
// using UnityEditor;
// using System.IO;
// using System.Collections.Generic;
// using System.Linq;
// using ArtResource;
// namespace EditorArt_Tools
// {
// /// <summary>
// /// 批量导入场景Sprite资源到配置表
// /// </summary>
// public class BatchImportSceneSprites : EditorWindow
// {
// private const string SO_ROOT_PATH = "Assets/Art_SubModule/Art_SO/DecorateScene";
// private const string JSON_ROOT_PATH = "Assets/Art_SubModule/Art_Json/DecorateScene";
// private const string SPRITE_ROOT_PATH = "Assets/Art_SubModule/Art_Resource/Art_UISprites/Decorate";
// private const string MANIFEST_PATH = "Assets/Art_SubModule/Art_SO/art_table_manifest.json";
// private int startSceneIndex = 6;
// private int endSceneIndex = 50;
// private Vector2 scrollPosition;
// private List<ImportTask> importTasks = new List<ImportTask>();
// private bool isProcessing = false;
// private class ImportTask
// {
// public string SceneName;
// public string SoPath;
// public string SpriteFolderPath;
// public int SpriteCount;
// public bool FolderExists;
// public bool SoExists;
// public ImportStatus Status;
// }
// private enum ImportStatus
// {
// Pending,
// Success,
// Failed,
// Skipped
// }
// [MenuItem("美术工具/批量导入场景Sprite")]
// public static void ShowWindow()
// {
// var window = GetWindow<BatchImportSceneSprites>("批量导入场景Sprite");
// window.minSize = new Vector2(800, 600);
// window.Show();
// }
// private void OnEnable()
// {
// ScanTasks();
// }
// private void OnGUI()
// {
// EditorGUILayout.LabelField("批量导入场景Sprite资源", EditorStyles.boldLabel);
// EditorGUILayout.Space(10);
// EditorGUILayout.HelpBox(
// "此工具会自动扫描DecorateScene文件夹下的所有Scene配置表\n" +
// "并从对应的Sprite文件夹中批量导入所有sprite资源。",
// MessageType.Info);
// EditorGUILayout.Space(10);
// // 设置范围
// EditorGUILayout.BeginHorizontal();
// EditorGUI.BeginChangeCheck();
// startSceneIndex = EditorGUILayout.IntField("起始场景序号:", startSceneIndex, GUILayout.Width(200));
// endSceneIndex = EditorGUILayout.IntField("结束场景序号:", endSceneIndex, GUILayout.Width(200));
// if (EditorGUI.EndChangeCheck())
// {
// ScanTasks();
// }
// if (GUILayout.Button("刷新扫描", GUILayout.Width(100)))
// {
// ScanTasks();
// }
// EditorGUILayout.EndHorizontal();
// EditorGUILayout.Space(10);
// // 统计信息
// int validTasks = importTasks.Count(t => t.FolderExists && t.SoExists && t.SpriteCount > 0);
// int totalSprites = importTasks.Where(t => t.FolderExists && t.SoExists).Sum(t => t.SpriteCount);
// EditorGUILayout.BeginHorizontal("box");
// EditorGUILayout.LabelField($"找到配置表: {importTasks.Count(t => t.SoExists)} 个");
// EditorGUILayout.LabelField($"可导入任务: {validTasks} 个");
// EditorGUILayout.LabelField($"总Sprite数: {totalSprites} 个");
// EditorGUILayout.EndHorizontal();
// EditorGUILayout.Space(10);
// // 任务列表
// EditorGUILayout.LabelField("导入任务列表:", EditorStyles.boldLabel);
// scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition);
// foreach (var task in importTasks)
// {
// DrawTaskItem(task);
// }
// EditorGUILayout.EndScrollView();
// EditorGUILayout.Space(10);
// // 操作按钮
// GUI.enabled = !isProcessing && validTasks > 0;
// GUI.backgroundColor = Color.green;
// if (GUILayout.Button("开始批量导入", GUILayout.Height(40)))
// {
// StartBatchImport();
// }
// GUI.backgroundColor = Color.white;
// GUI.enabled = true;
// if (isProcessing)
// {
// EditorGUILayout.HelpBox("正在处理中,请稍候...", MessageType.Warning);
// }
// }
// private void DrawTaskItem(ImportTask task)
// {
// Color originalBg = GUI.backgroundColor;
// // 根据状态设置背景色
// switch (task.Status)
// {
// case ImportStatus.Success:
// GUI.backgroundColor = new Color(0.5f, 1f, 0.5f, 0.3f);
// break;
// case ImportStatus.Failed:
// GUI.backgroundColor = new Color(1f, 0.5f, 0.5f, 0.3f);
// break;
// case ImportStatus.Skipped:
// GUI.backgroundColor = new Color(1f, 1f, 0.5f, 0.3f);
// break;
// }
// EditorGUILayout.BeginVertical("box");
// GUI.backgroundColor = originalBg;
// EditorGUILayout.BeginHorizontal();
// // 状态图标
// string statusIcon = task.Status switch
// {
// ImportStatus.Success => "✔",
// ImportStatus.Failed => "✘",
// ImportStatus.Skipped => "⊘",
// _ => "○"
// };
// EditorGUILayout.LabelField(statusIcon, GUILayout.Width(20));
// // 场景名称
// EditorGUILayout.LabelField(task.SceneName, EditorStyles.boldLabel, GUILayout.Width(150));
// // SO状态
// if (task.SoExists)
// {
// GUI.color = Color.green;
// EditorGUILayout.LabelField("SO✔", GUILayout.Width(40));
// }
// else
// {
// GUI.color = Color.red;
// EditorGUILayout.LabelField("SO✘", GUILayout.Width(40));
// }
// GUI.color = Color.white;
// // 文件夹状态
// if (task.FolderExists)
// {
// GUI.color = Color.green;
// EditorGUILayout.LabelField($"文件夹✔ ({task.SpriteCount} sprites)", GUILayout.Width(150));
// }
// else
// {
// GUI.color = Color.red;
// EditorGUILayout.LabelField("文件夹✘", GUILayout.Width(150));
// }
// GUI.color = Color.white;
// GUILayout.FlexibleSpace();
// // 状态文本
// if (task.Status != ImportStatus.Pending)
// {
// EditorGUILayout.LabelField(task.Status.ToString(), GUILayout.Width(80));
// }
// EditorGUILayout.EndHorizontal();
// // 路径信息
// EditorGUI.indentLevel++;
// EditorGUILayout.LabelField($"SO: {task.SoPath}", EditorStyles.miniLabel);
// EditorGUILayout.LabelField($"Sprite: {task.SpriteFolderPath}", EditorStyles.miniLabel);
// EditorGUI.indentLevel--;
// EditorGUILayout.EndVertical();
// }
// private void ScanTasks()
// {
// importTasks.Clear();
// for (int i = startSceneIndex; i <= endSceneIndex; i++)
// {
// string sceneName = $"Scene{i}Resource";
// string soPath = $"{SO_ROOT_PATH}/{sceneName}.asset";
// string spriteFolderPath = $"{SPRITE_ROOT_PATH}/Scene{i}";
// var task = new ImportTask
// {
// SceneName = sceneName,
// SoPath = soPath,
// SpriteFolderPath = spriteFolderPath,
// SoExists = File.Exists(soPath),
// FolderExists = Directory.Exists(spriteFolderPath),
// Status = ImportStatus.Pending
// };
// // 统计Sprite数量
// if (task.FolderExists)
// {
// string[] guids = AssetDatabase.FindAssets("t:Sprite", new[] { spriteFolderPath });
// task.SpriteCount = guids.Length;
// }
// importTasks.Add(task);
// }
// Repaint();
// }
// private void StartBatchImport()
// {
// isProcessing = true;
// int successCount = 0;
// int failedCount = 0;
// int skippedCount = 0;
// int totalSpritesImported = 0;
// try
// {
// for (int i = 0; i < importTasks.Count; i++)
// {
// var task = importTasks[i];
// // 跳过无效任务
// if (!task.SoExists || !task.FolderExists || task.SpriteCount == 0)
// {
// task.Status = ImportStatus.Skipped;
// skippedCount++;
// continue;
// }
// // 显示进度
// float progress = (float)i / importTasks.Count;
// EditorUtility.DisplayProgressBar("批量导入", $"正在处理 {task.SceneName}...", progress);
// // 加载SO
// var table = AssetDatabase.LoadAssetAtPath<ArtTableSO>(task.SoPath);
// if (table == null)
// {
// Debug.LogError($"无法加载配置表: {task.SoPath}");
// task.Status = ImportStatus.Failed;
// failedCount++;
// continue;
// }
// // 获取所有Sprite
// string[] guids = AssetDatabase.FindAssets("t:Sprite", new[] { task.SpriteFolderPath });
// if (guids.Length == 0)
// {
// task.Status = ImportStatus.Skipped;
// skippedCount++;
// continue;
// }
// // 获取当前最大ID
// int startId = table.Items.Count > 0 ? table.Items.Max(item => item.Id) + 1 : 1;
// // 导入Sprite
// int importedCount = 0;
// foreach (string guid in guids)
// {
// string assetPath = AssetDatabase.GUIDToAssetPath(guid);
// Sprite sprite = AssetDatabase.LoadAssetAtPath<Sprite>(assetPath);
// if (sprite != null)
// {
// // 检查是否已存在同名资源
// if (table.Items.Any(item => item.Name == sprite.name))
// {
// Debug.LogWarning($"[{task.SceneName}] 跳过重复资源: {sprite.name}");
// continue;
// }
// var newItem = new ArtItemData
// {
// Id = startId + importedCount,
// Name = sprite.name,
// Desc = "",
// Sprite = sprite
// };
// table.Items.Add(newItem);
// importedCount++;
// }
// }
// if (importedCount > 0)
// {
// // 保存SO
// EditorUtility.SetDirty(table);
// AssetDatabase.SaveAssets();
// // 同步JSON
// SyncToJson(table);
// task.Status = ImportStatus.Success;
// successCount++;
// totalSpritesImported += importedCount;
// Debug.Log($"[{task.SceneName}] 成功导入 {importedCount} 个sprite资源");
// }
// else
// {
// task.Status = ImportStatus.Skipped;
// skippedCount++;
// }
// Repaint();
// }
// // 更新Manifest
// UpdateManifest();
// }
// finally
// {
// EditorUtility.ClearProgressBar();
// isProcessing = false;
// }
// // 显示结果
// string message = $"批量导入完成!\n\n" +
// $"✔ 成功: {successCount} 个配置表\n" +
// $"✘ 失败: {failedCount} 个\n" +
// $"⊘ 跳过: {skippedCount} 个\n" +
// $"📦 总共导入: {totalSpritesImported} 个sprite";
// EditorUtility.DisplayDialog("批量导入完成", message, "确定");
// Debug.Log($"[BatchImportSceneSprites] {message}");
// Repaint();
// }
// private void SyncToJson(ArtTableSO table)
// {
// string soPath = AssetDatabase.GetAssetPath(table);
// string relativePath = soPath.Replace(SO_ROOT_PATH, "").Replace(".asset", ".json");
// string jsonPath = JSON_ROOT_PATH + relativePath;
// // 确保目录存在
// string directory = Path.GetDirectoryName(jsonPath);
// if (!Directory.Exists(directory))
// {
// Directory.CreateDirectory(directory);
// }
// // 创建JSON数据
// var jsonData = new ArtTableJsonData
// {
// TableId = table.TableId,
// TableName = table.TableName,
// Items = table.Items.Select(item => new ArtItemJsonData
// {
// Id = item.Id,
// Name = item.Name,
// Desc = item.Desc,
// SpritePath = item.Sprite != null ? AssetDatabase.GetAssetPath(item.Sprite) : "",
// SpineAssetPath = item.SpineAsset != null ? AssetDatabase.GetAssetPath(item.SpineAsset) : "",
// SpineAnimName = item.SpineAnimName
// }).ToList()
// };
// string json = JsonUtility.ToJson(jsonData, true);
// File.WriteAllText(jsonPath, json);
// AssetDatabase.ImportAsset(jsonPath);
// }
// private void UpdateManifest()
// {
// try
// {
// // 查找所有ArtTableSO文件
// string[] guids = AssetDatabase.FindAssets("t:ArtTableSO", new[] { "Assets/Art_SubModule/Art_SO" });
// List<string> tablePaths = new List<string>();
// foreach (string guid in guids)
// {
// string path = AssetDatabase.GUIDToAssetPath(guid);
// if (!string.IsNullOrEmpty(path))
// {
// tablePaths.Add(path);
// }
// }
// // 排序路径
// tablePaths.Sort();
// // 创建或更新manifest
// ArtTableManifest manifest;
// // 如果文件存在,读取现有的预加载配置
// if (File.Exists(MANIFEST_PATH))
// {
// string existingJson = File.ReadAllText(MANIFEST_PATH);
// manifest = JsonUtility.FromJson<ArtTableManifest>(existingJson);
// if (manifest == null)
// {
// manifest = new ArtTableManifest();
// }
// if (manifest.preloadTableIds == null)
// {
// manifest.preloadTableIds = new int[0];
// }
// }
// else
// {
// manifest = new ArtTableManifest
// {
// preloadTableIds = new int[0]
// };
// }
// // 更新路径列表
// manifest.tablePaths = tablePaths.ToArray();
// // 序列化为JSON
// string json = JsonUtility.ToJson(manifest, true);
// // 确保目录存在
// string directory = Path.GetDirectoryName(MANIFEST_PATH);
// if (!Directory.Exists(directory))
// {
// Directory.CreateDirectory(directory);
// }
// // 写入文件
// File.WriteAllText(MANIFEST_PATH, json);
// AssetDatabase.ImportAsset(MANIFEST_PATH);
// Debug.Log($"[BatchImportSceneSprites] Manifest文件已更新: {MANIFEST_PATH}");
// }
// catch (System.Exception ex)
// {
// Debug.LogError($"[BatchImportSceneSprites] 更新Manifest文件失败: {ex.Message}");
// }
// }
// [System.Serializable]
// public class ArtTableManifest
// {
// public string[] tablePaths;
// public int[] preloadTableIds;
// }
// [System.Serializable]
// public class ArtTableJsonData
// {
// public int TableId;
// public string TableName;
// public List<ArtItemJsonData> Items;
// }
// [System.Serializable]
// public class ArtItemJsonData
// {
// public int Id;
// public string Name;
// public string Desc;
// public string SpritePath;
// public string SpineAssetPath;
// public string SpineAnimName;
// }
// }
// }